Skip to content

Commit 0683b64

Browse files
FKLCfkilic@mozilla.com
authored andcommitted
Bug 1973265 - Put WebCodecs API behind RFP Target. r=tjr,webidl,smaug
Differential Revision: https://phabricator.services.mozilla.com/D254549
1 parent 92f7592 commit 0683b64

17 files changed

+278
-12
lines changed

dom/base/nsContentUtils.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2845,7 +2845,7 @@ bool nsContentUtils::ShouldResistFingerprinting_dangerous(
28452845
}
28462846

28472847
// Web extension principals are also excluded
2848-
if (BasePrincipal::Cast(aPrincipal)->AddonPolicy()) {
2848+
if (NS_IsMainThread() && BasePrincipal::Cast(aPrincipal)->AddonPolicy()) {
28492849
MOZ_LOG(nsContentUtils::ResistFingerprintingLog(), LogLevel::Debug,
28502850
("Inside ShouldResistFingerprinting(nsIPrincipal*)"
28512851
" and AddonPolicy said false"));

dom/media/webcodecs/VideoFrame.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1423,7 +1423,7 @@ JSObject* VideoFrame::WrapObject(JSContext* aCx,
14231423

14241424
/* static */
14251425
bool VideoFrame::PrefEnabled(JSContext* aCx, JSObject* aObj) {
1426-
return StaticPrefs::dom_media_webcodecs_enabled() ||
1426+
return nsRFPService::ExposeWebCodecsAPI(aCx, aObj) &&
14271427
StaticPrefs::dom_media_webcodecs_image_decoder_enabled();
14281428
}
14291429

dom/media/webcodecs/test/mochitest.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,13 @@ scheme = "https"
1616
["test_imageDecoder_desiredSize.html"]
1717
scheme = "https"
1818

19+
["test_rfp_api_disabling_disabled.html"]
20+
scheme = "https"
21+
22+
["test_rfp_api_disabling_enabled.html"]
23+
scheme = "https"
24+
25+
["test_rfp_api_disabling_exemption.html"]
26+
scheme = "https"
27+
1928
["test_videoFrame_mismatched_codedSize.html"]
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title></title>
5+
<script src="/tests/SimpleTest/SimpleTest.js"></script>
6+
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
7+
</head>
8+
<body>
9+
<script>
10+
const apis = [
11+
"AudioData",
12+
"AudioDecoder",
13+
"AudioEncoder",
14+
"EncodedAudioChunk",
15+
"EncodedVideoChunk",
16+
"ImageDecoder",
17+
"ImageTrack",
18+
"ImageTrackList",
19+
"VideoColorSpace",
20+
"VideoDecoder",
21+
"VideoEncoder",
22+
"VideoFrame",
23+
];
24+
25+
function enabledAPIs() {
26+
return apis.filter(api => typeof window[api] !== "undefined");
27+
}
28+
29+
function enabledAPIsWorker() {
30+
const code = `
31+
onmessage = e => {
32+
const apis = ${JSON.stringify(apis)};
33+
postMessage(apis.filter(api => typeof self[api] !== "undefined"));
34+
};`;
35+
const blob = new Blob([code], { type: "application/javascript" });
36+
const worker = new Worker(URL.createObjectURL(blob));
37+
38+
return new Promise((resolve) => {
39+
worker.addEventListener("message", async (e) => {
40+
worker.terminate();
41+
resolve(e.data);
42+
});
43+
44+
worker.postMessage({});
45+
});
46+
}
47+
48+
add_setup(async () => {
49+
await SpecialPowers.pushPrefEnv({
50+
set: [
51+
["dom.media.webcodecs.enabled", true],
52+
["dom.media.webcodecs.image-decoder.enabled", true]
53+
],
54+
});
55+
});
56+
57+
add_task(async () => {
58+
is(enabledAPIs().length, apis.length, true, "All WebCodecs APIs should be enabled");
59+
is(
60+
(await enabledAPIsWorker()).length,
61+
apis.length,
62+
"All WebCodecs APIs should be enabled in workers too"
63+
);
64+
});
65+
</script>
66+
</body>
67+
</html>
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title></title>
5+
<script src="/tests/SimpleTest/SimpleTest.js"></script>
6+
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
7+
</head>
8+
<body>
9+
<script>
10+
const apis = [
11+
"AudioData",
12+
"AudioDecoder",
13+
"AudioEncoder",
14+
"EncodedAudioChunk",
15+
"EncodedVideoChunk",
16+
"ImageDecoder",
17+
"ImageTrack",
18+
"ImageTrackList",
19+
"VideoColorSpace",
20+
"VideoDecoder",
21+
"VideoEncoder",
22+
"VideoFrame",
23+
];
24+
25+
function enabledAPIs() {
26+
return apis.filter(api => typeof window[api] !== "undefined");
27+
}
28+
29+
function enabledAPIsWorker() {
30+
const code = `
31+
onmessage = e => {
32+
const apis = ${JSON.stringify(apis)};
33+
postMessage(apis.filter(api => typeof self[api] !== "undefined"));
34+
};`;
35+
const blob = new Blob([code], { type: "application/javascript" });
36+
const worker = new Worker(URL.createObjectURL(blob));
37+
38+
return new Promise((resolve) => {
39+
worker.addEventListener("message", async (e) => {
40+
worker.terminate();
41+
resolve(e.data);
42+
});
43+
44+
worker.postMessage({});
45+
});
46+
}
47+
48+
add_setup(async () => {
49+
await SpecialPowers.pushPrefEnv({
50+
set: [
51+
["dom.media.webcodecs.enabled", true],
52+
["dom.media.webcodecs.image-decoder.enabled", true],
53+
["privacy.fingerprintingProtection", true],
54+
["privacy.fingerprintingProtection.overrides", "-AllTargets,+WebCodecs"],
55+
],
56+
});
57+
});
58+
59+
add_task(async () => {
60+
is(enabledAPIs().length, 0, true, "All WebCodecs APIs should be disabled");
61+
is(
62+
(await enabledAPIsWorker()).length,
63+
0,
64+
"All WebCodecs APIs should be disabled in workers too"
65+
);
66+
});
67+
</script>
68+
</body>
69+
</html>
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title></title>
5+
<script src="/tests/SimpleTest/SimpleTest.js"></script>
6+
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
7+
</head>
8+
<body>
9+
<script>
10+
const apis = [
11+
"AudioData",
12+
"AudioDecoder",
13+
"AudioEncoder",
14+
"EncodedAudioChunk",
15+
"EncodedVideoChunk",
16+
"ImageDecoder",
17+
"ImageTrack",
18+
"ImageTrackList",
19+
"VideoColorSpace",
20+
"VideoDecoder",
21+
"VideoEncoder",
22+
"VideoFrame",
23+
];
24+
25+
function enabledAPIs() {
26+
return apis.filter(api => typeof window[api] !== "undefined");
27+
}
28+
29+
function enabledAPIsWorker() {
30+
const code = `
31+
onmessage = e => {
32+
const apis = ${JSON.stringify(apis)};
33+
postMessage(apis.filter(api => typeof self[api] !== "undefined"));
34+
};`;
35+
const blob = new Blob([code], { type: "application/javascript" });
36+
const worker = new Worker(URL.createObjectURL(blob));
37+
38+
return new Promise((resolve) => {
39+
worker.addEventListener("message", async (e) => {
40+
worker.terminate();
41+
resolve(e.data);
42+
});
43+
44+
worker.postMessage({});
45+
});
46+
}
47+
48+
add_setup(async () => {
49+
await SpecialPowers.pushPrefEnv({
50+
set: [
51+
["dom.media.webcodecs.enabled", true],
52+
["dom.media.webcodecs.image-decoder.enabled", true],
53+
["privacy.fingerprintingProtection", true],
54+
["privacy.fingerprintingProtection.overrides", "-AllTargets,+WebCodecs"],
55+
["privacy.resistFingerprinting.exemptedDomains", location.hostname]
56+
],
57+
});
58+
});
59+
60+
add_task(async () => {
61+
is(enabledAPIs().length, apis.length, true, "All WebCodecs APIs should be disabled");
62+
is(
63+
(await enabledAPIsWorker()).length,
64+
apis.length,
65+
"All WebCodecs APIs should be disabled in workers too"
66+
);
67+
});
68+
</script>
69+
</body>
70+
</html>

dom/webidl/AudioData.webidl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
// [Serializable, Transferable] are implemented without adding attributes here,
1111
// but directly with {Read,Write}StructuredClone and Transfer/FromTransfered.
12-
[Exposed=(Window,DedicatedWorker), Pref="dom.media.webcodecs.enabled"]
12+
[Exposed=(Window,DedicatedWorker), Func="nsRFPService::ExposeWebCodecsAPI"]
1313
interface AudioData {
1414
[Throws]
1515
constructor(AudioDataInit init);

dom/webidl/AudioDecoder.webidl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* https://w3c.github.io/webcodecs/#audiodecoder
88
*/
99

10-
[Exposed=(Window,DedicatedWorker), SecureContext, Pref="dom.media.webcodecs.enabled"]
10+
[Exposed=(Window,DedicatedWorker), SecureContext, Func="nsRFPService::ExposeWebCodecsAPI"]
1111
interface AudioDecoder : EventTarget {
1212
[Throws]
1313
constructor(AudioDecoderInit init);

dom/webidl/AudioEncoder.webidl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ dictionary OpusEncoderConfig {
4242
boolean usedtx = false;
4343
};
4444

45-
[Exposed=(Window,DedicatedWorker), SecureContext, Pref="dom.media.webcodecs.enabled"]
45+
[Exposed=(Window,DedicatedWorker), SecureContext, Func="nsRFPService::ExposeWebCodecsAPI"]
4646
interface AudioEncoder : EventTarget {
4747
[Throws]
4848
constructor(AudioEncoderInit init);

dom/webidl/EncodedAudioChunk.webidl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*/
99

1010
// [Serializable] is implemented without adding attribute here.
11-
[Exposed=(Window,DedicatedWorker), Pref="dom.media.webcodecs.enabled"]
11+
[Exposed=(Window,DedicatedWorker), Func="nsRFPService::ExposeWebCodecsAPI"]
1212
interface EncodedAudioChunk {
1313
[Throws]
1414
constructor(EncodedAudioChunkInit init);

0 commit comments

Comments
 (0)