diff --git a/atom/renderer/atom_render_view_observer.cc b/atom/renderer/atom_render_view_observer.cc index 4f8fa750ae4b..cc87f10b6b21 100644 --- a/atom/renderer/atom_render_view_observer.cc +++ b/atom/renderer/atom_render_view_observer.cc @@ -25,6 +25,7 @@ #include "net/grit/net_resources.h" #include "third_party/WebKit/public/web/WebDocument.h" #include "third_party/WebKit/public/web/WebDraggableRegion.h" +#include "third_party/WebKit/public/web/WebElement.h" #include "third_party/WebKit/public/web/WebFrame.h" #include "third_party/WebKit/public/web/WebKit.h" #include "third_party/WebKit/public/web/WebLocalFrame.h" @@ -75,8 +76,7 @@ AtomRenderViewObserver::AtomRenderViewObserver( content::RenderView* render_view, AtomRendererClient* renderer_client) : content::RenderViewObserver(render_view), - renderer_client_(renderer_client), - document_created_(false) { + renderer_client_(renderer_client) { // Initialise resource for directory listing. net::NetModule::SetResourceProvider(NetResourceProvider); } @@ -113,11 +113,6 @@ void AtomRenderViewObserver::EmitIPCEvent(blink::WebFrame* frame, } } -void AtomRenderViewObserver::DidCreateDocumentElement( - blink::WebLocalFrame* frame) { - document_created_ = true; -} - void AtomRenderViewObserver::DraggableRegionsChanged(blink::WebFrame* frame) { blink::WebVector webregions = frame->GetDocument().DraggableRegions(); @@ -150,9 +145,6 @@ void AtomRenderViewObserver::OnDestruct() { void AtomRenderViewObserver::OnBrowserMessage(bool send_to_all, const base::string16& channel, const base::ListValue& args) { - if (!document_created_) - return; - if (!render_view()->GetWebView()) return; @@ -160,6 +152,17 @@ void AtomRenderViewObserver::OnBrowserMessage(bool send_to_all, if (!frame || frame->IsWebRemoteFrame()) return; + // Don't handle browser messages before document element is created. + // When we receive a message from the browser, we try to transfer it + // to a web page, and when we do that Blink creates an empty + // document element if it hasn't been created yet, and it makes our init + // script to run while `window.location` is still "about:blank". + blink::WebDocument document = frame->GetDocument(); + blink::WebElement html_element = document.DocumentElement(); + if (html_element.IsNull()) { + return; + } + EmitIPCEvent(frame, channel, args); // Also send the message to all sub-frames. diff --git a/atom/renderer/atom_render_view_observer.h b/atom/renderer/atom_render_view_observer.h index 4751db2d8c6c..7c15cb8960bf 100644 --- a/atom/renderer/atom_render_view_observer.h +++ b/atom/renderer/atom_render_view_observer.h @@ -31,7 +31,6 @@ class AtomRenderViewObserver : public content::RenderViewObserver { private: // content::RenderViewObserver implementation. - void DidCreateDocumentElement(blink::WebLocalFrame* frame) override; void DraggableRegionsChanged(blink::WebFrame* frame) override; bool OnMessageReceived(const IPC::Message& message) override; void OnDestruct() override; @@ -44,9 +43,6 @@ class AtomRenderViewObserver : public content::RenderViewObserver { AtomRendererClient* renderer_client_; - // Whether the document object has been created. - bool document_created_; - DISALLOW_COPY_AND_ASSIGN(AtomRenderViewObserver); };