|
@@ -96,13 +96,15 @@ void WebFrameMain::Destroyed() {
|
|
|
void WebFrameMain::MarkRenderFrameDisposed() {
|
|
|
render_frame_ = nullptr;
|
|
|
render_frame_disposed_ = true;
|
|
|
+ TeardownMojoConnection();
|
|
|
}
|
|
|
|
|
|
void WebFrameMain::UpdateRenderFrameHost(content::RenderFrameHost* rfh) {
|
|
|
// Should only be called when swapping frames.
|
|
|
render_frame_disposed_ = false;
|
|
|
render_frame_ = rfh;
|
|
|
- renderer_api_.reset();
|
|
|
+ TeardownMojoConnection();
|
|
|
+ MaybeSetupMojoConnection();
|
|
|
}
|
|
|
|
|
|
bool WebFrameMain::CheckRenderFrame() const {
|
|
@@ -182,20 +184,30 @@ void WebFrameMain::Send(v8::Isolate* isolate,
|
|
|
}
|
|
|
|
|
|
const mojo::Remote<mojom::ElectronRenderer>& WebFrameMain::GetRendererApi() {
|
|
|
+ MaybeSetupMojoConnection();
|
|
|
+ return renderer_api_;
|
|
|
+}
|
|
|
+
|
|
|
+void WebFrameMain::MaybeSetupMojoConnection() {
|
|
|
if (!renderer_api_) {
|
|
|
pending_receiver_ = renderer_api_.BindNewPipeAndPassReceiver();
|
|
|
- if (render_frame_->IsRenderFrameCreated()) {
|
|
|
- render_frame_->GetRemoteInterfaces()->GetInterface(
|
|
|
- std::move(pending_receiver_));
|
|
|
- }
|
|
|
renderer_api_.set_disconnect_handler(base::BindOnce(
|
|
|
&WebFrameMain::OnRendererConnectionError, weak_factory_.GetWeakPtr()));
|
|
|
}
|
|
|
- return renderer_api_;
|
|
|
+ // Wait for RenderFrame to be created in renderer before accessing remote.
|
|
|
+ if (pending_receiver_ && render_frame_->IsRenderFrameCreated()) {
|
|
|
+ render_frame_->GetRemoteInterfaces()->GetInterface(
|
|
|
+ std::move(pending_receiver_));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-void WebFrameMain::OnRendererConnectionError() {
|
|
|
+void WebFrameMain::TeardownMojoConnection() {
|
|
|
renderer_api_.reset();
|
|
|
+ pending_receiver_.reset();
|
|
|
+}
|
|
|
+
|
|
|
+void WebFrameMain::OnRendererConnectionError() {
|
|
|
+ TeardownMojoConnection();
|
|
|
}
|
|
|
|
|
|
void WebFrameMain::PostMessage(v8::Isolate* isolate,
|
|
@@ -315,13 +327,6 @@ std::vector<content::RenderFrameHost*> WebFrameMain::FramesInSubtree() const {
|
|
|
return frame_hosts;
|
|
|
}
|
|
|
|
|
|
-void WebFrameMain::Connect() {
|
|
|
- if (pending_receiver_) {
|
|
|
- render_frame_->GetRemoteInterfaces()->GetInterface(
|
|
|
- std::move(pending_receiver_));
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
void WebFrameMain::DOMContentLoaded() {
|
|
|
Emit("dom-ready");
|
|
|
}
|