diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 26d6200e9a61..183bfdee3bb1 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -806,8 +806,10 @@ void WebContents::DidChangeThemeColor(SkColor theme_color) { void WebContents::DocumentLoadedInFrame( content::RenderFrameHost* render_frame_host) { - if (!render_frame_host->GetParent()) + if (!render_frame_host->GetParent()) { + is_dom_ready_ = true; Emit("dom-ready"); + } } void WebContents::DidFinishLoad(content::RenderFrameHost* render_frame_host, @@ -834,6 +836,7 @@ void WebContents::DidFailLoad(content::RenderFrameHost* render_frame_host, } void WebContents::DidStartLoading() { + is_dom_ready_ = false; Emit("did-start-loading"); } @@ -1407,6 +1410,10 @@ bool WebContents::IsAudioMuted() { return web_contents()->IsAudioMuted(); } +bool WebContents::IsDOMReady() const { + return is_dom_ready_; +} + void WebContents::Print(mate::Arguments* args) { PrintSettings settings = {false, false, base::string16()}; if (args->Length() >= 1 && !args->GetNext(&settings)) { @@ -2002,6 +2009,7 @@ void WebContents::BuildPrototype(v8::Isolate* isolate, .SetMethod("setIgnoreMenuShortcuts", &WebContents::SetIgnoreMenuShortcuts) .SetMethod("setAudioMuted", &WebContents::SetAudioMuted) .SetMethod("isAudioMuted", &WebContents::IsAudioMuted) + .SetMethod("isDomReady", &WebContents::IsDOMReady) .SetMethod("undo", &WebContents::Undo) .SetMethod("redo", &WebContents::Redo) .SetMethod("cut", &WebContents::Cut) diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index 336ef1f33355..e913c4b644e9 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -142,6 +142,7 @@ class WebContents : public mate::TrackableObject, void SetIgnoreMenuShortcuts(bool ignore); void SetAudioMuted(bool muted); bool IsAudioMuted(); + bool IsDOMReady() const; void Print(mate::Arguments* args); std::vector GetPrinterList(); void SetEmbedder(const WebContents* embedder); @@ -462,6 +463,9 @@ class WebContents : public mate::TrackableObject, // Whether to enable devtools. bool enable_devtools_ = true; + // Whether page's document is ready. + bool is_dom_ready_ = false; + // Observers of this WebContents. base::ObserverList observers_; diff --git a/lib/browser/api/browser-window.js b/lib/browser/api/browser-window.js index 7b82e01eca11..8d5bc8444999 100644 --- a/lib/browser/api/browser-window.js +++ b/lib/browser/api/browser-window.js @@ -54,7 +54,13 @@ BrowserWindow.prototype._init = function () { '"nativeWindowOpen" option will cause memory leaks, please turn off ' + 'the "nodeIntegration" option.\\n' + 'See https://github.com/electron/electron/pull/15076 for more.' - this.webContents.executeJavaScript(`console.warn('${message}')`) + // console is only available after DOM is created. + const printWarning = () => this.webContents.executeJavaScript(`console.warn('${message}')`) + if (this.webContents.isDomReady()) { + printWarning() + } else { + this.webContents.once('dom-ready', printWarning) + } } let {url, frameName} = urlFrameName