feat: add 'dom-ready' event to WebFrameMain (#29290)
This commit is contained in:
parent
49e62f1261
commit
4d89174b41
12 changed files with 261 additions and 11 deletions
|
@ -1393,6 +1393,29 @@ void WebContents::HandleNewRenderFrame(
|
|||
void WebContents::RenderFrameCreated(
|
||||
content::RenderFrameHost* render_frame_host) {
|
||||
HandleNewRenderFrame(render_frame_host);
|
||||
|
||||
// RenderFrameCreated is called for speculative frames which may not be
|
||||
// used in certain cross-origin navigations. Invoking
|
||||
// RenderFrameHost::GetLifecycleState currently crashes when called for
|
||||
// speculative frames so we need to filter it out for now. Check
|
||||
// https://crbug.com/1183639 for details on when this can be removed.
|
||||
auto* rfh_impl =
|
||||
static_cast<content::RenderFrameHostImpl*>(render_frame_host);
|
||||
if (rfh_impl->lifecycle_state() ==
|
||||
content::RenderFrameHostImpl::LifecycleStateImpl::kSpeculative) {
|
||||
return;
|
||||
}
|
||||
|
||||
content::RenderFrameHost::LifecycleState lifecycle_state =
|
||||
render_frame_host->GetLifecycleState();
|
||||
if (lifecycle_state == content::RenderFrameHost::LifecycleState::kActive) {
|
||||
v8::Isolate* isolate = JavascriptEnvironment::GetIsolate();
|
||||
v8::HandleScope handle_scope(isolate);
|
||||
gin_helper::Dictionary details =
|
||||
gin_helper::Dictionary::CreateEmpty(isolate);
|
||||
details.SetGetter("frame", render_frame_host);
|
||||
Emit("frame-created", details);
|
||||
}
|
||||
}
|
||||
|
||||
void WebContents::RenderFrameDeleted(
|
||||
|
@ -1419,12 +1442,11 @@ void WebContents::RenderFrameHostChanged(content::RenderFrameHost* old_host,
|
|||
// If an instance of WebFrameMain exists, it will need to have its RFH
|
||||
// swapped as well.
|
||||
//
|
||||
// |old_host| can be a nullptr in so we use |new_host| for looking up the
|
||||
// |old_host| can be a nullptr so we use |new_host| for looking up the
|
||||
// WebFrameMain instance.
|
||||
auto* web_frame =
|
||||
WebFrameMain::FromFrameTreeNodeId(new_host->GetFrameTreeNodeId());
|
||||
if (web_frame) {
|
||||
CHECK_EQ(web_frame->render_frame_host(), old_host);
|
||||
web_frame->UpdateRenderFrameHost(new_host);
|
||||
}
|
||||
}
|
||||
|
@ -1504,6 +1526,10 @@ void WebContents::DidAcquireFullscreen(content::RenderFrameHost* rfh) {
|
|||
|
||||
void WebContents::DOMContentLoaded(
|
||||
content::RenderFrameHost* render_frame_host) {
|
||||
auto* web_frame = WebFrameMain::FromRenderFrameHost(render_frame_host);
|
||||
if (web_frame)
|
||||
web_frame->DOMContentLoaded();
|
||||
|
||||
if (!render_frame_host->GetParent())
|
||||
Emit("dom-ready");
|
||||
}
|
||||
|
|
|
@ -317,6 +317,10 @@ void WebFrameMain::Connect() {
|
|||
}
|
||||
}
|
||||
|
||||
void WebFrameMain::DOMContentLoaded() {
|
||||
Emit("dom-ready");
|
||||
}
|
||||
|
||||
// static
|
||||
gin::Handle<WebFrameMain> WebFrameMain::New(v8::Isolate* isolate) {
|
||||
return gin::Handle<WebFrameMain>();
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include "gin/handle.h"
|
||||
#include "gin/wrappable.h"
|
||||
#include "mojo/public/cpp/bindings/remote.h"
|
||||
#include "shell/browser/event_emitter_mixin.h"
|
||||
#include "shell/common/gin_helper/constructible.h"
|
||||
#include "shell/common/gin_helper/pinnable.h"
|
||||
#include "third_party/blink/public/mojom/page/page_visibility_state.mojom-forward.h"
|
||||
|
@ -35,6 +36,7 @@ class WebContents;
|
|||
|
||||
// Bindings for accessing frames from the main process.
|
||||
class WebFrameMain : public gin::Wrappable<WebFrameMain>,
|
||||
public gin_helper::EventEmitterMixin<WebFrameMain>,
|
||||
public gin_helper::Pinnable<WebFrameMain>,
|
||||
public gin_helper::Constructible<WebFrameMain> {
|
||||
public:
|
||||
|
@ -80,7 +82,6 @@ class WebFrameMain : public gin::Wrappable<WebFrameMain>,
|
|||
// WebFrameMain can outlive its RenderFrameHost pointer so we need to check
|
||||
// whether its been disposed of prior to accessing it.
|
||||
bool CheckRenderFrame() const;
|
||||
void Connect();
|
||||
|
||||
v8::Local<v8::Promise> ExecuteJavaScript(gin::Arguments* args,
|
||||
const std::u16string& code);
|
||||
|
@ -108,6 +109,8 @@ class WebFrameMain : public gin::Wrappable<WebFrameMain>,
|
|||
std::vector<content::RenderFrameHost*> FramesInSubtree() const;
|
||||
|
||||
void OnRendererConnectionError();
|
||||
void Connect();
|
||||
void DOMContentLoaded();
|
||||
|
||||
mojo::Remote<mojom::ElectronRenderer> renderer_api_;
|
||||
mojo::PendingReceiver<mojom::ElectronRenderer> pending_receiver_;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue