mirror of
https://github.com/electron/electron.git
synced 2026-04-10 03:01:51 -04:00
fix: pageVisibility state when backgroundThrottling disabled (#39298)
fix: pageVisibility state when backgroundThrottling disabled
This commit is contained in:
@@ -33,6 +33,21 @@ index 180abdc9f983887c83fd9d4a596472222e9ab472..00842717a7570561ee9e3eca11190ab5
|
||||
void SendWebPreferencesToRenderer();
|
||||
void SendRendererPreferencesToRenderer(
|
||||
const blink::RendererPreferences& preferences);
|
||||
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
|
||||
index 9716c8f8a5fe15ffabe4eeedb7b5b35a57b61bac..75796596daeda51d303856ae767e2bae9b9d2d18 100644
|
||||
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
|
||||
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
|
||||
@@ -554,8 +554,8 @@ void RenderWidgetHostViewAura::ShowImpl(PageVisibilityState page_visibility) {
|
||||
// OnShowWithPageVisibility will not call NotifyHostAndDelegateOnWasShown,
|
||||
// which updates `visibility_`, unless the host is hidden. Make sure no update
|
||||
// is needed.
|
||||
- DCHECK(host_->is_hidden() || visibility_ == Visibility::VISIBLE);
|
||||
- OnShowWithPageVisibility(page_visibility);
|
||||
+ if (host_->is_hidden() || visibility_ == Visibility::VISIBLE)
|
||||
+ OnShowWithPageVisibility(page_visibility);
|
||||
}
|
||||
|
||||
void RenderWidgetHostViewAura::NotifyHostAndDelegateOnWasShown(
|
||||
diff --git a/content/public/browser/render_view_host.h b/content/public/browser/render_view_host.h
|
||||
index 9979c25ecd57e68331b628a518368635db5c2027..32733bf951af3eff7da5fd5758bbcbaa49ff0e3c 100644
|
||||
--- a/content/public/browser/render_view_host.h
|
||||
@@ -84,10 +99,20 @@ index 8a18ecf567cd3a6a2fb1627083a5544a93198bf4..8b6436f3ba6c8bfc2cba054e77ab8886
|
||||
// Visibility -----------------------------------------------------------
|
||||
|
||||
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc
|
||||
index 3fd94156edd9868f0d46746227ae40da604bbc2c..ce99c90306bf2988fdb9a92e04d2ed8ec318da78 100644
|
||||
index 3fd94156edd9868f0d46746227ae40da604bbc2c..6ce650e2fc879ae135e5bb731750f8929b592f17 100644
|
||||
--- a/third_party/blink/renderer/core/exported/web_view_impl.cc
|
||||
+++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
|
||||
@@ -3847,13 +3847,21 @@ PageScheduler* WebViewImpl::Scheduler() const {
|
||||
@@ -2386,6 +2386,9 @@ void WebViewImpl::SetPageLifecycleStateInternal(
|
||||
TRACE_EVENT2("navigation", "WebViewImpl::SetPageLifecycleStateInternal",
|
||||
"old_state", old_state, "new_state", new_state);
|
||||
|
||||
+ if (!scheduler_throttling_allowed_)
|
||||
+ new_state->visibility = mojom::blink::PageVisibilityState::kVisible;
|
||||
+
|
||||
bool storing_in_bfcache = new_state->is_in_back_forward_cache &&
|
||||
!old_state->is_in_back_forward_cache;
|
||||
bool restoring_from_bfcache = !new_state->is_in_back_forward_cache &&
|
||||
@@ -3847,17 +3850,30 @@ PageScheduler* WebViewImpl::Scheduler() const {
|
||||
return GetPage()->GetPageScheduler();
|
||||
}
|
||||
|
||||
@@ -102,14 +127,29 @@ index 3fd94156edd9868f0d46746227ae40da604bbc2c..ce99c90306bf2988fdb9a92e04d2ed8e
|
||||
mojom::blink::PageVisibilityState visibility_state,
|
||||
bool is_initial_state) {
|
||||
DCHECK(GetPage());
|
||||
GetPage()->SetVisibilityState(visibility_state, is_initial_state);
|
||||
GetPage()->GetPageScheduler()->SetPageVisible(
|
||||
- GetPage()->SetVisibilityState(visibility_state, is_initial_state);
|
||||
- GetPage()->GetPageScheduler()->SetPageVisible(
|
||||
- visibility_state == mojom::blink::PageVisibilityState::kVisible);
|
||||
+ scheduler_throttling_allowed_ ?
|
||||
+ (visibility_state == mojom::blink::PageVisibilityState::kVisible) : true);
|
||||
// Notify observers of the change.
|
||||
if (!is_initial_state) {
|
||||
for (auto& observer : observers_)
|
||||
- // Notify observers of the change.
|
||||
- if (!is_initial_state) {
|
||||
- for (auto& observer : observers_)
|
||||
- observer.OnPageVisibilityChanged(visibility_state);
|
||||
+ // If backgroundThrottling is disabled, the page is always visible.
|
||||
+ if (!scheduler_throttling_allowed_) {
|
||||
+ GetPage()->SetVisibilityState(mojom::blink::PageVisibilityState::kVisible, is_initial_state);
|
||||
+ GetPage()->GetPageScheduler()->SetPageVisible(true);
|
||||
+ } else {
|
||||
+ bool is_visible = visibility_state == mojom::blink::PageVisibilityState::kVisible;
|
||||
+ GetPage()->SetVisibilityState(visibility_state, is_initial_state);
|
||||
+ GetPage()->GetPageScheduler()->SetPageVisible(is_visible);
|
||||
+ // Notify observers of the change.
|
||||
+ if (!is_initial_state) {
|
||||
+ for (auto& observer : observers_)
|
||||
+ observer.OnPageVisibilityChanged(visibility_state);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h
|
||||
index 6a180620e00c77d0f4be346d1296f62feb714abb..c0ccf14faa52ab190c5848e8e9b597bcf637d4c0 100644
|
||||
--- a/third_party/blink/renderer/core/exported/web_view_impl.h
|
||||
|
||||
@@ -12,7 +12,7 @@ Ideally we could add an embedder observer pattern here but that can be
|
||||
done in future work.
|
||||
|
||||
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc
|
||||
index ce99c90306bf2988fdb9a92e04d2ed8ec318da78..77f90f35ebad0655af1bd063d9a942964db48017 100644
|
||||
index 6ce650e2fc879ae135e5bb731750f8929b592f17..ae95b544e2a1f731766299129f429900fa55b4d1 100644
|
||||
--- a/third_party/blink/renderer/core/exported/web_view_impl.cc
|
||||
+++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
|
||||
@@ -166,6 +166,7 @@
|
||||
|
||||
@@ -4065,7 +4065,8 @@ describe('BrowserWindow module', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('document.visibilityState/hidden', () => {
|
||||
// TODO(codebytere): figure out how to make these pass in CI on Windows.
|
||||
ifdescribe(process.platform !== 'win32')('document.visibilityState/hidden', () => {
|
||||
afterEach(closeAllWindows);
|
||||
|
||||
it('visibilityState is initially visible despite window being hidden', async () => {
|
||||
@@ -4093,8 +4094,7 @@ describe('BrowserWindow module', () => {
|
||||
expect(hidden).to.be.false('hidden');
|
||||
});
|
||||
|
||||
// TODO(nornagon): figure out why this is failing on windows
|
||||
ifit(process.platform !== 'win32')('visibilityState changes when window is hidden', async () => {
|
||||
it('visibilityState changes when window is hidden', async () => {
|
||||
const w = new BrowserWindow({
|
||||
width: 100,
|
||||
height: 100,
|
||||
@@ -4121,8 +4121,7 @@ describe('BrowserWindow module', () => {
|
||||
}
|
||||
});
|
||||
|
||||
// TODO(nornagon): figure out why this is failing on windows
|
||||
ifit(process.platform !== 'win32')('visibilityState changes when window is shown', async () => {
|
||||
it('visibilityState changes when window is shown', async () => {
|
||||
const w = new BrowserWindow({
|
||||
width: 100,
|
||||
height: 100,
|
||||
@@ -4143,7 +4142,7 @@ describe('BrowserWindow module', () => {
|
||||
expect(visibilityState).to.equal('visible');
|
||||
});
|
||||
|
||||
ifit(process.platform !== 'win32')('visibilityState changes when window is shown inactive', async () => {
|
||||
it('visibilityState changes when window is shown inactive', async () => {
|
||||
const w = new BrowserWindow({
|
||||
width: 100,
|
||||
height: 100,
|
||||
@@ -4163,7 +4162,6 @@ describe('BrowserWindow module', () => {
|
||||
expect(visibilityState).to.equal('visible');
|
||||
});
|
||||
|
||||
// TODO(nornagon): figure out why this is failing on windows
|
||||
ifit(process.platform === 'darwin')('visibilityState changes when window is minimized', async () => {
|
||||
const w = new BrowserWindow({
|
||||
width: 100,
|
||||
@@ -4190,8 +4188,6 @@ describe('BrowserWindow module', () => {
|
||||
}
|
||||
});
|
||||
|
||||
// DISABLED-FIXME(MarshallOfSound): This test fails locally 100% of the time, on CI it started failing
|
||||
// when we introduced the compositor recycling patch. Should figure out how to fix this
|
||||
it('visibilityState remains visible if backgroundThrottling is disabled', async () => {
|
||||
const w = new BrowserWindow({
|
||||
show: false,
|
||||
@@ -4199,10 +4195,13 @@ describe('BrowserWindow module', () => {
|
||||
height: 100,
|
||||
webPreferences: {
|
||||
backgroundThrottling: false,
|
||||
nodeIntegration: true
|
||||
nodeIntegration: true,
|
||||
contextIsolation: false
|
||||
}
|
||||
});
|
||||
|
||||
w.loadFile(path.join(fixtures, 'pages', 'visibilitychange.html'));
|
||||
|
||||
{
|
||||
const [, visibilityState, hidden] = await once(ipcMain, 'pong');
|
||||
expect(visibilityState).to.equal('visible');
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
[
|
||||
"// NOTE: this file is used to disable tests in our test suite by their full title.",
|
||||
"BrowserWindow module BrowserWindow.loadURL(url) should emit did-fail-load event for files that do not exist",
|
||||
"BrowserWindow module document.visibilityState/hidden visibilityState remains visible if backgroundThrottling is disabled",
|
||||
"Menu module Menu.setApplicationMenu unsets a menu with null",
|
||||
"process module main process process.takeHeapSnapshot() returns true on success",
|
||||
"protocol module protocol.registerSchemesAsPrivileged cors-fetch disallows CORS and fetch requests when only supportFetchAPI is specified",
|
||||
|
||||
6
spec/fixtures/pages/visibilitychange.html
vendored
6
spec/fixtures/pages/visibilitychange.html
vendored
@@ -3,10 +3,8 @@
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
const {ipcRenderer} = require('electron')
|
||||
ipcRenderer.send('pong', document.visibilityState, document.hidden)
|
||||
document.addEventListener('visibilitychange', function () {
|
||||
setTimeout(() => {
|
||||
ipcRenderer.send('pong', document.visibilityState, document.hidden)
|
||||
}, 500);
|
||||
document.addEventListener('visibilitychange', () => {
|
||||
ipcRenderer.send('pong', document.visibilityState, document.hidden)
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
|
||||
Reference in New Issue
Block a user