Title: [234588] trunk
Revision
234588
Author
utatane....@gmail.com
Date
2018-08-06 00:59:13 -0700 (Mon, 06 Aug 2018)

Log Message

Implement self.queueMicrotask in Workers
https://bugs.webkit.org/show_bug.cgi?id=188247

Reviewed by Ryosuke Niwa.

Source/WebCore:

This patch adds support for self.queueMicrotask to workers.

Tests: http/wpt/workers/queue-microtask.any.html
       http/wpt/workers/queue-microtask.any.worker.html

* bindings/js/JSWorkerGlobalScopeCustom.cpp:
(WebCore::JSWorkerGlobalScope::queueMicrotask):
* page/DOMWindow.idl:
Move queueMicrotask declaration to WindowOrWorkerGlobalScope.idl.
* page/WindowOrWorkerGlobalScope.idl:

LayoutTests:

* http/wpt/workers/queue-microtask.any-expected.txt: Added.
* http/wpt/workers/queue-microtask.any.html: Added.
* http/wpt/workers/queue-microtask.any.js: Added.
(promise_test):
(promise_test.):
(queueMicrotask.promise_test):
(test):
* http/wpt/workers/queue-microtask.any.worker-expected.txt: Added.
* http/wpt/workers/queue-microtask.any.worker.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (234587 => 234588)


--- trunk/LayoutTests/ChangeLog	2018-08-06 06:43:51 UTC (rev 234587)
+++ trunk/LayoutTests/ChangeLog	2018-08-06 07:59:13 UTC (rev 234588)
@@ -1,3 +1,20 @@
+2018-08-05  Yusuke Suzuki  <utatane....@gmail.com>
+
+        Implement self.queueMicrotask in Workers
+        https://bugs.webkit.org/show_bug.cgi?id=188247
+
+        Reviewed by Ryosuke Niwa.
+
+        * http/wpt/workers/queue-microtask.any-expected.txt: Added.
+        * http/wpt/workers/queue-microtask.any.html: Added.
+        * http/wpt/workers/queue-microtask.any.js: Added.
+        (promise_test):
+        (promise_test.):
+        (queueMicrotask.promise_test):
+        (test):
+        * http/wpt/workers/queue-microtask.any.worker-expected.txt: Added.
+        * http/wpt/workers/queue-microtask.any.worker.html: Added.
+
 2018-08-05  Rob Buis  <rb...@igalia.com>
 
         [GTK][WPE] Fetch tests assert in SubresourceLoader::didReceiveResponse()

Added: trunk/LayoutTests/http/wpt/workers/queue-microtask.any-expected.txt (0 => 234588)


--- trunk/LayoutTests/http/wpt/workers/queue-microtask.any-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/workers/queue-microtask.any-expected.txt	2018-08-06 07:59:13 UTC (rev 234588)
@@ -0,0 +1,6 @@
+
+PASS Queued microtasks should be drained before executing macrotasks 
+PASS queueMicrotask's callback has zero arguments and self as |this| 
+PASS queueMicrotask and Promise uses the same Microtask queue 
+PASS queueMicrotask should reject non-function arguments 
+

Added: trunk/LayoutTests/http/wpt/workers/queue-microtask.any.html (0 => 234588)


--- trunk/LayoutTests/http/wpt/workers/queue-microtask.any.html	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/workers/queue-microtask.any.html	2018-08-06 07:59:13 UTC (rev 234588)
@@ -0,0 +1 @@
+<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file

Added: trunk/LayoutTests/http/wpt/workers/queue-microtask.any.js (0 => 234588)


