Skip to content

Commit

Permalink
[ComputePressure] Improve implementation of focus control
Browse files Browse the repository at this point in the history
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
wangw-1991 authored and marcoscaceres committed Mar 28, 2023
1 parent 61821de commit bdce909
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 75 deletions.
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');
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,13 @@ promise_test(async t => {
assert_not_equals(pipWindow.height, 0);

const iframe = document.createElement('iframe');
iframe.src = get_host_info().HTTPS_REMOTE_ORIGIN +
'/compute-pressure/resources/support-iframe.html';
document.body.appendChild(iframe);
// Focus on the iframe to make the main frame lose focus, so that
// PressureObserver in the main frame can't receive PressureRecord
// by default. However, if the main frame is the initiator of active
// Picture-in-Picture session, PressureObserver in the main frame can
// receive PressureRecord.
// Focus on the cross-origin iframe, so that PressureObserver in the main
// frame can't receive PressureRecord by default. However, if the main
// frame is the initiator of active Picture-in-Picture session,
// PressureObserver in the main frame can receive PressureRecord.
iframe.contentWindow.focus();

await new Promise(resolve => {
Expand All @@ -45,11 +46,13 @@ promise_test(async t => {
assert_true(stream.active);

const iframe = document.createElement('iframe');
iframe.src = get_host_info().HTTPS_REMOTE_ORIGIN +
'/compute-pressure/resources/support-iframe.html';
document.body.appendChild(iframe);
// Focus on the iframe to make the main frame lose focus, so that
// PressureObserver in the main frame can't receive PressureRecord
// by default. However, if the main frame's browsing context is capturing,
// PressureObserver in the main frame can receive PressureRecord.
// Focus on the cross-origin iframe, so that PressureObserver in the main
// frame can't receive PressureRecord by default. However, if the main
// frame's browsing context is capturing, PressureObserver in the main
// frame can receive PressureRecord.
iframe.contentWindow.focus();

await new Promise(resolve => {
Expand All @@ -62,69 +65,3 @@ promise_test(async t => {
observer.observe('cpu');
});
}, 'Observer should receive PressureRecord if browsing context is capturing');

promise_test(async t => {
const iframe = document.createElement('iframe');
document.body.appendChild(iframe);
// Focus on the iframe to make the main frame lose focus, so that
// PressureObserver in the main frame can't receive PressureRecord
// by default.
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 should not receive PressureRecord when top-level browsing context does not have system focus');

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');

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');
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');

0 comments on commit bdce909

Please sign in to comment.