mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 09:31:22 -05:00
fix(webidl): Don't throw when converting a detached buffer source (#12585)
The Web IDL conversion to `BufferSource` and similar types shouldn't check whether the buffer is detached. In the case of `TextDecoder`, our implementation would still throw after the Web IDL conversions because we're creating a new `Uint8Array` from the buffer source's buffer, which throws if it's detached. This change also fixes this bug.
This commit is contained in:
parent
507ab50e0f
commit
74a93fdf63
3 changed files with 15 additions and 61 deletions
|
@ -105,14 +105,19 @@
|
|||
}
|
||||
|
||||
try {
|
||||
if (ArrayBufferIsView(input)) {
|
||||
input = new Uint8Array(
|
||||
input.buffer,
|
||||
input.byteOffset,
|
||||
input.byteLength,
|
||||
);
|
||||
} else {
|
||||
input = new Uint8Array(input);
|
||||
try {
|
||||
if (ArrayBufferIsView(input)) {
|
||||
input = new Uint8Array(
|
||||
input.buffer,
|
||||
input.byteOffset,
|
||||
input.byteLength,
|
||||
);
|
||||
} else {
|
||||
input = new Uint8Array(input);
|
||||
}
|
||||
} catch {
|
||||
// If the buffer is detached, just create a new empty Uint8Array.
|
||||
input = new Uint8Array();
|
||||
}
|
||||
if (input.buffer instanceof SharedArrayBuffer) {
|
||||
// We clone the data into a non-shared ArrayBuffer so we can pass it
|
||||
|
|
|
@ -441,15 +441,6 @@
|
|||
return V instanceof SharedArrayBuffer;
|
||||
}
|
||||
|
||||
function isArrayBufferDetached(V) {
|
||||
try {
|
||||
new Uint8Array(V);
|
||||
return false;
|
||||
} catch {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
converters.ArrayBuffer = (V, opts = {}) => {
|
||||
if (!isNonSharedArrayBuffer(V)) {
|
||||
if (opts.allowShared && !isSharedArrayBuffer(V)) {
|
||||
|
@ -461,9 +452,6 @@
|
|||
}
|
||||
throw makeException(TypeError, "is not an ArrayBuffer", opts);
|
||||
}
|
||||
if (isArrayBufferDetached(V)) {
|
||||
throw makeException(TypeError, "is a detached ArrayBuffer", opts);
|
||||
}
|
||||
|
||||
return V;
|
||||
};
|
||||
|
@ -480,13 +468,6 @@
|
|||
opts,
|
||||
);
|
||||
}
|
||||
if (isArrayBufferDetached(V.buffer)) {
|
||||
throw makeException(
|
||||
TypeError,
|
||||
"is backed by a detached ArrayBuffer",
|
||||
opts,
|
||||
);
|
||||
}
|
||||
|
||||
return V;
|
||||
};
|
||||
|
@ -529,13 +510,6 @@
|
|||
opts,
|
||||
);
|
||||
}
|
||||
if (isArrayBufferDetached(V.buffer)) {
|
||||
throw makeException(
|
||||
TypeError,
|
||||
"is a view on a detached ArrayBuffer",
|
||||
opts,
|
||||
);
|
||||
}
|
||||
|
||||
return V;
|
||||
};
|
||||
|
@ -561,13 +535,6 @@
|
|||
);
|
||||
}
|
||||
|
||||
if (isArrayBufferDetached(V.buffer)) {
|
||||
throw makeException(
|
||||
TypeError,
|
||||
"is a view on a detached ArrayBuffer",
|
||||
opts,
|
||||
);
|
||||
}
|
||||
return V;
|
||||
};
|
||||
|
||||
|
@ -581,13 +548,6 @@
|
|||
);
|
||||
}
|
||||
|
||||
if (isArrayBufferDetached(V.buffer)) {
|
||||
throw makeException(
|
||||
TypeError,
|
||||
"is a view on a detached ArrayBuffer",
|
||||
opts,
|
||||
);
|
||||
}
|
||||
return V;
|
||||
}
|
||||
|
||||
|
@ -609,9 +569,6 @@
|
|||
opts,
|
||||
);
|
||||
}
|
||||
if (isArrayBufferDetached(V)) {
|
||||
throw makeException(TypeError, "is a detached ArrayBuffer", opts);
|
||||
}
|
||||
|
||||
return V;
|
||||
};
|
||||
|
|
|
@ -5908,7 +5908,6 @@
|
|||
"api-surrogates-utf8.any.html": true,
|
||||
"api-surrogates-utf8.any.worker.html": true,
|
||||
"encodeInto.any.html": [
|
||||
"encodeInto() and a detached output buffer",
|
||||
"encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 0, filler 0",
|
||||
"encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 4, filler 0",
|
||||
"encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 0, filler 128",
|
||||
|
@ -5953,7 +5952,6 @@
|
|||
"encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 4, filler random"
|
||||
],
|
||||
"encodeInto.any.worker.html": [
|
||||
"encodeInto() and a detached output buffer",
|
||||
"encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 0, filler 0",
|
||||
"encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 4, filler 0",
|
||||
"encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 0, filler 128",
|
||||
|
@ -6028,14 +6026,8 @@
|
|||
"decode-non-utf8.any.worker.html": true,
|
||||
"decode-split-character.any.html": true,
|
||||
"decode-split-character.any.worker.html": true,
|
||||
"decode-utf8.any.html": [
|
||||
"decoding a transferred Uint8Array chunk should give no output",
|
||||
"decoding a transferred ArrayBuffer chunk should give no output"
|
||||
],
|
||||
"decode-utf8.any.worker.html": [
|
||||
"decoding a transferred Uint8Array chunk should give no output",
|
||||
"decoding a transferred ArrayBuffer chunk should give no output"
|
||||
],
|
||||
"decode-utf8.any.html": true,
|
||||
"decode-utf8.any.worker.html": true,
|
||||
"encode-bad-chunks.any.html": true,
|
||||
"encode-bad-chunks.any.worker.html": true,
|
||||
"encode-utf8.any.html": true,
|
||||
|
|
Loading…
Add table
Reference in a new issue