--- trunk/LayoutTests/http/wpt/workers/queue-microtask.any.js	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/workers/queue-microtask.any.js	2018-08-06 07:59:13 UTC (rev 234588)
@@ -0,0 +1,93 @@
+promise_test(() => {
+    var counter = 0;
+    self.queueMicrotask(() => {
+        assert_equals(counter++, 1);
+        self.queueMicrotask(() => {
+            assert_equals(counter++, 2);
+        });
+    });
+    var promise = new Promise((resolve, reject) => {
+        setTimeout(() => {
+            assert_equals(counter++, 3);
+            resolve();
+        }, 0);
+    });
+    assert_equals(counter++, 0);
+    return promise;
+}, `Queued microtasks should be drained before executing macrotasks`);
+
+promise_test(() => {
+    return new Promise((resolve, reject) => {
+        self.queueMicrotask(function () {
+            try {
+                assert_equals(arguments.length, 0);
+                assert_equals(this, self);
+                self.queueMicrotask(function () {
+                    try {
+                        assert_equals(this, self);
+                        self.queueMicrotask(function () {
+                            'use strict';
+                            try {
+                                assert_equals(this, undefined);
+                                resolve();
+                            } catch (e) {
+                                reject(e);
+                            }
+                        });
+                    } catch (e) {
+                        reject(e);
+                    }
+                });
+            } catch (e) {
+                reject(e);
+            }
+        });
+    });
+}, `queueMicrotask's callback has zero arguments and self as |this|`);
+
+promise_test(() => {
+    return new Promise((resolve ,reject) => {
+        var counter = 0;
+        Promise.resolve().then(() => {
+            assert_equals(counter++, 1);
+            self.queueMicrotask(() => {
+                assert_equals(counter++, 3);
+                resolve();
+            });
+        });
+        self.queueMicrotask(() => {
+            assert_equals(counter++, 2);
+        });
+        assert_equals(counter++, 0);
+    });
+}, `queueMicrotask and Promise uses the same Microtask queue`);
+
+test(() => {
+    assert_throws(new TypeError, () => {
+        self.queueMicrotask();
+    });
+    assert_throws(new TypeError, () => {
+        self.queueMicrotask(null);
+    });
+    assert_throws(new TypeError, () => {
+        self.queueMicrotask(undefined);
+    });
+    assert_throws(new TypeError, () => {
+        self.queueMicrotask(42);
+    });
+    assert_throws(new TypeError, () => {
+        self.queueMicrotask("42");
+    });
+    assert_throws(new TypeError, () => {
+        self.queueMicrotask(true);
+    });
+    assert_throws(new TypeError, () => {
+        self.queueMicrotask(Symbol("42"));
+    });
+    assert_throws(new TypeError, () => {
+        self.queueMicrotask({});
+    });
+    assert_throws(new TypeError, () => {
+        self.queueMicrotask({ handleEvent() { } });
+    });
+}, `queueMicrotask should reject non-function arguments`);

Added: trunk/LayoutTests/http/wpt/workers/queue-microtask.any.worker-expected.txt (0 => 234588)


--- trunk/LayoutTests/http/wpt/workers/queue-microtask.any.worker-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/workers/queue-microtask.any.worker-expected.txt	2018-08-06 07:59:13 UTC (rev 234588)
@@ -0,0 +1,6 @@
+
+PASS Queued microtasks should be drained before executing macrotasks 
+PASS queueMicrotask's callback has zero arguments and self as |this| 
+PASS queueMicrotask and Promise uses the same Microtask queue 
+PASS queueMicrotask should reject non-function arguments 
+

Added: trunk/LayoutTests/http/wpt/workers/queue-microtask.any.worker.html (0 => 234588)


--- trunk/LayoutTests/http/wpt/workers/queue-microtask.any.worker.html	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/workers/queue-microtask.any.worker.html	2018-08-06 07:59:13 UTC (rev 234588)
@@ -0,0 +1 @@
+<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file

Modified: trunk/Source/WebCore/ChangeLog (234587 => 234588)


