Skip to content

Commit

Permalink
Revert "Reject getDisplayMedia calls without user activation"
Browse files Browse the repository at this point in the history
This reverts commit 5fbd1e8cdadc327dedfad9ce896e24c562e59fbf.

Reason for revert: Reverted by Sheriff on suspicion of causing a test failure. https://ci.chromium.org/ui/p/chromium/builders/ci/Linux%20Tests%20(dbg)(1)/110084/test-results?sortby=&groupby=&q=ExactID%3Aninja%3A%2F%2F%3Ablink_wpt_tests%2Fexternal%2Fwpt%2Fscreen-capture%2Fpermissions-policy-audio%2Bvideo.https.sub.html+VHash%3A9f5ebdc6f73354e7.

The test failure lists getDisplayMedia failing as the cause, and this CL is in the blame set and looks related.

Original change's description:
> Reject getDisplayMedia calls without user activation
>
> This CL makes sure getDisplayMedia() returned promise reject with
> InvalidStateError when called without user activation.
> Note that speculation rules tests are updated as well[1].
>
> [1] WICG/nav-speculation#225
>
> Intent to remove: https://groups.google.com/a/chromium.org/g/blink-dev/c/YGmuAVOqftI
>
> Bug: 1198918
> Change-Id: I530761d95e6db412582d0f19c0170803516c33f7
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4096797
> Reviewed-by: Dale Curtis <dalecurtis@chromium.org>
> Reviewed-by: Hiroki Nakagawa <nhiroki@chromium.org>
> Reviewed-by: Elad Alon <eladalon@chromium.org>
> Commit-Queue: Fr <beaufort.francois@gmail.com>
> Cr-Commit-Position: refs/heads/main@{#1086033}

Bug: 1198918
Change-Id: I14d0e47ee406aa09b6eec763e94d8e83f282a04d
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4119423
Auto-Submit: Peter Williamson <petewil@chromium.org>
Quick-Run: Peter Williamson <petewil@chromium.org>
Commit-Queue: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Owners-Override: Peter Williamson <petewil@chromium.org>
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Cr-Commit-Position: refs/heads/main@{#1086147}
  • Loading branch information
Peter Williamson authored and chromium-wpt-export-bot committed Dec 21, 2022
1 parent 86fb03c commit 349c6e6
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,9 @@
<title>MediaStreamTrack transfer to iframe</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script>
promise_test(async () => {
const iframe = document.createElement("iframe");
await test_driver.bless('getDisplayMedia');
const stream = await navigator.mediaDevices.getDisplayMedia({audio:true, video: true});
const track = stream.getAudioTracks()[0];
const cloned_track = track.clone();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,9 @@
<title>MediaStreamTrack transfer to iframe</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script>
promise_test(async () => {
const iframe = document.createElement("iframe");
await test_driver.bless('getDisplayMedia');
const stream = await navigator.mediaDevices.getDisplayMedia({video: true});
const track = stream.getVideoTracks()[0];
const cloned_track = track.clone();
Expand Down
33 changes: 20 additions & 13 deletions speculation-rules/prerender/resources/screen-capture.https.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,30 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/speculation-rules/prerender/resources/utils.js"></script>
<script src="/speculation-rules/prerender/resources/deferred-promise-utils.js"></script>
<script>

assert_true(document.prerendering);
const params = new URLSearchParams(location.search);

async function invokeScreenCaptureAPI(){
const bc = new PrerenderChannel('prerender-channel');
// The main test page (restriction-screen-capture.https.html) loads the
// initiator page, then the initiator page will prerender itself with the
// `prerendering` parameter.
const isPrerendering = params.has('prerendering');

try {
await navigator.mediaDevices.getDisplayMedia();
bc.postMessage('unexpected success');
} catch (err){
bc.postMessage(err.name);
} finally {
bc.close();
}
if (!isPrerendering) {
loadInitiatorPage();
} else {
const prerenderEventCollector = new PrerenderEventCollector();
const promise = new Promise(async (resolve, reject) => {
try {
await navigator.mediaDevices.getDisplayMedia({video: true});
resolve();
} catch (e) {
reject(`navigator.mediaDevices.getDisplayMedia error: ${e.toString()}`);
}
});
prerenderEventCollector.start(
promise, 'navigator.mediaDevices.getDisplayMedia');
}

invokeScreenCaptureAPI();

</script>
39 changes: 30 additions & 9 deletions speculation-rules/prerender/restriction-screen-capture.https.html
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<!DOCTYPE html>
<title>Prerendering cannot invoke the Screen Capture API</title>
<title>Access to the Screen Capture API is deferred</title>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
Expand All @@ -12,7 +12,8 @@

promise_test(async t => {
const uid = token();
const bc = new PrerenderChannel('prerender-channel', uid);
const bc = new PrerenderChannel('test-channel', uid);
t.add_cleanup(_ => bc.close());

const gotMessage = new Promise(resolve => {
bc.addEventListener('message', e => {
Expand All @@ -21,15 +22,35 @@
once: true
});
});
const url = `resources/screen-capture.https.html?uid=${uid}`;
window.open(url, '_blank', 'noopener');

// Start prerendering a page that attempts to invoke the Screen Capture API.
// This API is activated-gated so it's expected to fail:
// https://wicg.github.io/nav-speculation/prerendering.html#implicitly-restricted
startPrerendering(`resources/screen-capture.https.html?uid=${uid}`);
const result = await gotMessage;
assert_equals(result, 'InvalidStateError');
bc.close();
}, `prerendering pages should not be able to invoke the Screen Capture API`);
const expected = [
{
event: 'started waiting navigator.mediaDevices.getDisplayMedia',
prerendering: true
},
{
event: 'prerendering change',
prerendering: false
},
{
event: 'finished waiting navigator.mediaDevices.getDisplayMedia',
prerendering: false
},
];
assert_equals(result.length, expected.length);
for (let i = 0; i < result.length; i++) {
assert_equals(result[i].event, expected[i].event, `event[${i}]`);
assert_equals(result[i].prerendering, expected[i].prerendering,
`prerendering[${i}]`);
}

// Send a close signal to PrerenderEventCollector on the prerendered page.
new PrerenderChannel('close', uid).postMessage('');
}, `The access to the Screen Capture API should be deferred until the
prerendered page is activated`);

</script>
</body>

0 comments on commit 349c6e6

Please sign in to comment.