Commit f8e2ba43 authored by Jeremy Roman's avatar Jeremy Roman Committed by Commit Bot

Revert "Throw a DataCloneError if a neutered ArrayBuffer occurs in the transfer list."

This reverts commit ade1dc7a.

Reason for revert: Further discussion on the bug (https://bugs.chromium.org/p/chromium/issues/detail?id=816447#c8); moving towards Chrome's previous behavior.

Original change's description:
> Throw a DataCloneError if a neutered ArrayBuffer occurs in the transfer list.
> 
> Currently the exception is not thrown until after serialization.
> This makes us consistent with Gecko and WebKit, which throw before serialization.
> 
> This fixes the second test case in https://github.com/w3c/web-platform-tests/pull/9672
> (not yet pushed to upstream WPT).
> 
> Bug: 816447
> Change-Id: I30b798b5d21dc8d6f2a40d049ced6aa7f60dd090
> Reviewed-on: https://chromium-review.googlesource.com/956254
> Reviewed-by: Kentaro Hara <haraken@chromium.org>
> Reviewed-by: Marijn Kruisselbrink <mek@chromium.org>
> Commit-Queue: Jeremy Roman <jbroman@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#542484}

TBR=jbroman@chromium.org,mek@chromium.org,haraken@chromium.org

# Not skipping CQ checks because original CL landed > 1 day ago.

Bug: 816447
Change-Id: I79950f8ba97e5481a872cc4897d62506fb2381b0
Reviewed-on: https://chromium-review.googlesource.com/960926Reviewed-by: default avatarJeremy Roman <jbroman@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarMarijn Kruisselbrink <mek@chromium.org>
Commit-Queue: Jeremy Roman <jbroman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#543092}
parent 7ceeebaf
<!DOCTYPE html>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script>
test(() => {
var arrayBuffer = new ArrayBuffer(32);
postMessage(null, '*', [arrayBuffer]);
assert_throws('DataCloneError', () => {
postMessage(null, '*', [arrayBuffer]);
});
}, "Exception should be thrown if ArrayBuffer is neutered before serialization.");
test(() => {
var arrayBuffer = new ArrayBuffer(32);
postMessage(null, '*', [arrayBuffer]);
assert_throws('DataCloneError', () => {
postMessage({
get a() { assert_unreached('DataCloneError should be thrown first.'); }
}, '*', [arrayBuffer]);
});
}, "Exception for neutered ArrayBuffer should be thrown before serialization.");
test(() => {
var arrayBuffer = new ArrayBuffer(32);
assert_throws('DataCloneError', () => {
postMessage({
get a() { postMessage(null, '*', [arrayBuffer]); }
}, '*', [arrayBuffer]);
});
}, "Exception should be thrown if ArrayBuffer is neutered during serialization.");
</script>
...@@ -455,12 +455,6 @@ bool SerializedScriptValue::ExtractTransferables( ...@@ -455,12 +455,6 @@ bool SerializedScriptValue::ExtractTransferables(
} else if (transferable_object->IsArrayBuffer()) { } else if (transferable_object->IsArrayBuffer()) {
DOMArrayBuffer* array_buffer = V8ArrayBuffer::ToImpl( DOMArrayBuffer* array_buffer = V8ArrayBuffer::ToImpl(
v8::Local<v8::Object>::Cast(transferable_object)); v8::Local<v8::Object>::Cast(transferable_object));
if (array_buffer->IsNeutered()) {
exception_state.ThrowDOMException(
kDataCloneError, "ArrayBuffer at index " + String::Number(i) +
" is already neutered.");
return false;
}
if (transferables.array_buffers.Contains(array_buffer)) { if (transferables.array_buffers.Contains(array_buffer)) {
exception_state.ThrowDOMException( exception_state.ThrowDOMException(
kDataCloneError, "ArrayBuffer at index " + String::Number(i) + kDataCloneError, "ArrayBuffer at index " + String::Number(i) +
...@@ -539,6 +533,17 @@ SerializedScriptValue::TransferArrayBufferContents( ...@@ -539,6 +533,17 @@ SerializedScriptValue::TransferArrayBufferContents(
if (!array_buffers.size()) if (!array_buffers.size())
return ArrayBufferContentsArray(); return ArrayBufferContentsArray();
for (auto it = array_buffers.begin(); it != array_buffers.end(); ++it) {
DOMArrayBufferBase* array_buffer = *it;
if (array_buffer->IsNeutered()) {
size_t index = std::distance(array_buffers.begin(), it);
exception_state.ThrowDOMException(
kDataCloneError, "ArrayBuffer at index " + String::Number(index) +
" is already neutered.");
return ArrayBufferContentsArray();
}
}
contents.Grow(array_buffers.size()); contents.Grow(array_buffers.size());
HeapHashSet<Member<DOMArrayBufferBase>> visited; HeapHashSet<Member<DOMArrayBufferBase>> visited;
for (auto it = array_buffers.begin(); it != array_buffers.end(); ++it) { for (auto it = array_buffers.begin(); it != array_buffers.end(); ++it) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment