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);