Bug 1947431 - Add "zstd" as a CompressionFormat r=saschanaz,webidl
This patch adds a new variant for "zstd" to the CompressionFormat enum in WebIDL. It also adds a couple Mozilla-specific WPTs to ensure that the construction of CompressionStream and DecompressionStream objects with this format are restricted to the correct contexts. Differential Revision: https://phabricator.services.mozilla.com/D238135
This commit is contained in:
@@ -228,6 +228,13 @@ JSObject* CompressionStream::WrapObject(JSContext* aCx,
|
|||||||
// https://wicg.github.io/compression/#dom-compressionstream-compressionstream
|
// https://wicg.github.io/compression/#dom-compressionstream-compressionstream
|
||||||
already_AddRefed<CompressionStream> CompressionStream::Constructor(
|
already_AddRefed<CompressionStream> CompressionStream::Constructor(
|
||||||
const GlobalObject& aGlobal, CompressionFormat aFormat, ErrorResult& aRv) {
|
const GlobalObject& aGlobal, CompressionFormat aFormat, ErrorResult& aRv) {
|
||||||
|
if (aFormat == CompressionFormat::Zstd) {
|
||||||
|
aRv.ThrowTypeError(
|
||||||
|
"'zstd' (value of argument 1) is not a valid value for enumeration "
|
||||||
|
"CompressionFormat.");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
// Step 1: If format is unsupported in CompressionStream, then throw a
|
// Step 1: If format is unsupported in CompressionStream, then throw a
|
||||||
// TypeError.
|
// TypeError.
|
||||||
// XXX: Skipped as we are using enum for this
|
// XXX: Skipped as we are using enum for this
|
||||||
|
|||||||
@@ -270,6 +270,14 @@ JSObject* DecompressionStream::WrapObject(JSContext* aCx,
|
|||||||
// https://wicg.github.io/compression/#dom-decompressionstream-decompressionstream
|
// https://wicg.github.io/compression/#dom-decompressionstream-decompressionstream
|
||||||
already_AddRefed<DecompressionStream> DecompressionStream::Constructor(
|
already_AddRefed<DecompressionStream> DecompressionStream::Constructor(
|
||||||
const GlobalObject& aGlobal, CompressionFormat aFormat, ErrorResult& aRv) {
|
const GlobalObject& aGlobal, CompressionFormat aFormat, ErrorResult& aRv) {
|
||||||
|
if (aFormat == CompressionFormat::Zstd &&
|
||||||
|
aGlobal.CallerType() != CallerType::System) {
|
||||||
|
aRv.ThrowTypeError(
|
||||||
|
"'zstd' (value of argument 1) is not a valid value for enumeration "
|
||||||
|
"CompressionFormat.");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
// Step 1: If format is unsupported in DecompressionStream, then throw a
|
// Step 1: If format is unsupported in DecompressionStream, then throw a
|
||||||
// TypeError.
|
// TypeError.
|
||||||
// XXX: Skipped as we are using enum for this
|
// XXX: Skipped as we are using enum for this
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ enum CompressionFormat {
|
|||||||
"deflate",
|
"deflate",
|
||||||
"deflate-raw",
|
"deflate-raw",
|
||||||
"gzip",
|
"gzip",
|
||||||
|
"zstd",
|
||||||
};
|
};
|
||||||
|
|
||||||
[Exposed=*]
|
[Exposed=*]
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
// META: global=window
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
test(t => {
|
||||||
|
assert_throws_js(
|
||||||
|
TypeError,
|
||||||
|
() => new CompressionStream("zstd"),
|
||||||
|
'Constructor given "zstd" should throw'
|
||||||
|
);
|
||||||
|
}, '"zstd" should be an invalid CompressionStream option');
|
||||||
|
|
||||||
|
promise_test(async t => {
|
||||||
|
const constructorFailed = await SpecialPowers.spawnChrome([], () => {
|
||||||
|
let cs;
|
||||||
|
|
||||||
|
try {
|
||||||
|
cs = new this.browsingContext.topChromeWindow.CompressionStream("zstd");
|
||||||
|
} catch {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cs) {
|
||||||
|
throw new Error(
|
||||||
|
'Constructed a CompressionStream with "zstd" format, when that should be disallowed'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assert_true(
|
||||||
|
constructorFailed,
|
||||||
|
'Constructor given "zstd" should throw, even in a privileged context'
|
||||||
|
);
|
||||||
|
}, '"zstd" should be an invalid CompressionStream format, even in a privileged context');
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
// META: global=window
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
test(t => {
|
||||||
|
assert_throws_js(
|
||||||
|
TypeError,
|
||||||
|
() => new DecompressionStream("zstd"),
|
||||||
|
'Constructor given "zstd" should throw.'
|
||||||
|
);
|
||||||
|
}, '"zstd" should be an invalid DecompressionStream format in an unprivileged context.');
|
||||||
|
|
||||||
|
promise_test(async t => {
|
||||||
|
const constructorSucceeded = await SpecialPowers.spawnChrome(
|
||||||
|
[],
|
||||||
|
function create_decompression_stream_in_chrome_context() {
|
||||||
|
const ds = new this.browsingContext.topChromeWindow.DecompressionStream(
|
||||||
|
"zstd"
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!ds) {
|
||||||
|
throw new Error(
|
||||||
|
'Failed to construct DecompressionStream with "zstd" format in privileged context.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_true(
|
||||||
|
constructorSucceeded,
|
||||||
|
'Constructor given "zstd" should succeed in a privileged context'
|
||||||
|
);
|
||||||
|
}, '"zstd" should be a valid DecompressionStream format in a privileged context.');
|
||||||
Reference in New Issue
Block a user