Skip to content

Commit 6618dc6

Browse files
cfredricchromium-wpt-export-bot
authored andcommitted
[SAA] Remove unnecessary recursive WPT embedding; ignore irrelevant events
This test used to recursively embed an iframe of itself, which is unnecessary (and sometimes causes problems). Additionally, some of the event listeners didn't properly ignore irrelevant events (which is the cause of the occasional 'expected (string) "granted" but got (object) object "[object Object]"' errors on https://wpt.fyi/results/storage-access-api/storage-access-permission.sub.https.window.html?label=master&label=experimental&aligned&view=interop. Change-Id: I634fed3977058707363abbeb393eb7b58a7079fe Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6309927 Reviewed-by: Sandor «Alex» Major <[email protected]> Auto-Submit: Chris Fredrickson <[email protected]> Commit-Queue: Sandor «Alex» Major <[email protected]> Cr-Commit-Position: refs/heads/main@{#1426117}
1 parent 63f0fcb commit 6618dc6

File tree

3 files changed

+128
-119
lines changed

3 files changed

+128
-119
lines changed

storage-access-api/resources/embedded_responder.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,10 @@ window.addEventListener("message", async (event) => {
6363
case "observe_permission_change": {
6464
const status = await navigator.permissions.query({name: "storage-access"});
6565
status.addEventListener("change", (event) => {
66-
parent.postMessage(event.target.state, '*');
66+
parent.postMessage({
67+
tag: 'observed_permission_change',
68+
state: event.target.state,
69+
}, '*');
6770
}, { once: true });
6871
reply('permission_change_observer_installed');
6972
break;

storage-access-api/resources/permissions-iframe.https.html

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,59 @@
77
<!-- no testharnessreport.js -->
88
<script src="../helpers.js"></script>
99
<div id=log></div>
10-
<script src="/storage-access-api/storage-access-permission.sub.https.window.js"></script>
10+
<script>
11+
"use strict";
12+
13+
test_driver.set_test_context(window.top);
14+
15+
promise_test(async t => {
16+
const permission = await navigator.permissions.query({name: "storage-access"});
17+
assert_equals(permission.name, "storage-access");
18+
assert_equals(permission.state, "prompt");
19+
}, "Permission default state can be queried");
20+
21+
promise_test(async t => {
22+
t.add_cleanup(async () => {
23+
await test_driver.set_permission({ name: 'storage-access' }, 'prompt');
24+
});
25+
await test_driver.set_permission({ name: 'storage-access' }, 'granted');
26+
27+
const permission = await navigator.permissions.query({name: "storage-access"});
28+
assert_equals(permission.name, "storage-access");
29+
assert_equals(permission.state, "granted");
30+
}, "Permission granted state can be queried");
31+
32+
promise_test(async t => {
33+
t.add_cleanup(async () => {
34+
await test_driver.set_permission({ name: 'storage-access' }, 'prompt');
35+
});
36+
await test_driver.set_permission({ name: 'storage-access' }, 'denied');
37+
38+
const permission = await navigator.permissions.query({name: "storage-access"});
39+
assert_equals(permission.name, "storage-access");
40+
assert_equals(permission.state, "prompt");
41+
42+
await test_driver.set_permission({ name: 'storage-access' }, 'prompt');
43+
}, "Permission denied state is hidden");
44+
45+
promise_test(async t => {
46+
t.add_cleanup(async () => {
47+
await test_driver.set_permission({ name: 'storage-access' }, 'prompt');
48+
});
49+
50+
const permission = await navigator.permissions.query({name: "storage-access"});
51+
52+
const p = new Promise(resolve => {
53+
permission.addEventListener("change", (event) => resolve(event), { once: true });
54+
});
55+
56+
await test_driver.set_permission({ name: 'storage-access' }, 'granted');
57+
await document.requestStorageAccess();
58+
59+
const event = await p;
60+
61+
assert_equals(event.target.name, "storage-access");
62+
assert_equals(event.target.state, "granted");
63+
}, "Permission state can be observed");
64+
65+
</script>

storage-access-api/storage-access-permission.sub.https.window.js

Lines changed: 68 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -9,137 +9,88 @@
99
const www1Alt = "https://{{hosts[alt][www1]}}:{{ports[https][0]}}";
1010
const responder_html_load_ack = "/storage-access-api/resources/script-with-cookie-header.py?script=embedded_responder.js&should_ack_load=true";
1111

12-
if (window === window.top) {
13-
// Test the interaction between two (same-origin) iframes.
14-
promise_test(async (t) => {
15-
// Note: the web platform doesn't guarantee that each iframe has finished
16-
// loading (and executing its script) by the time the CreateFrame promise
17-
// resolves. Therefore the script will signal the parent when it's loaded
18-
// and safe to proceed. Without this extra synchronization, frames can
19-
// miss messages that are essential to the test, and cause the test to
20-
// timeout.
21-
const frame1_loaded = new Promise(r => {
22-
onmessage = e => r(e.data);
23-
});
24-
const frame1 = await CreateFrame(wwwAlt + responder_html_load_ack);
25-
assert_equals(await frame1_loaded, "loaded");
26-
27-
const frame2_loaded = new Promise(r => {
28-
onmessage = e => r(e.data);
29-
});
30-
const frame2 = await CreateFrame(www1Alt + responder_html_load_ack);
31-
assert_equals(await frame2_loaded, "loaded");
32-
33-
t.add_cleanup(async () => {
34-
await SetPermissionInFrame(frame1, [{ name: 'storage-access' }, 'prompt']);
35-
});
36-
37-
// Install observer on frame, and wait for acknowledgement that it is
38-
// installed.
39-
assert_equals(await ObservePermissionChange(frame2),
40-
"permission_change_observer_installed");
41-
42-
const observed_event = new Promise(r => {
43-
onmessage = e => r(e.data);
44-
});
45-
await SetPermissionInFrame(frame1, [{ name: 'storage-access' }, 'granted']);
46-
const state = await observed_event;
47-
assert_equals(state, "granted");
48-
}, 'Permissions grants are observable across same-origin iframes');
49-
50-
promise_test(async (t) => {
51-
// Note: the web platform doesn't guarantee that each iframe has finished
52-
// loading (and executing its script) by the time the CreateFrame promise
53-
// resolves. Therefore the script will signal the parent when it's loaded
54-
// and safe to proceed. Without this extra synchronization, frames can
55-
// miss messages that are essential to the test, and cause the test to
56-
// timeout.
57-
const frame1_loaded = new Promise(r => {
58-
onmessage = e => r(e.data);
59-
});
60-
const frame1 = await CreateFrame(wwwAlt + responder_html_load_ack);
61-
assert_equals(await frame1_loaded, "loaded");
62-
63-
const frame2_loaded = new Promise(r => {
64-
onmessage = e => r(e.data);
65-
});
66-
const frame2 = await CreateFrame(www1Alt + responder_html_load_ack);
67-
assert_equals(await frame2_loaded, "loaded");
68-
69-
t.add_cleanup(async () => {
70-
await SetPermissionInFrame(frame1, [{ name: 'storage-access' }, 'prompt']);
71-
});
72-
73-
// Install observer on frame, and wait for acknowledgement that it is
74-
// installed.
75-
assert_equals(await ObservePermissionChange(frame2),
76-
"permission_change_observer_installed");
77-
78-
const observed_event = new Promise(r => {
79-
onmessage = e => r(e.data);
80-
});
81-
await SetPermissionInFrame(frame1, [{ name: 'storage-access' }, 'granted']);
82-
const state = await observed_event;
83-
assert_equals(state, "granted");
84-
}, "Permissions grants are observable across same-site iframes");
85-
86-
promise_test(async (t) => {
87-
// Finally run the simple tests below in a separate cross-origin iframe.
88-
await RunTestsInIFrame('https://{{domains[www]}}:{{ports[https][0]}}/storage-access-api/resources/permissions-iframe.https.html');
89-
}, "IFrame tests");
90-
return;
12+
function permissionChangeEvent() {
13+
return new Promise(resolve => {
14+
window.onmessage = e => {
15+
if (e.data.tag == 'observed_permission_change') {
16+
resolve(e.data.state);
17+
}
18+
};
19+
});
9120
}
9221

93-
// We're in a cross-origin, same-site iframe test now.
94-
test_driver.set_test_context(window.top);
95-
96-
promise_test(async t => {
97-
const permission = await navigator.permissions.query({name: "storage-access"});
98-
assert_equals(permission.name, "storage-access");
99-
assert_equals(permission.state, "prompt");
100-
}, "Permission default state can be queried");
101-
102-
promise_test(async t => {
103-
t.add_cleanup(async () => {
104-
await test_driver.set_permission({ name: 'storage-access' }, 'prompt');
22+
// Test the interaction between two (same-origin) iframes.
23+
promise_test(async (t) => {
24+
// Note: the web platform doesn't guarantee that each iframe has finished
25+
// loading (and executing its script) by the time the CreateFrame promise
26+
// resolves. Therefore the script will signal the parent when it's loaded
27+
// and safe to proceed. Without this extra synchronization, frames can
28+
// miss messages that are essential to the test, and cause the test to
29+
// timeout.
30+
const frame1_loaded = new Promise(r => {
31+
onmessage = e => r(e.data);
10532
});
106-
await test_driver.set_permission({ name: 'storage-access' }, 'granted');
33+
const frame1 = await CreateFrame(wwwAlt + responder_html_load_ack);
34+
assert_equals(await frame1_loaded, "loaded");
10735

108-
const permission = await navigator.permissions.query({name: "storage-access"});
109-
assert_equals(permission.name, "storage-access");
110-
assert_equals(permission.state, "granted");
111-
}, "Permission granted state can be queried");
36+
const frame2_loaded = new Promise(r => {
37+
onmessage = e => r(e.data);
38+
});
39+
const frame2 = await CreateFrame(www1Alt + responder_html_load_ack);
40+
assert_equals(await frame2_loaded, "loaded");
11241

113-
promise_test(async t => {
11442
t.add_cleanup(async () => {
115-
await test_driver.set_permission({ name: 'storage-access' }, 'prompt');
43+
await SetPermissionInFrame(frame1, [{ name: 'storage-access' }, 'prompt']);
11644
});
117-
await test_driver.set_permission({ name: 'storage-access' }, 'denied');
11845

119-
const permission = await navigator.permissions.query({name: "storage-access"});
120-
assert_equals(permission.name, "storage-access");
121-
assert_equals(permission.state, "prompt");
46+
// Install observer on frame, and wait for acknowledgement that it is
47+
// installed.
48+
assert_equals(await ObservePermissionChange(frame2),
49+
"permission_change_observer_installed");
50+
51+
const observed_event = permissionChangeEvent();
52+
await SetPermissionInFrame(frame1, [{ name: 'storage-access' }, 'granted']);
53+
const state = await observed_event;
54+
assert_equals(state, "granted");
55+
}, 'Permissions grants are observable across same-origin iframes');
56+
57+
promise_test(async (t) => {
58+
// Note: the web platform doesn't guarantee that each iframe has finished
59+
// loading (and executing its script) by the time the CreateFrame promise
60+
// resolves. Therefore the script will signal the parent when it's loaded
61+
// and safe to proceed. Without this extra synchronization, frames can
62+
// miss messages that are essential to the test, and cause the test to
63+
// timeout.
64+
const frame1_loaded = new Promise(r => {
65+
onmessage = e => r(e.data);
66+
});
67+
const frame1 = await CreateFrame(wwwAlt + responder_html_load_ack);
68+
assert_equals(await frame1_loaded, "loaded");
12269

123-
await test_driver.set_permission({ name: 'storage-access' }, 'prompt');
124-
}, "Permission denied state is hidden");
70+
const frame2_loaded = new Promise(r => {
71+
onmessage = e => r(e.data);
72+
});
73+
const frame2 = await CreateFrame(www1Alt + responder_html_load_ack);
74+
assert_equals(await frame2_loaded, "loaded");
12575

126-
promise_test(async t => {
12776
t.add_cleanup(async () => {
128-
await test_driver.set_permission({ name: 'storage-access' }, 'prompt');
77+
await SetPermissionInFrame(frame1, [{ name: 'storage-access' }, 'prompt']);
12978
});
13079

131-
const permission = await navigator.permissions.query({name: "storage-access"});
132-
133-
const p = new Promise(resolve => {
134-
permission.addEventListener("change", (event) => resolve(event), { once: true });
135-
});
80+
// Install observer on frame, and wait for acknowledgement that it is
81+
// installed.
82+
assert_equals(await ObservePermissionChange(frame2),
83+
"permission_change_observer_installed");
13684

137-
await test_driver.set_permission({ name: 'storage-access' }, 'granted');
138-
await document.requestStorageAccess();
85+
const observed_event = permissionChangeEvent();
86+
await SetPermissionInFrame(frame1, [{ name: 'storage-access' }, 'granted']);
87+
const state = await observed_event;
88+
assert_equals(state, "granted");
89+
}, "Permissions grants are observable across same-site iframes");
13990

140-
const event = await p;
91+
promise_test(async () => {
92+
// Finally run the simple tests below in a separate cross-origin iframe.
93+
await RunTestsInIFrame('https://{{domains[www]}}:{{ports[https][0]}}/storage-access-api/resources/permissions-iframe.https.html');
94+
}, "IFrame tests");
14195

142-
assert_equals(event.target.name, "storage-access");
143-
assert_equals(event.target.state, "granted");
144-
}, "Permission state can be observed");
14596
})();

0 commit comments

Comments
 (0)