Diff
Modified: branches/safari-603-branch/LayoutTests/ChangeLog (212594 => 212595)
--- branches/safari-603-branch/LayoutTests/ChangeLog 2017-02-17 23:59:35 UTC (rev 212594)
+++ branches/safari-603-branch/LayoutTests/ChangeLog 2017-02-18 00:10:01 UTC (rev 212595)
@@ -1,5 +1,41 @@
2017-02-17 Matthew Hanson <matthew_han...@apple.com>
+ Merge r212035. rdar://problem/30433204
+
+ 2017-02-09 Filip Pizlo <fpi...@apple.com>
+
+ SharedArrayBuffer does not need to be in the transfer list
+ https://bugs.webkit.org/show_bug.cgi?id=168079
+
+ Reviewed by Geoffrey Garen and Keith Miller.
+
+ This adds tests that ensure that SABs behave correctly (are either cloned or shared)
+ depending on context, and that we currently share SABs whether they are in the transfer
+ list or not. This also adds tests for SABs being passed around via more complicated
+ data structures.
+
+ * workers/sab/multi-memory-expected.txt: Added.
+ * workers/sab/multi-memory-multi-buffer-expected.txt: Added.
+ * workers/sab/multi-memory-multi-buffer.html: Added.
+ * workers/sab/multi-memory-worker-1.js: Added.
+ (onmessage):
+ * workers/sab/multi-memory-worker-2.js: Added.
+ (onmessage):
+ * workers/sab/multi-memory.html: Added.
+ * workers/sab/no-transfer-expected.txt: Added.
+ * workers/sab/no-transfer.html: Added.
+ * workers/sab/postMessage-clones-expected.txt: Added.
+ * workers/sab/postMessage-clones.html: Added.
+ * workers/sab/sab-creator-no-transfer.js: Added.
+ * workers/sab/sab-creator-transfer.js: Added.
+ * workers/sab/sent-from-worker-no-transfer-expected.txt: Added.
+ * workers/sab/sent-from-worker-no-transfer.html: Added.
+ * workers/sab/sent-from-worker-transfer-expected.txt: Added.
+ * workers/sab/sent-from-worker-transfer.html: Added.
+ * workers/sab/worker-resources.js:
+
+2017-02-17 Matthew Hanson <matthew_han...@apple.com>
+
Rollout r212488. rdar://problem/29904368
2017-02-17 Matthew Hanson <matthew_han...@apple.com>
Added: branches/safari-603-branch/LayoutTests/workers/sab/multi-memory-expected.txt (0 => 212595)
--- branches/safari-603-branch/LayoutTests/workers/sab/multi-memory-expected.txt (rev 0)
+++ branches/safari-603-branch/LayoutTests/workers/sab/multi-memory-expected.txt 2017-02-18 00:10:01 UTC (rev 212595)
@@ -0,0 +1,3 @@
+All workers done!
+Test passed!
+
Added: branches/safari-603-branch/LayoutTests/workers/sab/multi-memory-multi-buffer-expected.txt (0 => 212595)
--- branches/safari-603-branch/LayoutTests/workers/sab/multi-memory-multi-buffer-expected.txt (rev 0)
+++ branches/safari-603-branch/LayoutTests/workers/sab/multi-memory-multi-buffer-expected.txt 2017-02-18 00:10:01 UTC (rev 212595)
@@ -0,0 +1,3 @@
+All workers done!
+Test passed!
+
Added: branches/safari-603-branch/LayoutTests/workers/sab/multi-memory-multi-buffer.html (0 => 212595)
--- branches/safari-603-branch/LayoutTests/workers/sab/multi-memory-multi-buffer.html (rev 0)
+++ branches/safari-603-branch/LayoutTests/workers/sab/multi-memory-multi-buffer.html 2017-02-18 00:10:01 UTC (rev 212595)
@@ -0,0 +1,88 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+</head>
+<body>
+<script>
+function getOrCreate(id, tagName)
+{
+ var element = document.getElementById(id);
+ if (element)
+ return element;
+
+ element = document.createElement(tagName);
+ element.id = id;
+ var parent = document.body || document.documentElement;
+ var refNode = parent.firstChild;
+
+ parent.insertBefore(element, refNode);
+ return element;
+}
+
+function debug(msg)
+{
+ var span = document.createElement("span");
+ getOrCreate("console", "div").appendChild(span); // insert it first so XHTML knows the namespace
+ span.innerHTML = msg + '<br />';
+}
+
+if (window.testRunner) {
+ testRunner.dumpAsText();
+ testRunner.waitUntilDone();
+}
+
+var verbose = false;
+
+var didStart = new Int32Array(new SharedArrayBuffer(4), 0, 1);
+var shouldGo = new Int32Array(new SharedArrayBuffer(4), 0, 1);
+var didEnd = new Int32Array(new SharedArrayBuffer(4), 0, 1);
+
+var numWorkers = 0;
+function startWorker(file)
+{
+ if (verbose)
+ debug("Starting worker: " + file);
+ numWorkers++;
+ var worker = new Worker(file);
+ worker._onmessage_ = function(event) {
+ if (event.data == "done") {
+ if (verbose)
+ debug("Finished worker: " + file);
+ if (--numWorkers)
+ return;
+ debug("All workers done!");
+ done();
+ return;
+ }
+ if (event.data.indexOf("Error") == 0) {
+ debug("Test failed: "+ event.data);
+ if (window.testRunner)
+ testRunner.notifyDone();
+ }
+
+ if (verbose)
+ debug("Event from " + file + ": " + event.data);
+ };
+ worker.postMessage({didStart: didStart, shouldGo: shouldGo, didEnd: didEnd, shouldShareBuffer: false});
+}
+
+function done()
+{
+ if (didStart[0] != 1)
+ throw "Error: Bad value at didStart[0]: " + didStart[0];
+ if (shouldGo[0] != 1)
+ throw "Error: Bad value at shouldGo[0]: " + shouldGo[0];
+ if (didEnd[0] != 1)
+ throw "Error: Bad value at didEnd[0]: " + didEnd[0];
+ debug("Test passed!");
+
+ if (window.testRunner)
+ testRunner.notifyDone();
+}
+
+startWorker("multi-memory-worker-1.js");
+startWorker("multi-memory-worker-2.js");
+
+</script>
+</body>
+</html>
Added: branches/safari-603-branch/LayoutTests/workers/sab/multi-memory-worker-1.js (0 => 212595)
--- branches/safari-603-branch/LayoutTests/workers/sab/multi-memory-worker-1.js (rev 0)
+++ branches/safari-603-branch/LayoutTests/workers/sab/multi-memory-worker-1.js 2017-02-18 00:10:01 UTC (rev 212595)
@@ -0,0 +1,29 @@
+importScripts("worker-resources.js");
+
+_onmessage_ = function (event) {
+ var didStart = event.data.didStart;
+ var shouldGo = event.data.shouldGo;
+ var didEnd = event.data.didEnd;
+
+ checkBufferSharing(event.data.shouldShareBuffer, didStart, shouldGo, didEnd);
+
+ postMessage("Started!");
+ postMessage("didStart: " + didStart);
+ postMessage("shouldGo: " + shouldGo);
+ postMessage("didEnd: " + didEnd);
+
+ wait(didStart, 0, 0, 1);
+
+ postMessage("It started!");
+
+ shouldGo[0] = 1;
+ wake(shouldGo, 0);
+
+ wait(didEnd, 0, 0, 1);
+
+ postMessage("All done!");
+ postMessage("didStart: " + didStart);
+ postMessage("shouldGo: " + shouldGo);
+ postMessage("didEnd: " + didEnd);
+ postMessage("done");
+}
Added: branches/safari-603-branch/LayoutTests/workers/sab/multi-memory-worker-2.js (0 => 212595)
--- branches/safari-603-branch/LayoutTests/workers/sab/multi-memory-worker-2.js (rev 0)
+++ branches/safari-603-branch/LayoutTests/workers/sab/multi-memory-worker-2.js 2017-02-18 00:10:01 UTC (rev 212595)
@@ -0,0 +1,27 @@
+importScripts("worker-resources.js");
+
+_onmessage_ = function(event) {
+ var didStart = event.data.didStart;
+ var shouldGo = event.data.shouldGo;
+ var didEnd = event.data.didEnd;
+
+ checkBufferSharing(event.data.shouldShareBuffer, didStart, shouldGo, didEnd);
+
+ postMessage("Started!");
+ postMessage("didStart: " + didStart);
+ postMessage("shouldGo: " + shouldGo);
+ postMessage("didEnd: " + didEnd);
+
+ Atomics.store(didStart, 0, 1);
+ wake(didStart, 0);
+
+ wait(shouldGo, 0, 0, 1);
+
+ Atomics.store(didEnd, 0, 1);
+ wake(didEnd, 0, 1);
+
+ postMessage("didStart: " + didStart);
+ postMessage("shouldGo: " + shouldGo);
+ postMessage("didEnd: " + didEnd);
+ postMessage("done");
+}
Added: branches/safari-603-branch/LayoutTests/workers/sab/multi-memory.html (0 => 212595)
--- branches/safari-603-branch/LayoutTests/workers/sab/multi-memory.html (rev 0)
+++ branches/safari-603-branch/LayoutTests/workers/sab/multi-memory.html 2017-02-18 00:10:01 UTC (rev 212595)
@@ -0,0 +1,90 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+</head>
+<body>
+<script>
+function getOrCreate(id, tagName)
+{
+ var element = document.getElementById(id);
+ if (element)
+ return element;
+
+ element = document.createElement(tagName);
+ element.id = id;
+ var parent = document.body || document.documentElement;
+ var refNode = parent.firstChild;
+
+ parent.insertBefore(element, refNode);
+ return element;
+}
+
+function debug(msg)
+{
+ var span = document.createElement("span");
+ getOrCreate("console", "div").appendChild(span); // insert it first so XHTML knows the namespace
+ span.innerHTML = msg + '<br />';
+}
+
+if (window.testRunner) {
+ testRunner.dumpAsText();
+ testRunner.waitUntilDone();
+}
+
+var verbose = false;
+
+var sab = new SharedArrayBuffer(3 * 4);
+
+var didStart = new Int32Array(sab, 0, 1);
+var shouldGo = new Int32Array(sab, 4, 1);
+var didEnd = new Int32Array(sab, 8, 1);
+
+var numWorkers = 0;
+function startWorker(file)
+{
+ if (verbose)
+ debug("Starting worker: " + file);
+ numWorkers++;
+ var worker = new Worker(file);
+ worker._onmessage_ = function(event) {
+ if (event.data == "done") {
+ if (verbose)
+ debug("Finished worker: " + file);
+ if (--numWorkers)
+ return;
+ debug("All workers done!");
+ done();
+ return;
+ }
+ if (event.data.indexOf("Error") == 0) {
+ debug("Test failed: "+ event.data);
+ if (window.testRunner)
+ testRunner.notifyDone();
+ }
+
+ if (verbose)
+ debug("Event from " + file + ": " + event.data);
+ };
+ worker.postMessage({didStart: didStart, shouldGo: shouldGo, didEnd: didEnd, shouldShareBuffer: true});
+}
+
+function done()
+{
+ if (didStart[0] != 1)
+ throw "Error: Bad value at didStart[0]: " + didStart[0];
+ if (shouldGo[0] != 1)
+ throw "Error: Bad value at shouldGo[0]: " + shouldGo[0];
+ if (didEnd[0] != 1)
+ throw "Error: Bad value at didEnd[0]: " + didEnd[0];
+ debug("Test passed!");
+
+ if (window.testRunner)
+ testRunner.notifyDone();
+}
+
+startWorker("multi-memory-worker-1.js");
+startWorker("multi-memory-worker-2.js");
+
+</script>
+</body>
+</html>
Added: branches/safari-603-branch/LayoutTests/workers/sab/no-transfer-expected.txt (0 => 212595)
--- branches/safari-603-branch/LayoutTests/workers/sab/no-transfer-expected.txt (rev 0)
+++ branches/safari-603-branch/LayoutTests/workers/sab/no-transfer-expected.txt 2017-02-18 00:10:01 UTC (rev 212595)
@@ -0,0 +1,3 @@
+All workers done!
+Test passed!
+
Added: branches/safari-603-branch/LayoutTests/workers/sab/no-transfer.html (0 => 212595)
--- branches/safari-603-branch/LayoutTests/workers/sab/no-transfer.html (rev 0)
+++ branches/safari-603-branch/LayoutTests/workers/sab/no-transfer.html 2017-02-18 00:10:01 UTC (rev 212595)
@@ -0,0 +1,90 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+</head>
+<body>
+<script>
+function getOrCreate(id, tagName)
+{
+ var element = document.getElementById(id);
+ if (element)
+ return element;
+
+ element = document.createElement(tagName);
+ element.id = id;
+ var parent = document.body || document.documentElement;
+ var refNode = parent.firstChild;
+
+ parent.insertBefore(element, refNode);
+ return element;
+}
+
+function debug(msg)
+{
+ var span = document.createElement("span");
+ getOrCreate("console", "div").appendChild(span); // insert it first so XHTML knows the namespace
+ span.innerHTML = msg + '<br />';
+}
+
+if (window.testRunner) {
+ testRunner.dumpAsText();
+ testRunner.waitUntilDone();
+}
+
+var verbose = false;
+
+var sab = new SharedArrayBuffer(100 * 4);
+
+var memory = new Int32Array(sab);
+
+var numWorkers = 0;
+function startWorker(file)
+{
+ if (verbose)
+ debug("Starting worker: " + file);
+ numWorkers++;
+ var worker = new Worker(file);
+ worker._onmessage_ = function(event) {
+ if (event.data == "done") {
+ if (verbose)
+ debug("Finished worker: " + file);
+ if (--numWorkers)
+ return;
+ debug("All workers done!");
+ done();
+ return;
+ }
+ if (event.data.indexOf("Error") == 0) {
+ debug("Test failed: "+ event.data);
+ if (window.testRunner)
+ testRunner.notifyDone();
+ }
+
+ if (verbose)
+ debug("Event from " + file + ": " + event.data);
+ };
+ worker.postMessage(memory);
+}
+
+function done()
+{
+ for (var i = 0; i < 3; ++i) {
+ if (memory[i] != 1)
+ throw "Error: Bad value at memory[" + i + "]: " + memory[i];
+ }
+ for (var i = 3; i < memory.length; ++i) {
+ if (memory[i] != 0)
+ throw "Error: Bad value at memory[" + i + "]: " + memory[i];
+ }
+ debug("Test passed!");
+
+ if (window.testRunner)
+ testRunner.notifyDone();
+}
+
+startWorker("simple-worker-1.js");
+startWorker("simple-worker-2.js");
+
+</script>
+</body>
+</html>
Added: branches/safari-603-branch/LayoutTests/workers/sab/postMessage-clones-expected.txt (0 => 212595)
--- branches/safari-603-branch/LayoutTests/workers/sab/postMessage-clones-expected.txt (rev 0)
+++ branches/safari-603-branch/LayoutTests/workers/sab/postMessage-clones-expected.txt 2017-02-18 00:10:01 UTC (rev 212595)
@@ -0,0 +1,13 @@
+Checks that window.postMessage clones SharedArrayBuffers
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+PASS memory[0] is 42
+PASS otherMemory[0] is 0
+PASS memory[0] is 42
+PASS otherMemory[0] is 43
+
Added: branches/safari-603-branch/LayoutTests/workers/sab/postMessage-clones.html (0 => 212595)
--- branches/safari-603-branch/LayoutTests/workers/sab/postMessage-clones.html (rev 0)
+++ branches/safari-603-branch/LayoutTests/workers/sab/postMessage-clones.html 2017-02-18 00:10:01 UTC (rev 212595)
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src=""
+</head>
+<body>
+<script>
+description("Checks that window.postMessage clones SharedArrayBuffers");
+
+if (window.testRunner)
+ testRunner.waitUntilDone();
+
+var sab = new SharedArrayBuffer(4);
+var memory = new Int32Array(sab);
+var otherMemory;
+
+window.addEventListener("message", function (event) {
+ otherMemory = event.data;
+ memory[0] = 42;
+ shouldBe("memory[0]", "42");
+ shouldBe("otherMemory[0]", "0");
+ otherMemory[0] = 43;
+ shouldBe("memory[0]", "42");
+ shouldBe("otherMemory[0]", "43");
+ if (window.testRunner)
+ testRunner.notifyDone();
+});
+
+postMessage(memory, "*");
+</script>
+<script src=""
+</body>
+</html>
Added: branches/safari-603-branch/LayoutTests/workers/sab/sab-creator-no-transfer.js (0 => 212595)
--- branches/safari-603-branch/LayoutTests/workers/sab/sab-creator-no-transfer.js (rev 0)
+++ branches/safari-603-branch/LayoutTests/workers/sab/sab-creator-no-transfer.js 2017-02-18 00:10:01 UTC (rev 212595)
@@ -0,0 +1,4 @@
+var sab = new SharedArrayBuffer(100 * 4);
+var memory = new Int32Array(sab);
+postMessage(memory);
+
Added: branches/safari-603-branch/LayoutTests/workers/sab/sab-creator-transfer.js (0 => 212595)
--- branches/safari-603-branch/LayoutTests/workers/sab/sab-creator-transfer.js (rev 0)
+++ branches/safari-603-branch/LayoutTests/workers/sab/sab-creator-transfer.js 2017-02-18 00:10:01 UTC (rev 212595)
@@ -0,0 +1,4 @@
+var sab = new SharedArrayBuffer(100 * 4);
+var memory = new Int32Array(sab);
+postMessage(memory, [sab]);
+
Added: branches/safari-603-branch/LayoutTests/workers/sab/sent-from-worker-no-transfer-expected.txt (0 => 212595)
--- branches/safari-603-branch/LayoutTests/workers/sab/sent-from-worker-no-transfer-expected.txt (rev 0)
+++ branches/safari-603-branch/LayoutTests/workers/sab/sent-from-worker-no-transfer-expected.txt 2017-02-18 00:10:01 UTC (rev 212595)
@@ -0,0 +1,3 @@
+All workers done!
+Test passed!
+
Added: branches/safari-603-branch/LayoutTests/workers/sab/sent-from-worker-no-transfer.html (0 => 212595)
--- branches/safari-603-branch/LayoutTests/workers/sab/sent-from-worker-no-transfer.html (rev 0)
+++ branches/safari-603-branch/LayoutTests/workers/sab/sent-from-worker-no-transfer.html 2017-02-18 00:10:01 UTC (rev 212595)
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+</head>
+<body>
+<script>
+function getOrCreate(id, tagName)
+{
+ var element = document.getElementById(id);
+ if (element)
+ return element;
+
+ element = document.createElement(tagName);
+ element.id = id;
+ var parent = document.body || document.documentElement;
+ var refNode = parent.firstChild;
+
+ parent.insertBefore(element, refNode);
+ return element;
+}
+
+function debug(msg)
+{
+ var span = document.createElement("span");
+ getOrCreate("console", "div").appendChild(span); // insert it first so XHTML knows the namespace
+ span.innerHTML = msg + '<br />';
+}
+
+if (window.testRunner) {
+ testRunner.dumpAsText();
+ testRunner.waitUntilDone();
+}
+
+var verbose = false;
+
+var memory;
+
+var numWorkers = 0;
+function startWorker(file)
+{
+ if (verbose)
+ debug("Starting worker: " + file);
+ numWorkers++;
+ var worker = new Worker(file);
+ worker._onmessage_ = function(event) {
+ if (event.data == "done") {
+ if (verbose)
+ debug("Finished worker: " + file);
+ if (--numWorkers)
+ return;
+ debug("All workers done!");
+ done();
+ return;
+ }
+ if (event.data.indexOf("Error") == 0) {
+ debug("Test failed: "+ event.data);
+ if (window.testRunner)
+ testRunner.notifyDone();
+ }
+
+ if (verbose)
+ debug("Event from " + file + ": " + event.data);
+ };
+ worker.postMessage(memory);
+}
+
+function done()
+{
+ for (var i = 0; i < 3; ++i) {
+ if (memory[i] != 1)
+ throw "Error: Bad value at memory[" + i + "]: " + memory[i];
+ }
+ for (var i = 3; i < memory.length; ++i) {
+ if (memory[i] != 0)
+ throw "Error: Bad value at memory[" + i + "]: " + memory[i];
+ }
+ debug("Test passed!");
+
+ if (window.testRunner)
+ testRunner.notifyDone();
+}
+
+var sabCreator = new Worker("sab-creator-no-transfer.js");
+sabCreator._onmessage_ = function(event) {
+ memory = event.data;
+
+ startWorker("simple-worker-1.js");
+ startWorker("simple-worker-2.js");
+};
+
+</script>
+</body>
+</html>
Added: branches/safari-603-branch/LayoutTests/workers/sab/sent-from-worker-transfer-expected.txt (0 => 212595)
--- branches/safari-603-branch/LayoutTests/workers/sab/sent-from-worker-transfer-expected.txt (rev 0)
+++ branches/safari-603-branch/LayoutTests/workers/sab/sent-from-worker-transfer-expected.txt 2017-02-18 00:10:01 UTC (rev 212595)
@@ -0,0 +1,3 @@
+All workers done!
+Test passed!
+
Added: branches/safari-603-branch/LayoutTests/workers/sab/sent-from-worker-transfer.html (0 => 212595)
--- branches/safari-603-branch/LayoutTests/workers/sab/sent-from-worker-transfer.html (rev 0)
+++ branches/safari-603-branch/LayoutTests/workers/sab/sent-from-worker-transfer.html 2017-02-18 00:10:01 UTC (rev 212595)
@@ -0,0 +1,95 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+</head>
+<body>
+<script>
+function getOrCreate(id, tagName)
+{
+ var element = document.getElementById(id);
+ if (element)
+ return element;
+
+ element = document.createElement(tagName);
+ element.id = id;
+ var parent = document.body || document.documentElement;
+ var refNode = parent.firstChild;
+
+ parent.insertBefore(element, refNode);
+ return element;
+}
+
+function debug(msg)
+{
+ var span = document.createElement("span");
+ getOrCreate("console", "div").appendChild(span); // insert it first so XHTML knows the namespace
+ span.innerHTML = msg + '<br />';
+}
+
+if (window.testRunner) {
+ testRunner.dumpAsText();
+ testRunner.waitUntilDone();
+}
+
+var verbose = false;
+
+var sab;
+var memory;
+
+var numWorkers = 0;
+function startWorker(file)
+{
+ if (verbose)
+ debug("Starting worker: " + file);
+ numWorkers++;
+ var worker = new Worker(file);
+ worker._onmessage_ = function(event) {
+ if (event.data == "done") {
+ if (verbose)
+ debug("Finished worker: " + file);
+ if (--numWorkers)
+ return;
+ debug("All workers done!");
+ done();
+ return;
+ }
+ if (event.data.indexOf("Error") == 0) {
+ debug("Test failed: "+ event.data);
+ if (window.testRunner)
+ testRunner.notifyDone();
+ }
+
+ if (verbose)
+ debug("Event from " + file + ": " + event.data);
+ };
+ worker.postMessage(memory, [sab]);
+}
+
+function done()
+{
+ for (var i = 0; i < 3; ++i) {
+ if (memory[i] != 1)
+ throw "Error: Bad value at memory[" + i + "]: " + memory[i];
+ }
+ for (var i = 3; i < memory.length; ++i) {
+ if (memory[i] != 0)
+ throw "Error: Bad value at memory[" + i + "]: " + memory[i];
+ }
+ debug("Test passed!");
+
+ if (window.testRunner)
+ testRunner.notifyDone();
+}
+
+var sabCreator = new Worker("sab-creator-transfer.js");
+sabCreator._onmessage_ = function(event) {
+ memory = event.data;
+ sab = memory.buffer;
+
+ startWorker("simple-worker-1.js");
+ startWorker("simple-worker-2.js");
+};
+
+</script>
+</body>
+</html>
Modified: branches/safari-603-branch/LayoutTests/workers/sab/worker-resources.js (212594 => 212595)
--- branches/safari-603-branch/LayoutTests/workers/sab/worker-resources.js 2017-02-17 23:59:35 UTC (rev 212594)
+++ branches/safari-603-branch/LayoutTests/workers/sab/worker-resources.js 2017-02-18 00:10:01 UTC (rev 212595)
@@ -33,3 +33,21 @@
}
}
+function checkBufferSharing(shouldShareBuffer)
+{
+ var set = new Set();
+ for (var i = 1; i < arguments.length; ++i)
+ set.add(arguments[i].buffer);
+ if (shouldShareBuffer) {
+ if (set.size != 1) {
+ postMessage("Error: buffers should be shared but are not shared (set.size == " + set.size + ")");
+ postMessage("error");
+ }
+ } else {
+ if (set.size != arguments.length - 1) {
+ postMessage("Error: buffers should not be shared but are shared");
+ postMessage("error");
+ }
+ }
+}
+
Modified: branches/safari-603-branch/Source/_javascript_Core/ChangeLog (212594 => 212595)
--- branches/safari-603-branch/Source/_javascript_Core/ChangeLog 2017-02-17 23:59:35 UTC (rev 212594)
+++ branches/safari-603-branch/Source/_javascript_Core/ChangeLog 2017-02-18 00:10:01 UTC (rev 212595)
@@ -1,5 +1,24 @@
2017-02-17 Matthew Hanson <matthew_han...@apple.com>
+ Merge r212035. rdar://problem/30433204
+
+ 2017-02-09 Filip Pizlo <fpi...@apple.com>
+
+ SharedArrayBuffer does not need to be in the transfer list
+ https://bugs.webkit.org/show_bug.cgi?id=168079
+
+ Reviewed by Geoffrey Garen and Keith Miller.
+
+ Exposes a simple shareWith() API for when you know you want to share the contents of
+ a shared buffer. Also a useful explicit operator bool.
+
+ * runtime/ArrayBuffer.cpp:
+ (JSC::ArrayBuffer::shareWith):
+ * runtime/ArrayBuffer.h:
+ (JSC::ArrayBufferContents::operator bool):
+
+2017-02-17 Matthew Hanson <matthew_han...@apple.com>
+
Merge r212146. rdar://problem/28656664
2017-02-10 Mark Lam <mark....@apple.com>
Modified: branches/safari-603-branch/Source/_javascript_Core/runtime/ArrayBuffer.cpp (212594 => 212595)
--- branches/safari-603-branch/Source/_javascript_Core/runtime/ArrayBuffer.cpp 2017-02-17 23:59:35 UTC (rev 212594)
+++ branches/safari-603-branch/Source/_javascript_Core/runtime/ArrayBuffer.cpp 2017-02-18 00:10:01 UTC (rev 212595)
@@ -318,5 +318,16 @@
return true;
}
+bool ArrayBuffer::shareWith(ArrayBufferContents& result)
+{
+ if (!m_contents.m_data || !isShared()) {
+ result.m_data = nullptr;
+ return false;
+ }
+
+ m_contents.shareWith(result);
+ return true;
+}
+
} // namespace JSC
Modified: branches/safari-603-branch/Source/_javascript_Core/runtime/ArrayBuffer.h (212594 => 212595)
--- branches/safari-603-branch/Source/_javascript_Core/runtime/ArrayBuffer.h 2017-02-17 23:59:35 UTC (rev 212594)
+++ branches/safari-603-branch/Source/_javascript_Core/runtime/ArrayBuffer.h 2017-02-18 00:10:01 UTC (rev 212595)
@@ -64,6 +64,8 @@
JS_EXPORT_PRIVATE void clear();
+ explicit operator bool() { return !!m_data; }
+
void* data() const { return m_data; }
unsigned sizeInBytes() const { return m_sizeInBytes; }
@@ -130,6 +132,7 @@
inline void pinAndLock();
JS_EXPORT_PRIVATE bool transferTo(ArrayBufferContents&);
+ JS_EXPORT_PRIVATE bool shareWith(ArrayBufferContents&);
bool isNeutered() { return !m_contents.m_data; }
static ptrdiff_t offsetOfData() { return OBJECT_OFFSETOF(ArrayBuffer, m_contents) + OBJECT_OFFSETOF(ArrayBufferContents, m_data); }
Modified: branches/safari-603-branch/Source/WebCore/ChangeLog (212594 => 212595)
--- branches/safari-603-branch/Source/WebCore/ChangeLog 2017-02-17 23:59:35 UTC (rev 212594)
+++ branches/safari-603-branch/Source/WebCore/ChangeLog 2017-02-18 00:10:01 UTC (rev 212595)
@@ -1,5 +1,65 @@
2017-02-17 Matthew Hanson <matthew_han...@apple.com>
+ Merge r212035. rdar://problem/30433204
+
+ 2017-02-09 Filip Pizlo <fpi...@apple.com>
+
+ SharedArrayBuffer does not need to be in the transfer list
+ https://bugs.webkit.org/show_bug.cgi?id=168079
+
+ Reviewed by Geoffrey Garen and Keith Miller.
+
+ Tests: workers/sab/multi-memory-multi-buffer.html
+ workers/sab/multi-memory.html
+ workers/sab/no-transfer.html
+ workers/sab/postMessage-clones.html
+ workers/sab/sent-from-worker-no-transfer.html
+ workers/sab/sent-from-worker-transfer.html
+
+ The SAB API that we originally implemented required that SABs get put in transfer lists
+ when they are sent to workers.
+
+ The new SAB API that everyone is converging towards requires that you do not put the
+ SAB in the transfer list. That's supposed to be an error. Instead, anytime that a SAB
+ is part of any message to or from a dedicated worker then it is automatically shared.
+
+ The new API provides a lot more clarity about what is supposed to happen in contexts
+ that support transfering but don't support sharing.
+
+ Right now this patch allows both styles to work, but I hope we can disable the transfer
+ list capability soon.
+
+ * bindings/js/IDBBindingUtilities.cpp:
+ (WebCore::deserializeIDBValueToJSValue):
+ * bindings/js/JSMessageEventCustom.cpp:
+ (WebCore::JSMessageEvent::data):
+ * bindings/js/SerializedScriptValue.cpp:
+ (WebCore::CloneSerializer::serialize):
+ (WebCore::CloneSerializer::CloneSerializer):
+ (WebCore::CloneSerializer::dumpIfTerminal):
+ (WebCore::CloneDeserializer::deserialize):
+ (WebCore::CloneDeserializer::CloneDeserializer):
+ (WebCore::CloneDeserializer::readTerminal):
+ (WebCore::SerializedScriptValue::SerializedScriptValue):
+ (WebCore::SerializedScriptValue::create):
+ (WebCore::SerializedScriptValue::deserialize):
+ * bindings/js/SerializedScriptValue.h:
+ (): Deleted.
+ * dom/CustomEvent.cpp:
+ (WebCore::CustomEvent::trySerializeDetail):
+ * dom/ErrorEvent.cpp:
+ (WebCore::ErrorEvent::trySerializeError):
+ * dom/MessageEvent.cpp:
+ (WebCore::MessageEvent::trySerializeData):
+ * dom/PopStateEvent.cpp:
+ (WebCore::PopStateEvent::trySerializeState):
+ * workers/DedicatedWorkerGlobalScope.cpp:
+ (WebCore::DedicatedWorkerGlobalScope::postMessage):
+ * workers/Worker.cpp:
+ (WebCore::Worker::postMessage):
+
+2017-02-17 Matthew Hanson <matthew_han...@apple.com>
+
Rollout r212488. rdar://problem/29904368
2017-02-17 Matthew Hanson <matthew_han...@apple.com>
Modified: branches/safari-603-branch/Source/WebCore/bindings/js/IDBBindingUtilities.cpp (212594 => 212595)
--- branches/safari-603-branch/Source/WebCore/bindings/js/IDBBindingUtilities.cpp 2017-02-17 23:59:35 UTC (rev 212594)
+++ branches/safari-603-branch/Source/WebCore/bindings/js/IDBBindingUtilities.cpp 2017-02-18 00:10:01 UTC (rev 212595)
@@ -340,7 +340,7 @@
state.vm().apiLock().lock();
Vector<RefPtr<MessagePort>> messagePorts;
- JSValue result = serializedValue->deserialize(state, &globalObject, messagePorts, value.blobURLs(), value.blobFilePaths(), NonThrowing);
+ JSValue result = serializedValue->deserialize(state, &globalObject, messagePorts, value.blobURLs(), value.blobFilePaths(), SerializationErrorMode::NonThrowing);
state.vm().apiLock().unlock();
return result;
Modified: branches/safari-603-branch/Source/WebCore/bindings/js/JSMessageEventCustom.cpp (212594 => 212595)
--- branches/safari-603-branch/Source/WebCore/bindings/js/JSMessageEventCustom.cpp 2017-02-17 23:59:35 UTC (rev 212594)
+++ branches/safari-603-branch/Source/WebCore/bindings/js/JSMessageEventCustom.cpp 2017-02-18 00:10:01 UTC (rev 212595)
@@ -80,7 +80,7 @@
if (RefPtr<SerializedScriptValue> serializedValue = event.dataAsSerializedScriptValue()) {
Vector<RefPtr<MessagePort>> ports = wrapped().ports();
// FIXME: Why does this suppress exceptions?
- result = serializedValue->deserialize(state, globalObject(), ports, NonThrowing);
+ result = serializedValue->deserialize(state, globalObject(), ports, SerializationErrorMode::NonThrowing);
} else
result = jsNull();
break;
Modified: branches/safari-603-branch/Source/WebCore/bindings/js/SerializedScriptValue.cpp (212594 => 212595)
--- branches/safari-603-branch/Source/WebCore/bindings/js/SerializedScriptValue.cpp 2017-02-17 23:59:35 UTC (rev 212594)
+++ branches/safari-603-branch/Source/WebCore/bindings/js/SerializedScriptValue.cpp 2017-02-18 00:10:01 UTC (rev 212595)
@@ -144,6 +144,7 @@
#if ENABLE(SUBTLE_CRYPTO)
CryptoKeyTag = 33,
#endif
+ SharedArrayBufferTag = 34,
ErrorTag = 255
};
@@ -476,9 +477,9 @@
class CloneSerializer : CloneBase {
public:
- static SerializationReturnCode serialize(ExecState* exec, JSValue value, Vector<RefPtr<MessagePort>>& messagePorts, Vector<RefPtr<JSC::ArrayBuffer>>& arrayBuffers, Vector<String>& blobURLs, Vector<uint8_t>& out)
+ static SerializationReturnCode serialize(ExecState* exec, JSValue value, Vector<RefPtr<MessagePort>>& messagePorts, Vector<RefPtr<JSC::ArrayBuffer>>& arrayBuffers, Vector<String>& blobURLs, Vector<uint8_t>& out, SerializationContext context, ArrayBufferContentsArray& sharedBuffers)
{
- CloneSerializer serializer(exec, messagePorts, arrayBuffers, blobURLs, out);
+ CloneSerializer serializer(exec, messagePorts, arrayBuffers, blobURLs, out, context, sharedBuffers);
return serializer.serialize(value);
}
@@ -525,11 +526,13 @@
private:
typedef HashMap<JSObject*, uint32_t> ObjectPool;
- CloneSerializer(ExecState* exec, Vector<RefPtr<MessagePort>>& messagePorts, Vector<RefPtr<JSC::ArrayBuffer>>& arrayBuffers, Vector<String>& blobURLs, Vector<uint8_t>& out)
+ CloneSerializer(ExecState* exec, Vector<RefPtr<MessagePort>>& messagePorts, Vector<RefPtr<JSC::ArrayBuffer>>& arrayBuffers, Vector<String>& blobURLs, Vector<uint8_t>& out, SerializationContext context, ArrayBufferContentsArray& sharedBuffers)
: CloneBase(exec)
, m_buffer(out)
, m_blobURLs(blobURLs)
, m_emptyIdentifier(Identifier::fromString(exec, emptyString()))
+ , m_context(context)
+ , m_sharedBuffers(sharedBuffers)
{
write(CurrentVersion);
fillTransferMap(messagePorts, m_transferredMessagePorts);
@@ -859,6 +862,19 @@
}
if (!startObjectInternal(obj)) // handle duplicates
return true;
+
+ if (arrayBuffer->isShared()
+ && m_context == SerializationContext::WorkerPostMessage) {
+ uint32_t index = m_sharedBuffers.size();
+ ArrayBufferContents contents;
+ if (arrayBuffer->shareWith(contents)) {
+ write(SharedArrayBufferTag);
+ m_sharedBuffers.append(WTFMove(contents));
+ write(index);
+ return true;
+ }
+ }
+
write(ArrayBufferTag);
write(arrayBuffer->byteLength());
write(static_cast<const uint8_t*>(arrayBuffer->data()), arrayBuffer->byteLength());
@@ -878,7 +894,8 @@
Vector<String> dummyBlobURLs;
Vector<RefPtr<MessagePort>> dummyMessagePorts;
Vector<RefPtr<JSC::ArrayBuffer>> dummyArrayBuffers;
- CloneSerializer rawKeySerializer(m_exec, dummyMessagePorts, dummyArrayBuffers, dummyBlobURLs, serializedKey);
+ ArrayBufferContentsArray dummySharedBuffers;
+ CloneSerializer rawKeySerializer(m_exec, dummyMessagePorts, dummyArrayBuffers, dummyBlobURLs, serializedKey, SerializationContext::Default, dummySharedBuffers);
rawKeySerializer.write(key);
Vector<uint8_t> wrappedKey;
if (!wrapCryptoKey(m_exec, serializedKey, wrappedKey))
@@ -1216,6 +1233,8 @@
typedef HashMap<RefPtr<UniquedStringImpl>, uint32_t, IdentifierRepHash> StringConstantPool;
StringConstantPool m_constantPool;
Identifier m_emptyIdentifier;
+ SerializationContext m_context;
+ ArrayBufferContentsArray& m_sharedBuffers;
};
SerializationReturnCode CloneSerializer::serialize(JSValue in)
@@ -1486,11 +1505,11 @@
return str;
}
- static DeserializationResult deserialize(ExecState* exec, JSGlobalObject* globalObject, Vector<RefPtr<MessagePort>>& messagePorts, ArrayBufferContentsArray* arrayBufferContentsArray, const Vector<uint8_t>& buffer, const Vector<String>& blobURLs, const Vector<String> blobFilePaths)
+ static DeserializationResult deserialize(ExecState* exec, JSGlobalObject* globalObject, Vector<RefPtr<MessagePort>>& messagePorts, ArrayBufferContentsArray* arrayBufferContentsArray, const Vector<uint8_t>& buffer, const Vector<String>& blobURLs, const Vector<String> blobFilePaths, ArrayBufferContentsArray* sharedBuffers)
{
if (!buffer.size())
return std::make_pair(jsNull(), SerializationReturnCode::UnspecifiedError);
- CloneDeserializer deserializer(exec, globalObject, messagePorts, arrayBufferContentsArray, buffer, blobURLs, blobFilePaths);
+ CloneDeserializer deserializer(exec, globalObject, messagePorts, arrayBufferContentsArray, buffer, blobURLs, blobFilePaths, sharedBuffers);
if (!deserializer.isValid())
return std::make_pair(JSValue(), SerializationReturnCode::ValidationError);
return deserializer.deserialize();
@@ -1550,7 +1569,7 @@
m_version = 0xFFFFFFFF;
}
- CloneDeserializer(ExecState* exec, JSGlobalObject* globalObject, Vector<RefPtr<MessagePort>>& messagePorts, ArrayBufferContentsArray* arrayBufferContents, const Vector<uint8_t>& buffer, const Vector<String>& blobURLs, const Vector<String> blobFilePaths)
+ CloneDeserializer(ExecState* exec, JSGlobalObject* globalObject, Vector<RefPtr<MessagePort>>& messagePorts, ArrayBufferContentsArray* arrayBufferContents, const Vector<uint8_t>& buffer, const Vector<String>& blobURLs, const Vector<String> blobFilePaths, ArrayBufferContentsArray* sharedBuffers)
: CloneBase(exec)
, m_globalObject(globalObject)
, m_isDOMGlobalObject(globalObject->inherits(JSDOMGlobalObject::info()))
@@ -1562,6 +1581,7 @@
, m_arrayBuffers(arrayBufferContents ? arrayBufferContents->size() : 0)
, m_blobURLs(blobURLs)
, m_blobFilePaths(blobFilePaths)
+ , m_sharedBuffers(sharedBuffers)
{
if (!read(m_version))
m_version = 0xFFFFFFFF;
@@ -2384,6 +2404,20 @@
return getJSValue(m_arrayBuffers[index].get());
}
+ case SharedArrayBufferTag: {
+ uint32_t index = UINT_MAX;
+ bool indexSuccessfullyRead = read(index);
+ if (!indexSuccessfullyRead || !m_sharedBuffers || index >= m_sharedBuffers->size()) {
+ fail();
+ return JSValue();
+ }
+
+ RELEASE_ASSERT(m_sharedBuffers->at(index));
+ RefPtr<ArrayBuffer> buffer = ArrayBuffer::create(WTFMove(m_sharedBuffers->at(index)));
+ JSValue result = getJSValue(buffer.get());
+ m_gcBuffer.append(result);
+ return result;
+ }
case ArrayBufferViewTag: {
JSValue arrayBufferView;
if (!readArrayBufferView(arrayBufferView)) {
@@ -2442,6 +2476,7 @@
Vector<RefPtr<JSC::ArrayBuffer>> m_arrayBuffers;
Vector<String> m_blobURLs;
Vector<String> m_blobFilePaths;
+ ArrayBufferContentsArray* m_sharedBuffers;
String blobFilePathForBlobURL(const String& blobURL)
{
@@ -2651,9 +2686,10 @@
{
}
-SerializedScriptValue::SerializedScriptValue(Vector<uint8_t>&& buffer, const Vector<String>& blobURLs, std::unique_ptr<ArrayBufferContentsArray>&& arrayBufferContentsArray)
+SerializedScriptValue::SerializedScriptValue(Vector<uint8_t>&& buffer, const Vector<String>& blobURLs, std::unique_ptr<ArrayBufferContentsArray> arrayBufferContentsArray, std::unique_ptr<ArrayBufferContentsArray> sharedBufferContentsArray)
: m_data(WTFMove(buffer))
, m_arrayBufferContentsArray(WTFMove(arrayBufferContentsArray))
+ , m_sharedBufferContentsArray(WTFMove(sharedBufferContentsArray))
{
// Since this SerializedScriptValue is meant to be passed between threads, its String data members
// need to be isolatedCopies so we don't run into thread safety issues for the StringImpls.
@@ -2741,18 +2777,19 @@
Vector<String> blobURLs;
Vector<RefPtr<MessagePort>> dummyMessagePorts;
Vector<RefPtr<JSC::ArrayBuffer>> dummyArrayBuffers;
- auto code = CloneSerializer::serialize(&exec, value, dummyMessagePorts, dummyArrayBuffers, blobURLs, buffer);
+ ArrayBufferContentsArray dummySharedBuffers;
+ auto code = CloneSerializer::serialize(&exec, value, dummyMessagePorts, dummyArrayBuffers, blobURLs, buffer, SerializationContext::Default, dummySharedBuffers);
- if (throwExceptions == Throwing)
+ if (throwExceptions == SerializationErrorMode::Throwing)
maybeThrowExceptionIfSerializationFailed(&exec, code);
if (code != SerializationReturnCode::SuccessfullyCompleted)
return nullptr;
- return adoptRef(*new SerializedScriptValue(WTFMove(buffer), blobURLs, nullptr));
+ return adoptRef(*new SerializedScriptValue(WTFMove(buffer), blobURLs, nullptr, nullptr));
}
-ExceptionOr<Ref<SerializedScriptValue>> SerializedScriptValue::create(ExecState& state, JSValue value, Vector<JSC::Strong<JSC::JSObject>>&& transferList, Vector<RefPtr<MessagePort>>& messagePorts)
+ExceptionOr<Ref<SerializedScriptValue>> SerializedScriptValue::create(ExecState& state, JSValue value, Vector<JSC::Strong<JSC::JSObject>>&& transferList, Vector<RefPtr<MessagePort>>& messagePorts, SerializationContext context)
{
Vector<RefPtr<JSC::ArrayBuffer>> arrayBuffers;
for (auto& transferable : transferList) {
@@ -2759,6 +2796,8 @@
if (auto arrayBuffer = toPossiblySharedArrayBuffer(transferable.get())) {
if (arrayBuffer->isNeutered())
return Exception { DATA_CLONE_ERR };
+ if (arrayBuffer->isShared() && context != SerializationContext::WorkerPostMessage)
+ return Exception { DATA_CLONE_ERR };
if (arrayBuffer->isShared())
return Exception { TypeError };
arrayBuffers.append(WTFMove(arrayBuffer));
@@ -2775,7 +2814,8 @@
Vector<uint8_t> buffer;
Vector<String> blobURLs;
- auto code = CloneSerializer::serialize(&state, value, messagePorts, arrayBuffers, blobURLs, buffer);
+ std::unique_ptr<ArrayBufferContentsArray> sharedBuffers = std::make_unique<ArrayBufferContentsArray>();
+ auto code = CloneSerializer::serialize(&state, value, messagePorts, arrayBuffers, blobURLs, buffer, context, *sharedBuffers);
if (code != SerializationReturnCode::SuccessfullyCompleted)
return exceptionForSerializationFailure(code);
@@ -2784,7 +2824,7 @@
if (arrayBufferContentsArray.hasException())
return arrayBufferContentsArray.releaseException();
- return adoptRef(*new SerializedScriptValue(WTFMove(buffer), blobURLs, arrayBufferContentsArray.releaseReturnValue()));
+ return adoptRef(*new SerializedScriptValue(WTFMove(buffer), blobURLs, arrayBufferContentsArray.releaseReturnValue(), context == SerializationContext::WorkerPostMessage ? WTFMove(sharedBuffers) : nullptr));
}
RefPtr<SerializedScriptValue> SerializedScriptValue::create(StringView string)
@@ -2834,8 +2874,8 @@
JSValue SerializedScriptValue::deserialize(ExecState& exec, JSGlobalObject* globalObject, Vector<RefPtr<MessagePort>>& messagePorts, const Vector<String>& blobURLs, const Vector<String>& blobFilePaths, SerializationErrorMode throwExceptions)
{
- DeserializationResult result = CloneDeserializer::deserialize(&exec, globalObject, messagePorts, m_arrayBufferContentsArray.get(), m_data, blobURLs, blobFilePaths);
- if (throwExceptions == Throwing)
+ DeserializationResult result = CloneDeserializer::deserialize(&exec, globalObject, messagePorts, m_arrayBufferContentsArray.get(), m_data, blobURLs, blobFilePaths, m_sharedBufferContentsArray.get());
+ if (throwExceptions == SerializationErrorMode::Throwing)
maybeThrowExceptionIfSerializationFailed(&exec, result.second);
return result.first ? result.first : jsNull();
}
Modified: branches/safari-603-branch/Source/WebCore/bindings/js/SerializedScriptValue.h (212594 => 212595)
--- branches/safari-603-branch/Source/WebCore/bindings/js/SerializedScriptValue.h 2017-02-17 23:59:35 UTC (rev 212594)
+++ branches/safari-603-branch/Source/WebCore/bindings/js/SerializedScriptValue.h 2017-02-18 00:10:01 UTC (rev 212595)
@@ -46,15 +46,16 @@
class SharedBuffer;
enum class SerializationReturnCode;
-enum SerializationErrorMode { NonThrowing, Throwing };
+enum class SerializationErrorMode { NonThrowing, Throwing };
+enum class SerializationContext { Default, WorkerPostMessage };
using ArrayBufferContentsArray = Vector<JSC::ArrayBufferContents>;
class SerializedScriptValue : public ThreadSafeRefCounted<SerializedScriptValue> {
public:
- WEBCORE_EXPORT static RefPtr<SerializedScriptValue> create(JSC::ExecState&, JSC::JSValue, SerializationErrorMode = Throwing);
+ WEBCORE_EXPORT static RefPtr<SerializedScriptValue> create(JSC::ExecState&, JSC::JSValue, SerializationErrorMode = SerializationErrorMode::Throwing);
- WEBCORE_EXPORT static ExceptionOr<Ref<SerializedScriptValue>> create(JSC::ExecState&, JSC::JSValue, Vector<JSC::Strong<JSC::JSObject>>&&, Vector<RefPtr<MessagePort>>&);
+ WEBCORE_EXPORT static ExceptionOr<Ref<SerializedScriptValue>> create(JSC::ExecState&, JSC::JSValue, Vector<JSC::Strong<JSC::JSObject>>&& transfer, Vector<RefPtr<MessagePort>>&, SerializationContext = SerializationContext::Default);
WEBCORE_EXPORT static RefPtr<SerializedScriptValue> create(StringView);
static Ref<SerializedScriptValue> adopt(Vector<uint8_t>&& buffer)
@@ -64,9 +65,9 @@
static Ref<SerializedScriptValue> nullValue();
- WEBCORE_EXPORT JSC::JSValue deserialize(JSC::ExecState&, JSC::JSGlobalObject*, SerializationErrorMode = Throwing);
- WEBCORE_EXPORT JSC::JSValue deserialize(JSC::ExecState&, JSC::JSGlobalObject*, Vector<RefPtr<MessagePort>>&, SerializationErrorMode = Throwing);
- JSC::JSValue deserialize(JSC::ExecState&, JSC::JSGlobalObject*, Vector<RefPtr<MessagePort>>&, const Vector<String>& blobURLs, const Vector<String>& blobFilePaths, SerializationErrorMode = Throwing);
+ WEBCORE_EXPORT JSC::JSValue deserialize(JSC::ExecState&, JSC::JSGlobalObject*, SerializationErrorMode = SerializationErrorMode::Throwing);
+ WEBCORE_EXPORT JSC::JSValue deserialize(JSC::ExecState&, JSC::JSGlobalObject*, Vector<RefPtr<MessagePort>>&, SerializationErrorMode = SerializationErrorMode::Throwing);
+ JSC::JSValue deserialize(JSC::ExecState&, JSC::JSGlobalObject*, Vector<RefPtr<MessagePort>>&, const Vector<String>& blobURLs, const Vector<String>& blobFilePaths, SerializationErrorMode = SerializationErrorMode::Throwing);
static uint32_t wireFormatVersion();
@@ -95,10 +96,11 @@
private:
WEBCORE_EXPORT SerializedScriptValue(Vector<unsigned char>&&);
- SerializedScriptValue(Vector<unsigned char>&&, const Vector<String>& blobURLs, std::unique_ptr<ArrayBufferContentsArray>&&);
+ SerializedScriptValue(Vector<unsigned char>&&, const Vector<String>& blobURLs, std::unique_ptr<ArrayBufferContentsArray>, std::unique_ptr<ArrayBufferContentsArray> sharedBuffers);
Vector<unsigned char> m_data;
std::unique_ptr<ArrayBufferContentsArray> m_arrayBufferContentsArray;
+ std::unique_ptr<ArrayBufferContentsArray> m_sharedBufferContentsArray;
Vector<String> m_blobURLs;
};
Modified: branches/safari-603-branch/Source/WebCore/dom/CustomEvent.cpp (212594 => 212595)
--- branches/safari-603-branch/Source/WebCore/dom/CustomEvent.cpp 2017-02-17 23:59:35 UTC (rev 212594)
+++ branches/safari-603-branch/Source/WebCore/dom/CustomEvent.cpp 2017-02-18 00:10:01 UTC (rev 212595)
@@ -61,7 +61,7 @@
RefPtr<SerializedScriptValue> CustomEvent::trySerializeDetail(JSC::ExecState& state)
{
if (!m_triedToSerialize) {
- m_serializedDetail = SerializedScriptValue::create(state, m_detail, NonThrowing);
+ m_serializedDetail = SerializedScriptValue::create(state, m_detail, SerializationErrorMode::NonThrowing);
m_triedToSerialize = true;
}
return m_serializedDetail;
Modified: branches/safari-603-branch/Source/WebCore/dom/ErrorEvent.cpp (212594 => 212595)
--- branches/safari-603-branch/Source/WebCore/dom/ErrorEvent.cpp 2017-02-17 23:59:35 UTC (rev 212594)
+++ branches/safari-603-branch/Source/WebCore/dom/ErrorEvent.cpp 2017-02-18 00:10:01 UTC (rev 212595)
@@ -90,7 +90,7 @@
RefPtr<SerializedScriptValue> ErrorEvent::trySerializeError(ExecState& exec)
{
if (!m_triedToSerialize) {
- m_serializedDetail = SerializedScriptValue::create(exec, m_error, NonThrowing);
+ m_serializedDetail = SerializedScriptValue::create(exec, m_error, SerializationErrorMode::NonThrowing);
m_triedToSerialize = true;
}
return m_serializedDetail;
Modified: branches/safari-603-branch/Source/WebCore/dom/MessageEvent.cpp (212594 => 212595)
--- branches/safari-603-branch/Source/WebCore/dom/MessageEvent.cpp 2017-02-17 23:59:35 UTC (rev 212594)
+++ branches/safari-603-branch/Source/WebCore/dom/MessageEvent.cpp 2017-02-18 00:10:01 UTC (rev 212595)
@@ -183,7 +183,7 @@
ASSERT(!m_dataAsScriptValue.hasNoValue());
if (!m_dataAsSerializedScriptValue && !m_triedToSerialize) {
- m_dataAsSerializedScriptValue = SerializedScriptValue::create(*exec, m_dataAsScriptValue.jsValue(), NonThrowing);
+ m_dataAsSerializedScriptValue = SerializedScriptValue::create(*exec, m_dataAsScriptValue.jsValue(), SerializationErrorMode::NonThrowing);
m_triedToSerialize = true;
}
Modified: branches/safari-603-branch/Source/WebCore/dom/PopStateEvent.cpp (212594 => 212595)
--- branches/safari-603-branch/Source/WebCore/dom/PopStateEvent.cpp 2017-02-17 23:59:35 UTC (rev 212594)
+++ branches/safari-603-branch/Source/WebCore/dom/PopStateEvent.cpp 2017-02-18 00:10:01 UTC (rev 212595)
@@ -70,7 +70,7 @@
ASSERT(!m_state.hasNoValue());
if (!m_serializedState && !m_triedToSerialize) {
- m_serializedState = SerializedScriptValue::create(*exec, m_state.jsValue(), NonThrowing);
+ m_serializedState = SerializedScriptValue::create(*exec, m_state.jsValue(), SerializationErrorMode::NonThrowing);
m_triedToSerialize = true;
}
Modified: branches/safari-603-branch/Source/WebCore/workers/DedicatedWorkerGlobalScope.cpp (212594 => 212595)
--- branches/safari-603-branch/Source/WebCore/workers/DedicatedWorkerGlobalScope.cpp 2017-02-17 23:59:35 UTC (rev 212594)
+++ branches/safari-603-branch/Source/WebCore/workers/DedicatedWorkerGlobalScope.cpp 2017-02-18 00:10:01 UTC (rev 212595)
@@ -66,7 +66,7 @@
ExceptionOr<void> DedicatedWorkerGlobalScope::postMessage(JSC::ExecState& state, JSC::JSValue messageValue, Vector<JSC::Strong<JSC::JSObject>>&& transfer)
{
Vector<RefPtr<MessagePort>> ports;
- auto message = SerializedScriptValue::create(state, messageValue, WTFMove(transfer), ports);
+ auto message = SerializedScriptValue::create(state, messageValue, WTFMove(transfer), ports, SerializationContext::WorkerPostMessage);
if (message.hasException())
return message.releaseException();
Modified: branches/safari-603-branch/Source/WebCore/workers/Worker.cpp (212594 => 212595)
--- branches/safari-603-branch/Source/WebCore/workers/Worker.cpp 2017-02-17 23:59:35 UTC (rev 212594)
+++ branches/safari-603-branch/Source/WebCore/workers/Worker.cpp 2017-02-18 00:10:01 UTC (rev 212595)
@@ -104,7 +104,7 @@
ExceptionOr<void> Worker::postMessage(JSC::ExecState& state, JSC::JSValue messageValue, Vector<JSC::Strong<JSC::JSObject>>&& transfer)
{
Vector<RefPtr<MessagePort>> ports;
- auto message = SerializedScriptValue::create(state, messageValue, WTFMove(transfer), ports);
+ auto message = SerializedScriptValue::create(state, messageValue, WTFMove(transfer), ports, SerializationContext::WorkerPostMessage);
if (message.hasException())
return message.releaseException();