--- trunk/Source/WebCore/ChangeLog	2018-08-06 06:43:51 UTC (rev 234587)
+++ trunk/Source/WebCore/ChangeLog	2018-08-06 07:59:13 UTC (rev 234588)
@@ -1,3 +1,21 @@
+2018-08-05  Yusuke Suzuki  <utatane....@gmail.com>
+
+        Implement self.queueMicrotask in Workers
+        https://bugs.webkit.org/show_bug.cgi?id=188247
+
+        Reviewed by Ryosuke Niwa.
+
+        This patch adds support for self.queueMicrotask to workers.
+
+        Tests: http/wpt/workers/queue-microtask.any.html
+               http/wpt/workers/queue-microtask.any.worker.html
+
+        * bindings/js/JSWorkerGlobalScopeCustom.cpp:
+        (WebCore::JSWorkerGlobalScope::queueMicrotask):
+        * page/DOMWindow.idl:
+        Move queueMicrotask declaration to WindowOrWorkerGlobalScope.idl.
+        * page/WindowOrWorkerGlobalScope.idl:
+
 2018-08-05  Rob Buis  <rb...@igalia.com>
 
         [GTK][WPE] Fetch tests assert in SubresourceLoader::didReceiveResponse()

Modified: trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeCustom.cpp (234587 => 234588)


--- trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeCustom.cpp	2018-08-06 06:43:51 UTC (rev 234587)
+++ trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeCustom.cpp	2018-08-06 07:59:13 UTC (rev 234588)
@@ -27,6 +27,7 @@
 #include "JSWorkerGlobalScope.h"
 
 #include "WorkerGlobalScope.h"
+#include <_javascript_Core/JSMicrotask.h>
 
 
 namespace WebCore {
@@ -47,4 +48,21 @@
     wrapped().visitJSEventListeners(visitor);
 }
 
+JSValue JSWorkerGlobalScope::queueMicrotask(ExecState& state)
+{
+    VM& vm = state.vm();
+    auto scope = DECLARE_THROW_SCOPE(vm);
+
+    if (UNLIKELY(state.argumentCount() < 1))
+        return throwException(&state, scope, createNotEnoughArgumentsError(&state));
+
+    JSValue functionValue = state.uncheckedArgument(0);
+    if (UNLIKELY(!functionValue.isFunction(vm)))
+        return JSValue::decode(throwArgumentMustBeFunctionError(state, scope, 0, "callback", "WorkerGlobalScope", "queueMicrotask"));
+
+    scope.release();
+    Base::queueMicrotask(JSC::createJSMicrotask(vm, functionValue));
+    return jsUndefined();
+}
+
 } // namespace WebCore

Modified: trunk/Source/WebCore/page/DOMWindow.idl (234587 => 234588)


--- trunk/Source/WebCore/page/DOMWindow.idl	2018-08-06 06:43:51 UTC (rev 234587)
+++ trunk/Source/WebCore/page/DOMWindow.idl	2018-08-06 07:59:13 UTC (rev 234588)
@@ -89,8 +89,6 @@
     DOMString? prompt(optional DOMString message = "", optional DOMString defaultValue = "");
     void print();
 
-    [Custom] void queueMicrotask(VoidCallback callback);
-
     long requestAnimationFrame(RequestAnimationFrameCallback callback); // FIXME: Should return an unsigned long.
     void cancelAnimationFrame(long handle); // FIXME: handle should be an unsigned long.
 

Modified: trunk/Source/WebCore/page/WindowOrWorkerGlobalScope.idl (234587 => 234588)


--- trunk/Source/WebCore/page/WindowOrWorkerGlobalScope.idl	2018-08-06 06:43:51 UTC (rev 234587)
+++ trunk/Source/WebCore/page/WindowOrWorkerGlobalScope.idl	2018-08-06 07:59:13 UTC (rev 234588)
@@ -46,6 +46,8 @@
     [CallWith=ScriptState, MayThrowException] long setInterval(ScheduledAction handler, optional long timeout = 0, any... arguments);
     void clearInterval(optional long handle = 0);
 
+    [Custom] void queueMicrotask(VoidCallback callback);
+
     // Base64 utility methods.
     [MayThrowException] DOMString atob(DOMString string);
     [MayThrowException] DOMString btoa(DOMString string);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to