Title: [212595] branches/safari-603-branch
Revision
212595
Author
matthew_han...@apple.com
Date
2017-02-17 16:10:01 -0800 (Fri, 17 Feb 2017)

Log Message

Merge r212035. rdar://problem/30433204

Modified Paths

Added Paths

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();
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to