From 73b07f76a3004ea64ef88f94161ab820d98cbf42 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 24 May 2016 12:44:09 -0700 Subject: [PATCH] Support document visiblity state and events in webviews --- atom/browser/web_contents_preferences.cc | 9 ++++++++- atom/common/options_switches.cc | 4 ++++ atom/common/options_switches.h | 2 ++ lib/browser/guest-view-manager.js | 3 ++- lib/renderer/web-view/web-view.js | 9 ++++++++- spec/webview-spec.js | 2 +- 6 files changed, 25 insertions(+), 4 deletions(-) diff --git a/atom/browser/web_contents_preferences.cc b/atom/browser/web_contents_preferences.cc index bfaca8d7ca..f57274527f 100644 --- a/atom/browser/web_contents_preferences.cc +++ b/atom/browser/web_contents_preferences.cc @@ -160,7 +160,14 @@ void WebContentsPreferences::AppendExtraCommandLineSwitches( if (window) { bool visible = window->IsVisible() && !window->IsMinimized(); if (!visible) // Default state is visible. - command_line->AppendSwitch("hidden-page"); + command_line->AppendSwitch(switches::kHiddenPage); + } else { + // Inherit initial visibilty state from parent window in webviews + bool hidden_page; + if (web_preferences.GetBoolean(options::kHiddenPage, &hidden_page) && + hidden_page) { + command_line->AppendSwitch(switches::kHiddenPage); + } } } diff --git a/atom/common/options_switches.cc b/atom/common/options_switches.cc index de130eee13..05c2284cbb 100644 --- a/atom/common/options_switches.cc +++ b/atom/common/options_switches.cc @@ -103,6 +103,9 @@ const char kExperimentalCanvasFeatures[] = "experimentalCanvasFeatures"; // Opener window's ID. const char kOpenerID[] = "openerId"; +// Page is hidden. +const char kHiddenPage[] = "hiddenPage"; + // Enable the rubber banding effect. const char kScrollBounce[] = "scrollBounce"; @@ -146,6 +149,7 @@ const char kPreloadURL[] = "preload-url"; const char kNodeIntegration[] = "node-integration"; const char kGuestInstanceID[] = "guest-instance-id"; const char kOpenerID[] = "opener-id"; +const char kHiddenPage[] = "hidden-page"; const char kScrollBounce[] = "scroll-bounce"; // Widevine options diff --git a/atom/common/options_switches.h b/atom/common/options_switches.h index fadde79f18..b54972288e 100644 --- a/atom/common/options_switches.h +++ b/atom/common/options_switches.h @@ -56,6 +56,7 @@ extern const char kGuestInstanceID[]; extern const char kExperimentalFeatures[]; extern const char kExperimentalCanvasFeatures[]; extern const char kOpenerID[]; +extern const char kHiddenPage[]; extern const char kScrollBounce[]; extern const char kBlinkFeatures[]; @@ -82,6 +83,7 @@ extern const char kPreloadURL[]; extern const char kNodeIntegration[]; extern const char kGuestInstanceID[]; extern const char kOpenerID[]; +extern const char kHiddenPage[]; extern const char kScrollBounce[]; extern const char kWidevineCdmPath[]; diff --git a/lib/browser/guest-view-manager.js b/lib/browser/guest-view-manager.js index 6876a8d22c..57ed14af5d 100644 --- a/lib/browser/guest-view-manager.js +++ b/lib/browser/guest-view-manager.js @@ -181,7 +181,8 @@ var attachGuest = function (embedder, elementInstanceId, guestInstanceId, params plugins: params.plugins, zoomFactor: params.zoomFactor, webSecurity: !params.disablewebsecurity, - blinkFeatures: params.blinkfeatures + blinkFeatures: params.blinkfeatures, + hiddenPage: params.hiddenPage } if (params.preload) { diff --git a/lib/renderer/web-view/web-view.js b/lib/renderer/web-view/web-view.js index 1636d560ee..fd44d925e4 100644 --- a/lib/renderer/web-view/web-view.js +++ b/lib/renderer/web-view/web-view.js @@ -42,6 +42,11 @@ var WebViewImpl = (function () { this.webviewNode.setZoomLevel(zoomLevel) } webFrame.on('zoom-level-changed', this.onZoomLevelChanged) + + this.onVisibilityChanged = (event, visibilityState) => { + this.webviewNode.send('ELECTRON_RENDERER_WINDOW_VISIBILITY_CHANGE', visibilityState) + } + ipcRenderer.on('ELECTRON_RENDERER_WINDOW_VISIBILITY_CHANGE', this.onVisibilityChanged) } WebViewImpl.prototype.createBrowserPluginNode = function () { @@ -56,6 +61,7 @@ var WebViewImpl = (function () { WebViewImpl.prototype.reset = function () { // Unlisten the zoom-level-changed event. webFrame.removeListener('zoom-level-changed', this.onZoomLevelChanged) + ipcRenderer.removeListener('ELECTRON_RENDERER_WINDOW_VISIBILITY_CHANGE', this.onVisibilityChanged) // If guestInstanceId is defined then the has navigated and has // already picked up a partition ID. Thus, we need to reset the initialization @@ -224,7 +230,8 @@ var WebViewImpl = (function () { params = { instanceId: this.viewInstanceId, userAgentOverride: this.userAgentOverride, - zoomFactor: webFrame.getZoomFactor() + zoomFactor: webFrame.getZoomFactor(), + hiddenPage: document.hidden } ref1 = this.attributes for (attributeName in ref1) { diff --git a/spec/webview-spec.js b/spec/webview-spec.js index 754321c745..4b1abbfe92 100644 --- a/spec/webview-spec.js +++ b/spec/webview-spec.js @@ -868,7 +868,7 @@ describe(' tag', function () { w.loadURL('file://' + fixtures + '/pages/webview-zoom-factor.html') }) - it('has the initial hidden state and receives visibilitychange events', function (done) { + it('inherits the parent window hidden state and receives visibilitychange events', function (done) { w = new BrowserWindow({ show: false })