-
Notifications
You must be signed in to change notification settings - Fork 3.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ComputePressure] Improve implementation of focus control
This CL improves implementation of focus control in two ways: 1. Check if FocusController is focused. This can resolve the bug that page not in focus still gets update. 2. Remove IsOutermostMainFrame() check. As discussed in [1], this is not the necessary condition. [1] w3c/compute-pressure#185 Bug: 1403458 Change-Id: I65186b7bd01438ca0c2e5b7e8a09355b5704f8d5 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4273865 Commit-Queue: Wei4 Wang <[email protected]> Reviewed-by: Raphael Kubo Da Costa <[email protected]> Reviewed-by: Fr <[email protected]> Cr-Commit-Position: refs/heads/main@{#1110203}
- Loading branch information
1 parent
61821de
commit bdce909
Showing
3 changed files
with
97 additions
and
75 deletions.
There are no files selected for viewing
50 changes: 50 additions & 0 deletions
50
compute-pressure/compute_pressure_cross_origin_focus_control.tentative.https.window.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
// META: timeout=long | ||
// META: script=/common/get-host-info.sub.js | ||
|
||
'use strict'; | ||
|
||
promise_test(t => { | ||
const iframe = document.createElement('iframe'); | ||
iframe.src = get_host_info().HTTPS_REMOTE_ORIGIN + | ||
'/compute-pressure/resources/support-iframe.html'; | ||
document.body.appendChild(iframe); | ||
iframe.contentWindow.focus(); | ||
|
||
const observer = new PressureObserver(() => { | ||
assert_unreached('The observer callback should not be called'); | ||
}); | ||
t.add_cleanup(() => { | ||
observer.disconnect(); | ||
iframe.remove(); | ||
}); | ||
|
||
return new Promise(resolve => t.step_timeout(resolve, 2000)); | ||
}, 'Observer in main frame should not receive PressureRecord when focused on cross-origin iframe'); | ||
|
||
promise_test(async t => { | ||
const iframe = document.createElement('iframe'); | ||
iframe.src = get_host_info().HTTPS_REMOTE_ORIGIN + | ||
'/compute-pressure/resources/support-iframe.html'; | ||
iframe.allow = 'compute-pressure'; | ||
const iframeLoadWatcher = new EventWatcher(t, iframe, 'load'); | ||
document.body.appendChild(iframe); | ||
await iframeLoadWatcher.wait_for('load'); | ||
// Focus on the main frame to make the iframe lose focus, so that | ||
// PressureObserver in the iframe can't receive PressureRecord by default. | ||
// If the main frame has focus, but the iframe is cross-origin with the main | ||
// frame, PressureObserver in the iframe still can't receive PressureRecord. | ||
window.focus(); | ||
|
||
return new Promise((resolve, reject) => { | ||
window.addEventListener('message', (e) => { | ||
if (e.data.result === 'timeout') { | ||
resolve(); | ||
} else if (e.data.result === 'success') { | ||
reject('Observer should not receive PressureRecord'); | ||
} else { | ||
reject('Got unexpected reply'); | ||
} | ||
}, {once: true}); | ||
iframe.contentWindow.postMessage({command: 'start'}, '*'); | ||
}); | ||
}, 'Observer in iframe should not receive PressureRecord when focused on cross-origin main frame'); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
35 changes: 35 additions & 0 deletions
35
compute-pressure/compute_pressure_same_origin_focus_control.tentative.https.window.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
'use strict'; | ||
|
||
promise_test(async t => { | ||
const iframe = document.createElement('iframe'); | ||
document.body.appendChild(iframe); | ||
iframe.contentWindow.focus(); | ||
|
||
await new Promise(resolve => { | ||
const observer = new PressureObserver(resolve); | ||
t.add_cleanup(async () => { | ||
observer.disconnect(); | ||
iframe.remove(); | ||
}); | ||
observer.observe('cpu'); | ||
}); | ||
}, 'Observer in main frame should receive PressureRecord when focused on same-origin iframe'); | ||
|
||
promise_test(async t => { | ||
const iframe = document.createElement('iframe'); | ||
document.body.appendChild(iframe); | ||
// Focus on the main frame to make the iframe lose focus, so that | ||
// PressureObserver in the iframe can't receive PressureRecord by default. | ||
// However, if the iframe is same-origin with the main frame and the main | ||
// frame has focus, PressureObserver in iframe can receive PressureRecord. | ||
window.focus(); | ||
|
||
await new Promise(resolve => { | ||
const observer = new iframe.contentWindow.PressureObserver(resolve); | ||
t.add_cleanup(() => { | ||
observer.disconnect(); | ||
iframe.remove(); | ||
}); | ||
observer.observe('cpu'); | ||
}); | ||
}, 'Observer in iframe should receive PressureRecord when focused on same-origin main frame'); |