Title: [234846] trunk
Revision
234846
Author
[email protected]
Date
2018-08-14 06:04:43 -0700 (Tue, 14 Aug 2018)

Log Message

Worker should support unhandled promise rejections
https://bugs.webkit.org/show_bug.cgi?id=188265

Reviewed by Darin Adler.

LayoutTests/imported/w3c:

* web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_bits.https.worker-expected.txt:
* web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_keys.https.worker-expected.txt:
* web-platform-tests/streams/readable-streams/tee.dedicatedworker-expected.txt:
* web-platform-tests/streams/readable-streams/tee.serviceworker.https-expected.txt:
* web-platform-tests/workers/interfaces.worker-expected.txt:
* web-platform-tests/workers/semantics/interface-objects/001.worker-expected.txt:

Source/WebCore:

This patch adds PromiseRejectionEvent support in workers.

* Sources.txt:
* WebCore.xcodeproj/project.pbxproj:
* bindings/js/JSDOMGlobalObject.cpp:
(WebCore::JSDOMGlobalObject::promiseRejectionTracker):
Move promiseRejectionTracker handler from JSDOMWindowBase to JSDOMGlobalObject
to share it with WorkerGlobalScope.

* bindings/js/JSDOMGlobalObject.h:
* bindings/js/JSDOMWindowBase.cpp:
(WebCore::JSDOMWindowBase::promiseRejectionTracker): Deleted.
Moved to JSDOMGlobalObject.

* bindings/js/JSDOMWindowBase.h:
* bindings/js/JSExecState.cpp:
(WebCore::JSExecState::didLeaveScriptContext):
PromiseRejectionTracker is driven in workers too.

* bindings/js/JSPromiseRejectionEventCustom.cpp: Added.
(WebCore::JSPromiseRejectionEvent::visitAdditionalChildren):
Marking PromiseRejectionEvent::m_reason.

* bindings/js/JSWorkerGlobalScopeBase.cpp:
Configure promiseRejectionTracker.

* dom/Microtasks.cpp:
(WebCore::MicrotaskQueue::contextQueue):
* dom/Microtasks.h:
* dom/PromiseRejectionEvent.cpp:
(WebCore::PromiseRejectionEvent::PromiseRejectionEvent):
* dom/PromiseRejectionEvent.h:
* dom/PromiseRejectionEvent.idl:
Expose it to worker scope. The custom mark function is required since we start
using JSValueInWrappedObject. And the constructor no longer requires ExecState.

* dom/RejectedPromiseTracker.cpp:
(WebCore::RejectedPromiseTracker::reportUnhandledRejections):
(WebCore::RejectedPromiseTracker::reportRejectionHandled):
Remove state argument for PromiseRejectionEvent::create.

* dom/ScriptExecutionContext.cpp:
(WebCore::ScriptExecutionContext::removeRejectedPromiseTracker):
* dom/ScriptExecutionContext.h:
In worker thread, we should delete PromiseRejectionTracker before destroying VM
because PromiseRejectionTracker's destruction requires VM. If we destroy VM first,
PromiseRejectionTracker's destruction causes crashing. In main thread, we do not
need to handle this case since we never destroy VM.

* workers/WorkerGlobalScope.cpp:
(WebCore::WorkerGlobalScope::prepareForTermination):
(WebCore::WorkerGlobalScope::removeMicrotaskQueue): Deleted.
* workers/WorkerGlobalScope.h:
* workers/WorkerGlobalScope.idl:
Add onunhandledrejection and onrejectionhandled event handler attributes.

* workers/WorkerThread.cpp:
(WebCore::WorkerThread::stop):
We call WorkerGlobalScope::prepareForTermination, which cleans up Worker's objects touching VM.

LayoutTests:

* fast/dom/reference-cycle-leaks-expected.txt:
* http/wpt/workers/promise-unhandled-rejection.any-expected.txt: Added.
* http/wpt/workers/promise-unhandled-rejection.any.html: Added.
* http/wpt/workers/promise-unhandled-rejection.any.js: Added.
(promise_test):
* http/wpt/workers/promise-unhandled-rejection.any.worker-expected.txt: Added.
* http/wpt/workers/promise-unhandled-rejection.any.worker.html: Added.
* js/dom/unhandled-promise-rejection-basic-in-workers-expected.txt: Added.
* js/dom/unhandled-promise-rejection-basic-in-workers.html: Added.
* js/dom/unhandled-promise-rejection-bindings-type-error-in-workers-expected.txt: Added.
* js/dom/unhandled-promise-rejection-bindings-type-error-in-workers.html: Added.
* js/dom/unhandled-promise-rejection-handle-during-event-in-workers-expected.txt: Added.
* js/dom/unhandled-promise-rejection-handle-during-event-in-workers.html: Added.
* js/dom/unhandled-promise-rejection-handle-in-handler-in-workers-expected.txt: Added.
* js/dom/unhandled-promise-rejection-handle-in-handler-in-workers.html: Added.
* js/dom/unhandled-promise-rejection-handle-in-workers-expected.txt: Added.
* js/dom/unhandled-promise-rejection-handle-in-workers.html: Added.
* js/dom/unhandled-promise-rejection-order-in-workers-expected.txt: Added.
* js/dom/unhandled-promise-rejection-order-in-workers.html: Added.
* js/resources/unhandled-promise-rejection-basic-in-workers.js: Added.
(global.onunhandledrejection):
* js/resources/unhandled-promise-rejection-bindings-type-error-in-workers.js: Added.
(global.onunhandledrejection):
(catch):
(setTimeout):
* js/resources/unhandled-promise-rejection-handle-during-event-in-workers.js: Added.
(global.onunhandledrejection):
* js/resources/unhandled-promise-rejection-handle-in-handler-in-workers.js: Added.
(global.onunhandledrejection):
(global.onrejectionhandled):
* js/resources/unhandled-promise-rejection-handle-in-workers.js: Added.
(global.onunhandledrejection):
(global.onrejectionhandled):
* js/resources/unhandled-promise-rejection-order-in-workers.js: Added.
(global.onunhandledrejection):

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (234845 => 234846)


--- trunk/LayoutTests/ChangeLog	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/LayoutTests/ChangeLog	2018-08-14 13:04:43 UTC (rev 234846)
@@ -1,3 +1,46 @@
+2018-08-14  Yusuke Suzuki  <[email protected]>
+
+        Worker should support unhandled promise rejections
+        https://bugs.webkit.org/show_bug.cgi?id=188265
+
+        Reviewed by Darin Adler.
+
+        * fast/dom/reference-cycle-leaks-expected.txt:
+        * http/wpt/workers/promise-unhandled-rejection.any-expected.txt: Added.
+        * http/wpt/workers/promise-unhandled-rejection.any.html: Added.
+        * http/wpt/workers/promise-unhandled-rejection.any.js: Added.
+        (promise_test):
+        * http/wpt/workers/promise-unhandled-rejection.any.worker-expected.txt: Added.
+        * http/wpt/workers/promise-unhandled-rejection.any.worker.html: Added.
+        * js/dom/unhandled-promise-rejection-basic-in-workers-expected.txt: Added.
+        * js/dom/unhandled-promise-rejection-basic-in-workers.html: Added.
+        * js/dom/unhandled-promise-rejection-bindings-type-error-in-workers-expected.txt: Added.
+        * js/dom/unhandled-promise-rejection-bindings-type-error-in-workers.html: Added.
+        * js/dom/unhandled-promise-rejection-handle-during-event-in-workers-expected.txt: Added.
+        * js/dom/unhandled-promise-rejection-handle-during-event-in-workers.html: Added.
+        * js/dom/unhandled-promise-rejection-handle-in-handler-in-workers-expected.txt: Added.
+        * js/dom/unhandled-promise-rejection-handle-in-handler-in-workers.html: Added.
+        * js/dom/unhandled-promise-rejection-handle-in-workers-expected.txt: Added.
+        * js/dom/unhandled-promise-rejection-handle-in-workers.html: Added.
+        * js/dom/unhandled-promise-rejection-order-in-workers-expected.txt: Added.
+        * js/dom/unhandled-promise-rejection-order-in-workers.html: Added.
+        * js/resources/unhandled-promise-rejection-basic-in-workers.js: Added.
+        (global.onunhandledrejection):
+        * js/resources/unhandled-promise-rejection-bindings-type-error-in-workers.js: Added.
+        (global.onunhandledrejection):
+        (catch):
+        (setTimeout):
+        * js/resources/unhandled-promise-rejection-handle-during-event-in-workers.js: Added.
+        (global.onunhandledrejection):
+        * js/resources/unhandled-promise-rejection-handle-in-handler-in-workers.js: Added.
+        (global.onunhandledrejection):
+        (global.onrejectionhandled):
+        * js/resources/unhandled-promise-rejection-handle-in-workers.js: Added.
+        (global.onunhandledrejection):
+        (global.onrejectionhandled):
+        * js/resources/unhandled-promise-rejection-order-in-workers.js: Added.
+        (global.onunhandledrejection):
+
 2018-08-13  Joseph Pecoraro  <[email protected]>
 
         [macOS debug] LayoutTest inspector/worker/resources-in-worker.html is a flaky timeout

Modified: trunk/LayoutTests/fast/dom/reference-cycle-leaks-expected.txt (234845 => 234846)


--- trunk/LayoutTests/fast/dom/reference-cycle-leaks-expected.txt	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/LayoutTests/fast/dom/reference-cycle-leaks-expected.txt	2018-08-14 13:04:43 UTC (rev 234846)
@@ -16,7 +16,7 @@
 PASS checkForNodeLeaks(createPopStateEventStateCycle) is "did not leak"
 FAIL checkForNodeLeaks(createPromiseRejectionEventPromiseCycle) should be did not leak. Was leaked.
 PASS checkForNodeLeaks(createPromiseRejectionEventPromiseFunctionCycle) is "did not leak"
-FAIL checkForNodeLeaks(createPromiseRejectionEventReasonCycle) should be did not leak. Was leaked.
+PASS checkForNodeLeaks(createPromiseRejectionEventReasonCycle) is "did not leak"
 PASS successfullyParsed is true
 Some tests failed.
 

Added: trunk/LayoutTests/http/wpt/workers/promise-unhandled-rejection.any-expected.txt (0 => 234846)


--- trunk/LayoutTests/http/wpt/workers/promise-unhandled-rejection.any-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/workers/promise-unhandled-rejection.any-expected.txt	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,6 @@
+CONSOLE MESSAGE: Unhandled Promise Rejection: Reject
+
+Harness Error (FAIL), message = undefined
+
+PASS UnhandledRejection event occurs if a rejected promise is not handled. 
+

Added: trunk/LayoutTests/http/wpt/workers/promise-unhandled-rejection.any.html (0 => 234846)


--- trunk/LayoutTests/http/wpt/workers/promise-unhandled-rejection.any.html	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/workers/promise-unhandled-rejection.any.html	2018-08-14 13:04:43 UTC (rev 234846)
@@ -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/promise-unhandled-rejection.any.js (0 => 234846)


--- trunk/LayoutTests/http/wpt/workers/promise-unhandled-rejection.any.js	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/workers/promise-unhandled-rejection.any.js	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,14 @@
+promise_test(() => {
+    return new Promise(resolve => {
+        var promise = null;
+        self.addEventListener('unhandledrejection', ev => {
+            assert_equals(ev.type, "unhandledrejection");
+            assert_equals(ev.cancelable, true);
+            assert_equals(ev.promise, promise);
+            assert_equals(ev.reason, "Reject");
+            resolve();
+            return false;
+        }, false);
+        promise = Promise.reject("Reject");
+    });
+}, "UnhandledRejection event occurs if a rejected promise is not handled.");

Added: trunk/LayoutTests/http/wpt/workers/promise-unhandled-rejection.any.worker-expected.txt (0 => 234846)


--- trunk/LayoutTests/http/wpt/workers/promise-unhandled-rejection.any.worker-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/workers/promise-unhandled-rejection.any.worker-expected.txt	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,7 @@
+CONSOLE MESSAGE: line 1774: TypeError: null is not an object (evaluating 'this.message_target.removeEventListener')
+CONSOLE MESSAGE: Unhandled Promise Rejection: Reject
+
+Harness Error (FAIL), message = undefined
+
+PASS UnhandledRejection event occurs if a rejected promise is not handled. 
+

Added: trunk/LayoutTests/http/wpt/workers/promise-unhandled-rejection.any.worker.html (0 => 234846)


--- trunk/LayoutTests/http/wpt/workers/promise-unhandled-rejection.any.worker.html	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/workers/promise-unhandled-rejection.any.worker.html	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1 @@
+<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (234845 => 234846)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2018-08-14 13:04:43 UTC (rev 234846)
@@ -1,3 +1,17 @@
+2018-08-14  Yusuke Suzuki  <[email protected]>
+
+        Worker should support unhandled promise rejections
+        https://bugs.webkit.org/show_bug.cgi?id=188265
+
+        Reviewed by Darin Adler.
+
+        * web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_bits.https.worker-expected.txt:
+        * web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_keys.https.worker-expected.txt:
+        * web-platform-tests/streams/readable-streams/tee.dedicatedworker-expected.txt:
+        * web-platform-tests/streams/readable-streams/tee.serviceworker.https-expected.txt:
+        * web-platform-tests/workers/interfaces.worker-expected.txt:
+        * web-platform-tests/workers/semantics/interface-objects/001.worker-expected.txt:
+
 2018-08-14  Rob Buis  <[email protected]>
 
         Fetch: content-length header is being added to the safe-list

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_bits.https.worker-expected.txt (234845 => 234846)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_bits.https.worker-expected.txt	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_bits.https.worker-expected.txt	2018-08-14 13:04:43 UTC (rev 234846)
@@ -1,4 +1,5 @@
+CONSOLE MESSAGE: line 1774: TypeError: null is not an object (evaluating 'this.message_target.removeEventListener')
+CONSOLE MESSAGE: line 198: Unhandled Promise Rejection: DataError: Data provided to an operation does not meet requirements
 
-Harness Error (TIMEOUT), message = null
+FAIL Untitled Data provided to an operation does not meet requirements
 
-

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_keys.https.worker-expected.txt (234845 => 234846)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_keys.https.worker-expected.txt	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/WebCryptoAPI/derive_bits_keys/ecdh_keys.https.worker-expected.txt	2018-08-14 13:04:43 UTC (rev 234846)
@@ -1,4 +1,5 @@
+CONSOLE MESSAGE: line 1774: TypeError: null is not an object (evaluating 'this.message_target.removeEventListener')
+CONSOLE MESSAGE: line 167: Unhandled Promise Rejection: DataError: Data provided to an operation does not meet requirements
 
-Harness Error (TIMEOUT), message = null
+FAIL Untitled Data provided to an operation does not meet requirements
 
-

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/streams/readable-streams/tee.dedicatedworker-expected.txt (234845 => 234846)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/streams/readable-streams/tee.dedicatedworker-expected.txt	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/streams/readable-streams/tee.dedicatedworker-expected.txt	2018-08-14 13:04:43 UTC (rev 234846)
@@ -1,3 +1,11 @@
+CONSOLE MESSAGE: line 1774: TypeError: null is not an object (evaluating 'this.message_target.removeEventListener')
+CONSOLE MESSAGE: Unhandled Promise Rejection: [object Object]
+CONSOLE MESSAGE: line 1774: TypeError: null is not an object (evaluating 'this.message_target.removeEventListener')
+CONSOLE MESSAGE: Unhandled Promise Rejection: [object Object]
+CONSOLE MESSAGE: line 1774: TypeError: null is not an object (evaluating 'this.message_target.removeEventListener')
+CONSOLE MESSAGE: Unhandled Promise Rejection: [object Object]
+CONSOLE MESSAGE: line 1774: TypeError: null is not an object (evaluating 'this.message_target.removeEventListener')
+CONSOLE MESSAGE: Unhandled Promise Rejection: [object Object]
 
 PASS ReadableStream teeing: rs.tee() returns an array of two ReadableStreams 
 PASS ReadableStream teeing: should be able to read one branch to the end without affecting the other 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/streams/readable-streams/tee.serviceworker.https-expected.txt (234845 => 234846)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/streams/readable-streams/tee.serviceworker.https-expected.txt	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/streams/readable-streams/tee.serviceworker.https-expected.txt	2018-08-14 13:04:43 UTC (rev 234846)
@@ -1,4 +1,6 @@
 
+Harness Error (FAIL), message = undefined
+
 PASS Service worker test setup 
 PASS ReadableStream teeing: rs.tee() returns an array of two ReadableStreams 
 PASS ReadableStream teeing: should be able to read one branch to the end without affecting the other 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/workers/interfaces.worker-expected.txt (234845 => 234846)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/workers/interfaces.worker-expected.txt	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/workers/interfaces.worker-expected.txt	2018-08-14 13:04:43 UTC (rev 234846)
@@ -34,9 +34,9 @@
 PASS Unscopable handled correctly for onoffline property on WorkerGlobalScope 
 PASS WorkerGlobalScope interface: attribute ononline 
 PASS Unscopable handled correctly for ononline property on WorkerGlobalScope 
-FAIL WorkerGlobalScope interface: attribute onrejectionhandled assert_true: The prototype object must have a property "onrejectionhandled" expected true got false
+PASS WorkerGlobalScope interface: attribute onrejectionhandled 
 PASS Unscopable handled correctly for onrejectionhandled property on WorkerGlobalScope 
-FAIL WorkerGlobalScope interface: attribute onunhandledrejection assert_true: The prototype object must have a property "onunhandledrejection" expected true got false
+PASS WorkerGlobalScope interface: attribute onunhandledrejection 
 PASS Unscopable handled correctly for onunhandledrejection property on WorkerGlobalScope 
 PASS WorkerGlobalScope interface: attribute origin 
 PASS Unscopable handled correctly for origin property on WorkerGlobalScope 
@@ -101,8 +101,8 @@
 FAIL WorkerGlobalScope interface: self must inherit property "onlanguagechange" with the proper type assert_inherits: property "onlanguagechange" not found in prototype chain
 PASS WorkerGlobalScope interface: self must inherit property "onoffline" with the proper type 
 PASS WorkerGlobalScope interface: self must inherit property "ononline" with the proper type 
-FAIL WorkerGlobalScope interface: self must inherit property "onrejectionhandled" with the proper type assert_inherits: property "onrejectionhandled" not found in prototype chain
-FAIL WorkerGlobalScope interface: self must inherit property "onunhandledrejection" with the proper type assert_inherits: property "onunhandledrejection" not found in prototype chain
+PASS WorkerGlobalScope interface: self must inherit property "onrejectionhandled" with the proper type 
+PASS WorkerGlobalScope interface: self must inherit property "onunhandledrejection" with the proper type 
 PASS WorkerGlobalScope interface: self must inherit property "origin" with the proper type 
 PASS WorkerGlobalScope interface: self must inherit property "btoa(DOMString)" with the proper type 
 PASS WorkerGlobalScope interface: calling btoa(DOMString) on self with too few arguments must throw TypeError 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/workers/semantics/interface-objects/001.worker-expected.txt (234845 => 234846)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/workers/semantics/interface-objects/001.worker-expected.txt	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/workers/semantics/interface-objects/001.worker-expected.txt	2018-08-14 13:04:43 UTC (rev 234846)
@@ -12,7 +12,7 @@
 PASS The ImageBitmap interface object should be exposed. 
 FAIL The CanvasPath interface object should be exposed. assert_own_property: expected property "CanvasPath" missing
 PASS The Path2D interface object should be exposed. 
-FAIL The PromiseRejectionEvent interface object should be exposed. assert_own_property: expected property "PromiseRejectionEvent" missing
+PASS The PromiseRejectionEvent interface object should be exposed. 
 PASS The EventSource interface object should be exposed. 
 PASS The WebSocket interface object should be exposed. 
 PASS The CloseEvent interface object should be exposed. 

Added: trunk/LayoutTests/js/dom/unhandled-promise-rejection-basic-in-workers-expected.txt (0 => 234846)


--- trunk/LayoutTests/js/dom/unhandled-promise-rejection-basic-in-workers-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/js/dom/unhandled-promise-rejection-basic-in-workers-expected.txt	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,13 @@
+[Worker] Test unhandled promise rejection event.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Starting worker: ../resources/unhandled-promise-rejection-basic-in-workers.js
+PASS [Worker] error.type is "unhandledrejection"
+PASS [Worker] error.cancelable is true
+PASS [Worker] error.promise is promise
+PASS [Worker] error.reason is "ERROR"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/js/dom/unhandled-promise-rejection-basic-in-workers.html (0 => 234846)


--- trunk/LayoutTests/js/dom/unhandled-promise-rejection-basic-in-workers.html	                        (rev 0)
+++ trunk/LayoutTests/js/dom/unhandled-promise-rejection-basic-in-workers.html	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<script>
+worker = startWorker('../resources/unhandled-promise-rejection-basic-in-workers.js');
+</script>
+<script src=""
+</body>
+</html>

Added: trunk/LayoutTests/js/dom/unhandled-promise-rejection-bindings-type-error-in-workers-expected.txt (0 => 234846)


--- trunk/LayoutTests/js/dom/unhandled-promise-rejection-bindings-type-error-in-workers-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/js/dom/unhandled-promise-rejection-bindings-type-error-in-workers-expected.txt	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,12 @@
+[Worker] Test rejected promises are returned from bindings and trigger unhandledrejection.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Starting worker: ../resources/unhandled-promise-rejection-bindings-type-error-in-workers.js
+PASS [Worker] error.promise is promise
+PASS [Worker] error.reason instanceof TypeError is true
+Got error from worker: Unhandled Promise Rejection: TypeError: The PromiseRejectionEvent.promise getter can only be used on instances of PromiseRejectionEvent
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/js/dom/unhandled-promise-rejection-bindings-type-error-in-workers.html (0 => 234846)


--- trunk/LayoutTests/js/dom/unhandled-promise-rejection-bindings-type-error-in-workers.html	                        (rev 0)
+++ trunk/LayoutTests/js/dom/unhandled-promise-rejection-bindings-type-error-in-workers.html	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<script>
+worker = startWorker('../resources/unhandled-promise-rejection-bindings-type-error-in-workers.js');
+</script>
+<script src=""
+</body>
+</html>

Added: trunk/LayoutTests/js/dom/unhandled-promise-rejection-handle-during-event-in-workers-expected.txt (0 => 234846)


--- trunk/LayoutTests/js/dom/unhandled-promise-rejection-handle-during-event-in-workers-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/js/dom/unhandled-promise-rejection-handle-during-event-in-workers-expected.txt	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,18 @@
+[Worker] Test unhandled promise rejection event.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Starting worker: ../resources/unhandled-promise-rejection-handle-during-event-in-workers.js
+[Worker] global.promise[0] = Promise.reject(0);
+[Worker] global.promise[1] = Promise.reject(1);
+[Worker] global.promise[2] = Promise.reject(2);
+PASS [Worker] error.type is "unhandledrejection"
+PASS [Worker] error.cancelable is true
+PASS [Worker] error.promise is promise[0]
+PASS [Worker] error.reason is 0
+[Worker] global.promise[1].catch(function () { });
+[Worker] global.promise[2].catch(function () { });
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/js/dom/unhandled-promise-rejection-handle-during-event-in-workers.html (0 => 234846)


--- trunk/LayoutTests/js/dom/unhandled-promise-rejection-handle-during-event-in-workers.html	                        (rev 0)
+++ trunk/LayoutTests/js/dom/unhandled-promise-rejection-handle-during-event-in-workers.html	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<script>
+worker = startWorker('../resources/unhandled-promise-rejection-handle-during-event-in-workers.js');
+</script>
+<script src=""
+</body>
+</html>

Added: trunk/LayoutTests/js/dom/unhandled-promise-rejection-handle-in-handler-in-workers-expected.txt (0 => 234846)


--- trunk/LayoutTests/js/dom/unhandled-promise-rejection-handle-in-handler-in-workers-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/js/dom/unhandled-promise-rejection-handle-in-handler-in-workers-expected.txt	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,14 @@
+[Worker] Test rejection handled event.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Starting worker: ../resources/unhandled-promise-rejection-handle-in-handler-in-workers.js
+PASS [Worker] error.type is "unhandledrejection"
+PASS [Worker] error.cancelable is true
+PASS [Worker] error.promise is promise
+PASS [Worker] error.reason is "ERROR"
+PASS [Worker] reason is "ERROR"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/js/dom/unhandled-promise-rejection-handle-in-handler-in-workers.html (0 => 234846)


--- trunk/LayoutTests/js/dom/unhandled-promise-rejection-handle-in-handler-in-workers.html	                        (rev 0)
+++ trunk/LayoutTests/js/dom/unhandled-promise-rejection-handle-in-handler-in-workers.html	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<script>
+worker = startWorker('../resources/unhandled-promise-rejection-handle-in-handler-in-workers.js');
+</script>
+<script src=""
+</body>
+</html>

Added: trunk/LayoutTests/js/dom/unhandled-promise-rejection-handle-in-workers-expected.txt (0 => 234846)


--- trunk/LayoutTests/js/dom/unhandled-promise-rejection-handle-in-workers-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/js/dom/unhandled-promise-rejection-handle-in-workers-expected.txt	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,18 @@
+[Worker] Test rejection handled event.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Starting worker: ../resources/unhandled-promise-rejection-handle-in-workers.js
+PASS [Worker] error.type is "unhandledrejection"
+PASS [Worker] error.cancelable is true
+PASS [Worker] error.promise is promise
+PASS [Worker] error.reason is "ERROR"
+PASS [Worker] reason is "ERROR"
+PASS [Worker] handled.type is "rejectionhandled"
+PASS [Worker] handled.cancelable is false
+PASS [Worker] handled.promise is promise
+PASS [Worker] handled.reason is "ERROR"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/js/dom/unhandled-promise-rejection-handle-in-workers.html (0 => 234846)


--- trunk/LayoutTests/js/dom/unhandled-promise-rejection-handle-in-workers.html	                        (rev 0)
+++ trunk/LayoutTests/js/dom/unhandled-promise-rejection-handle-in-workers.html	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<script>
+worker = startWorker('../resources/unhandled-promise-rejection-handle-in-workers.js');
+</script>
+<script src=""
+</body>
+</html>

Added: trunk/LayoutTests/js/dom/unhandled-promise-rejection-order-in-workers-expected.txt (0 => 234846)


--- trunk/LayoutTests/js/dom/unhandled-promise-rejection-order-in-workers-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/js/dom/unhandled-promise-rejection-order-in-workers-expected.txt	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,21 @@
+[Worker] Test unhandled promise rejection event.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Starting worker: ../resources/unhandled-promise-rejection-order-in-workers.js
+PASS [Worker] error.type is "unhandledrejection"
+PASS [Worker] error.cancelable is true
+PASS [Worker] error.promise is promise[0]
+PASS [Worker] error.reason is 0
+PASS [Worker] error.type is "unhandledrejection"
+PASS [Worker] error.cancelable is true
+PASS [Worker] error.promise is promise[1]
+PASS [Worker] error.reason is 1
+PASS [Worker] error.type is "unhandledrejection"
+PASS [Worker] error.cancelable is true
+PASS [Worker] error.promise is promise[2]
+PASS [Worker] error.reason is 2
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/js/dom/unhandled-promise-rejection-order-in-workers.html (0 => 234846)


--- trunk/LayoutTests/js/dom/unhandled-promise-rejection-order-in-workers.html	                        (rev 0)
+++ trunk/LayoutTests/js/dom/unhandled-promise-rejection-order-in-workers.html	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<script>
+worker = startWorker('../resources/unhandled-promise-rejection-order-in-workers.js');
+</script>
+<script src=""
+</body>
+</html>

Added: trunk/LayoutTests/js/resources/unhandled-promise-rejection-basic-in-workers.js (0 => 234846)


--- trunk/LayoutTests/js/resources/unhandled-promise-rejection-basic-in-workers.js	                        (rev 0)
+++ trunk/LayoutTests/js/resources/unhandled-promise-rejection-basic-in-workers.js	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,20 @@
+importScripts('../../resources/js-test-pre.js');
+
+description('Test unhandled promise rejection event.');
+
+var global = this;
+global.jsTestIsAsync = true;
+
+global.error = null;
+global.promise = null;
+global._onunhandledrejection_ = function (e) {
+    error = e;
+    shouldBe(`error.type`, `"unhandledrejection"`);
+    shouldBe(`error.cancelable`, `true`);
+    shouldBe(`error.promise`, `promise`);
+    shouldBe(`error.reason`, `"ERROR"`);
+    finishJSTest();
+    return false;
+};
+
+global.promise = Promise.reject("ERROR");

Added: trunk/LayoutTests/js/resources/unhandled-promise-rejection-bindings-type-error-in-workers.js (0 => 234846)


--- trunk/LayoutTests/js/resources/unhandled-promise-rejection-bindings-type-error-in-workers.js	                        (rev 0)
+++ trunk/LayoutTests/js/resources/unhandled-promise-rejection-bindings-type-error-in-workers.js	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,22 @@
+importScripts('../../resources/js-test-pre.js');
+
+description('Test rejected promises are returned from bindings and trigger unhandledrejection.');
+
+var global = this;
+global.jsTestIsAsync = true;
+
+global.error = null;
+global.promise = null;
+global._onunhandledrejection_ = function (e) {
+    error = e;
+    shouldBe(`error.promise`, `promise`);
+    shouldBeTrue(`error.reason instanceof TypeError`);
+};
+
+try {
+    promise = PromiseRejectionEvent.prototype.promise;
+} catch (e) {
+    testFailed("TypeErrors produced by getters for Promise results should be wrapped in a Promise");
+}
+
+setTimeout(function () { finishJSTest(); }, 100);

Added: trunk/LayoutTests/js/resources/unhandled-promise-rejection-handle-during-event-in-workers.js (0 => 234846)


--- trunk/LayoutTests/js/resources/unhandled-promise-rejection-handle-during-event-in-workers.js	                        (rev 0)
+++ trunk/LayoutTests/js/resources/unhandled-promise-rejection-handle-during-event-in-workers.js	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,25 @@
+importScripts('../../resources/js-test-pre.js');
+
+description('Test unhandled promise rejection event.');
+
+var global = this;
+global.jsTestIsAsync = true;
+
+global.error = null;
+global.promise = [];
+global._onunhandledrejection_ = function (e) {
+    error = e;
+
+    shouldBe(`error.type`, `"unhandledrejection"`);
+    shouldBe(`error.cancelable`, `true`);
+    shouldBe(`error.promise`, `promise[0]`);
+    shouldBe(`error.reason`, `0`);
+
+    evalAndLog(`global.promise[1].catch(function () { });`);
+    evalAndLog(`global.promise[2].catch(function () { });`);
+    setTimeout(function () { finishJSTest(); }, 100);
+    return false;
+};
+
+for (let i = 0; i < 3; ++i)
+    evalAndLog(`global.promise[${i}] = Promise.reject(${i});`);

Added: trunk/LayoutTests/js/resources/unhandled-promise-rejection-handle-in-handler-in-workers.js (0 => 234846)


--- trunk/LayoutTests/js/resources/unhandled-promise-rejection-handle-in-handler-in-workers.js	                        (rev 0)
+++ trunk/LayoutTests/js/resources/unhandled-promise-rejection-handle-in-handler-in-workers.js	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,33 @@
+importScripts('../../resources/js-test-pre.js');
+
+description('Test rejection handled event.');
+
+var global = this;
+global.jsTestIsAsync = true;
+
+global.error = null;
+global.promise = null;
+global.reason = null;
+
+global._onunhandledrejection_ = function (e) {
+    error = e;
+    shouldBe(`error.type`, `"unhandledrejection"`);
+    shouldBe(`error.cancelable`, `true`);
+    shouldBe(`error.promise`, `promise`);
+    shouldBe(`error.reason`, `"ERROR"`);
+    promise.catch(function (r) {
+        global.reason = r;
+        shouldBe(`reason`, `"ERROR"`);
+    });
+
+    setTimeout(function () {
+        finishJSTest();
+    }, 100);
+    return false;
+};
+
+global._onrejectionhandled_ = function (e) {
+    testFailed(`rejectionhandled is fired.`);
+};
+
+global.promise = Promise.reject("ERROR");

Added: trunk/LayoutTests/js/resources/unhandled-promise-rejection-handle-in-workers.js (0 => 234846)


--- trunk/LayoutTests/js/resources/unhandled-promise-rejection-handle-in-workers.js	                        (rev 0)
+++ trunk/LayoutTests/js/resources/unhandled-promise-rejection-handle-in-workers.js	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,37 @@
+importScripts('../../resources/js-test-pre.js');
+
+description('Test rejection handled event.');
+
+var global = this;
+global.jsTestIsAsync = true;
+
+global.error = null;
+global.handled = null;
+global.promise = null;
+global.reason = null;
+
+global._onunhandledrejection_ = function (e) {
+    error = e;
+    shouldBe(`error.type`, `"unhandledrejection"`);
+    shouldBe(`error.cancelable`, `true`);
+    shouldBe(`error.promise`, `promise`);
+    shouldBe(`error.reason`, `"ERROR"`);
+    setTimeout(function () {
+        promise.catch(function (r) {
+            global.reason = r;
+            shouldBe(`reason`, `"ERROR"`);
+        });
+    }, 0);
+    return false;
+};
+
+global._onrejectionhandled_ = function (e) {
+    global.handled = e;
+    shouldBe(`handled.type`, `"rejectionhandled"`);
+    shouldBe(`handled.cancelable`, `false`);
+    shouldBe(`handled.promise`, `promise`);
+    shouldBe(`handled.reason`, `"ERROR"`);
+    finishJSTest();
+};
+
+global.promise = Promise.reject("ERROR");

Added: trunk/LayoutTests/js/resources/unhandled-promise-rejection-order-in-workers.js (0 => 234846)


--- trunk/LayoutTests/js/resources/unhandled-promise-rejection-order-in-workers.js	                        (rev 0)
+++ trunk/LayoutTests/js/resources/unhandled-promise-rejection-order-in-workers.js	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,27 @@
+importScripts('../../resources/js-test-pre.js');
+
+description('Test unhandled promise rejection event.');
+
+var global = this;
+global.jsTestIsAsync = true;
+
+global.error = null;
+global.promise = [];
+global.count = 0;
+global.index = 0;
+global._onunhandledrejection_ = function (e) {
+    error = e;
+    index = count++;
+
+    shouldBe(`error.type`, `"unhandledrejection"`);
+    shouldBe(`error.cancelable`, `true`);
+    shouldBe(`error.promise`, `promise[${index}]`);
+    shouldBe(`error.reason`, `${index}`);
+
+    if (count === 3)
+        finishJSTest();
+    return false;
+};
+
+for (let i = 0; i < 3; ++i)
+    global.promise[i] = Promise.reject(i);

Modified: trunk/Source/WebCore/ChangeLog (234845 => 234846)


--- trunk/Source/WebCore/ChangeLog	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/Source/WebCore/ChangeLog	2018-08-14 13:04:43 UTC (rev 234846)
@@ -1,3 +1,70 @@
+2018-08-14  Yusuke Suzuki  <[email protected]>
+
+        Worker should support unhandled promise rejections
+        https://bugs.webkit.org/show_bug.cgi?id=188265
+
+        Reviewed by Darin Adler.
+
+        This patch adds PromiseRejectionEvent support in workers.
+
+        * Sources.txt:
+        * WebCore.xcodeproj/project.pbxproj:
+        * bindings/js/JSDOMGlobalObject.cpp:
+        (WebCore::JSDOMGlobalObject::promiseRejectionTracker):
+        Move promiseRejectionTracker handler from JSDOMWindowBase to JSDOMGlobalObject
+        to share it with WorkerGlobalScope.
+
+        * bindings/js/JSDOMGlobalObject.h:
+        * bindings/js/JSDOMWindowBase.cpp:
+        (WebCore::JSDOMWindowBase::promiseRejectionTracker): Deleted.
+        Moved to JSDOMGlobalObject.
+
+        * bindings/js/JSDOMWindowBase.h:
+        * bindings/js/JSExecState.cpp:
+        (WebCore::JSExecState::didLeaveScriptContext):
+        PromiseRejectionTracker is driven in workers too.
+
+        * bindings/js/JSPromiseRejectionEventCustom.cpp: Added.
+        (WebCore::JSPromiseRejectionEvent::visitAdditionalChildren):
+        Marking PromiseRejectionEvent::m_reason.
+
+        * bindings/js/JSWorkerGlobalScopeBase.cpp:
+        Configure promiseRejectionTracker.
+
+        * dom/Microtasks.cpp:
+        (WebCore::MicrotaskQueue::contextQueue):
+        * dom/Microtasks.h:
+        * dom/PromiseRejectionEvent.cpp:
+        (WebCore::PromiseRejectionEvent::PromiseRejectionEvent):
+        * dom/PromiseRejectionEvent.h:
+        * dom/PromiseRejectionEvent.idl:
+        Expose it to worker scope. The custom mark function is required since we start
+        using JSValueInWrappedObject. And the constructor no longer requires ExecState.
+
+        * dom/RejectedPromiseTracker.cpp:
+        (WebCore::RejectedPromiseTracker::reportUnhandledRejections):
+        (WebCore::RejectedPromiseTracker::reportRejectionHandled):
+        Remove state argument for PromiseRejectionEvent::create.
+
+        * dom/ScriptExecutionContext.cpp:
+        (WebCore::ScriptExecutionContext::removeRejectedPromiseTracker):
+        * dom/ScriptExecutionContext.h:
+        In worker thread, we should delete PromiseRejectionTracker before destroying VM
+        because PromiseRejectionTracker's destruction requires VM. If we destroy VM first,
+        PromiseRejectionTracker's destruction causes crashing. In main thread, we do not
+        need to handle this case since we never destroy VM.
+
+        * workers/WorkerGlobalScope.cpp:
+        (WebCore::WorkerGlobalScope::prepareForTermination):
+        (WebCore::WorkerGlobalScope::removeMicrotaskQueue): Deleted.
+        * workers/WorkerGlobalScope.h:
+        * workers/WorkerGlobalScope.idl:
+        Add onunhandledrejection and onrejectionhandled event handler attributes.
+
+        * workers/WorkerThread.cpp:
+        (WebCore::WorkerThread::stop):
+        We call WorkerGlobalScope::prepareForTermination, which cleans up Worker's objects touching VM.
+
 2018-08-14  Rob Buis  <[email protected]>
 
         Fetch: content-length header is being added to the safe-list

Modified: trunk/Source/WebCore/Sources.txt (234845 => 234846)


--- trunk/Source/WebCore/Sources.txt	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/Source/WebCore/Sources.txt	2018-08-14 13:04:43 UTC (rev 234846)
@@ -433,6 +433,7 @@
 bindings/js/JSPerformanceObserverCustom.cpp
 bindings/js/JSPluginElementFunctions.cpp
 bindings/js/JSPopStateEventCustom.cpp
+bindings/js/JSPromiseRejectionEventCustom.cpp
 bindings/js/JSReadableStreamPrivateConstructors.cpp
 bindings/js/JSReadableStreamSourceCustom.cpp
 bindings/js/JSRemoteDOMWindowBase.cpp

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (234845 => 234846)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2018-08-14 13:04:43 UTC (rev 234846)
@@ -9256,6 +9256,7 @@
 		71EFCEDA202B388F00D7C411 /* AnimationEffectReadOnly.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AnimationEffectReadOnly.cpp; sourceTree = "<group>"; };
 		71EFCEDB202B389000D7C411 /* KeyframeEffectReadOnly.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = KeyframeEffectReadOnly.idl; sourceTree = "<group>"; };
 		71EFCEDE202B39C700D7C411 /* JSAnimationEffectReadOnlyCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSAnimationEffectReadOnlyCustom.cpp; sourceTree = "<group>"; };
+		A4A69B8BB91B49D0A804C31D /* JSPromiseRejectionEventCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPromiseRejectionEventCustom.cpp; sourceTree = "<group>"; };
 		71EFCEDF202B3AA100D7C411 /* JSKeyframeEffectReadOnly.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSKeyframeEffectReadOnly.h; sourceTree = "<group>"; };
 		71EFCEE0202B3AA300D7C411 /* JSKeyframeEffectReadOnly.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSKeyframeEffectReadOnly.cpp; sourceTree = "<group>"; };
 		71F936F71DD4F99B00922CC7 /* tracks-support.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode._javascript_; path = "tracks-support.js"; sourceTree = "<group>"; };
@@ -19920,6 +19921,7 @@
 				3140C52B1FE06B4900D2A873 /* JSOffscreenCanvasRenderingContext2DCustom.cpp */,
 				CB38FD551CD21D5B00592A3F /* JSPerformanceEntryCustom.cpp */,
 				833CF70F20DB3F5F00141BCC /* JSPerformanceObserverCustom.cpp */,
+				A4A69B8BB91B49D0A804C31D /* JSPromiseRejectionEventCustom.cpp */,
 				83F572941FA1066F003837BE /* JSServiceWorkerClientCustom.cpp */,
 				460D19441FCE21DD00C3DB85 /* JSServiceWorkerGlobalScopeCustom.cpp */,
 				BC98A27C0C0C9950004BEBF7 /* JSStyleSheetCustom.cpp */,

Modified: trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp (234845 => 234846)


--- trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp	2018-08-14 13:04:43 UTC (rev 234846)
@@ -40,6 +40,7 @@
 #include "JSReadableStreamPrivateConstructors.h"
 #include "JSRemoteDOMWindow.h"
 #include "JSWorkerGlobalScope.h"
+#include "RejectedPromiseTracker.h"
 #include "RuntimeEnabledFeatures.h"
 #include "StructuredClone.h"
 #include "WebCoreJSClientData.h"
@@ -46,6 +47,8 @@
 #include "WorkerGlobalScope.h"
 #include <_javascript_Core/BuiltinNames.h>
 #include <_javascript_Core/CodeBlock.h>
+#include <_javascript_Core/JSInternalPromise.h>
+#include <_javascript_Core/JSInternalPromiseDeferred.h>
 
 namespace WebCore {
 using namespace JSC;
@@ -239,6 +242,33 @@
     return m_currentEvent;
 }
 
+void JSDOMGlobalObject::promiseRejectionTracker(JSGlobalObject* jsGlobalObject, ExecState* exec, JSPromise* promise, JSPromiseRejectionOperation operation)
+{
+    // https://html.spec.whatwg.org/multipage/webappapis.html#the-hostpromiserejectiontracker-implementation
+
+    VM& vm = exec->vm();
+    auto& globalObject = *JSC::jsCast<JSDOMGlobalObject*>(jsGlobalObject);
+    auto* context = globalObject.scriptExecutionContext();
+    if (!context)
+        return;
+
+    // InternalPromises should not be exposed to user scripts.
+    if (JSC::jsDynamicCast<JSC::JSInternalPromise*>(vm, promise))
+        return;
+
+    // FIXME: If script has muted errors (cross origin), terminate these steps.
+    // <https://webkit.org/b/171415> Implement the `muted-errors` property of Scripts to avoid onerror/onunhandledrejection for cross-origin scripts
+
+    switch (operation) {
+    case JSPromiseRejectionOperation::Reject:
+        context->ensureRejectedPromiseTracker().promiseRejected(*exec, globalObject, *promise);
+        break;
+    case JSPromiseRejectionOperation::Handle:
+        context->ensureRejectedPromiseTracker().promiseHandled(*exec, globalObject, *promise);
+        break;
+    }
+}
+
 JSDOMGlobalObject& callerGlobalObject(ExecState& state)
 {
     class GetCallerGlobalObjectFunctor {

Modified: trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.h (234845 => 234846)


--- trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.h	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.h	2018-08-14 13:04:43 UTC (rev 234846)
@@ -91,6 +91,8 @@
     }
 
 protected:
+    static void promiseRejectionTracker(JSC::JSGlobalObject*, JSC::ExecState*, JSC::JSPromise*, JSC::JSPromiseRejectionOperation);
+
     JSDOMStructureMap m_structures;
     JSDOMConstructorMap m_constructors;
     DOMGuardedObjectSet m_guardedObjects;

Modified: trunk/Source/WebCore/bindings/js/JSDOMWindowBase.cpp (234845 => 234846)


--- trunk/Source/WebCore/bindings/js/JSDOMWindowBase.cpp	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/Source/WebCore/bindings/js/JSDOMWindowBase.cpp	2018-08-14 13:04:43 UTC (rev 234846)
@@ -465,31 +465,4 @@
 }
 #endif
 
-void JSDOMWindowBase::promiseRejectionTracker(JSGlobalObject* jsGlobalObject, ExecState* exec, JSPromise* promise, JSPromiseRejectionOperation operation)
-{
-    // https://html.spec.whatwg.org/multipage/webappapis.html#the-hostpromiserejectiontracker-implementation
-
-    VM& vm = exec->vm();
-    auto& globalObject = *JSC::jsCast<JSDOMWindowBase*>(jsGlobalObject);
-    auto* context = globalObject.scriptExecutionContext();
-    if (!context)
-        return;
-
-    // InternalPromises should not be exposed to user scripts.
-    if (JSC::jsDynamicCast<JSC::JSInternalPromise*>(vm, promise))
-        return;
-
-    // FIXME: If script has muted errors (cross origin), terminate these steps.
-    // <https://webkit.org/b/171415> Implement the `muted-errors` property of Scripts to avoid onerror/onunhandledrejection for cross-origin scripts
-
-    switch (operation) {
-    case JSPromiseRejectionOperation::Reject:
-        context->ensureRejectedPromiseTracker().promiseRejected(*exec, globalObject, *promise);
-        break;
-    case JSPromiseRejectionOperation::Handle:
-        context->ensureRejectedPromiseTracker().promiseHandled(*exec, globalObject, *promise);
-        break;
-    }
-}
-
 } // namespace WebCore

Modified: trunk/Source/WebCore/bindings/js/JSDOMWindowBase.h (234845 => 234846)


--- trunk/Source/WebCore/bindings/js/JSDOMWindowBase.h	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/Source/WebCore/bindings/js/JSDOMWindowBase.h	2018-08-14 13:04:43 UTC (rev 234846)
@@ -102,8 +102,6 @@
     static void instantiateStreaming(JSC::JSGlobalObject*, JSC::ExecState*, JSC::JSPromiseDeferred*, JSC::JSValue, JSC::JSObject*);
 #endif
 
-    static void promiseRejectionTracker(JSC::JSGlobalObject*, JSC::ExecState*, JSC::JSPromise*, JSC::JSPromiseRejectionOperation);
-
     RefPtr<DOMWindow> m_wrapped;
     JSWindowProxy* m_proxy;
 };

Modified: trunk/Source/WebCore/bindings/js/JSExecState.cpp (234845 => 234846)


--- trunk/Source/WebCore/bindings/js/JSExecState.cpp	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/Source/WebCore/bindings/js/JSExecState.cpp	2018-08-14 13:04:43 UTC (rev 234846)
@@ -36,20 +36,9 @@
 
 void JSExecState::didLeaveScriptContext(JSC::ExecState* exec)
 {
-    // While main thread has many ScriptExecutionContexts, WorkerGlobalScope and worker thread have
-    // one on one correspondence. The lifetime of MicrotaskQueue is aligned to this semantics.
-    // While main thread MicrotaskQueue is persistently held, worker's MicrotaskQueue is held by
-    // WorkerGlobalScope.
     ScriptExecutionContext* context = scriptExecutionContextFromExecState(exec);
-    if (isMainThread()) {
-        MicrotaskQueue::mainThreadQueue().performMicrotaskCheckpoint();
-        // FIXME: Promise rejection tracker is available only in non-worker environment.
-        // https://bugs.webkit.org/show_bug.cgi?id=188265
-        context->ensureRejectedPromiseTracker().processQueueSoon();
-    } else {
-        ASSERT(context->isWorkerGlobalScope());
-        static_cast<WorkerGlobalScope*>(context)->microtaskQueue().performMicrotaskCheckpoint();
-    }
+    MicrotaskQueue::contextQueue(*context).performMicrotaskCheckpoint();
+    context->ensureRejectedPromiseTracker().processQueueSoon();
 }
 
 JSC::JSValue functionCallHandlerFromAnyThread(JSC::ExecState* exec, JSC::JSValue functionObject, JSC::CallType callType, const JSC::CallData& callData, JSC::JSValue thisValue, const JSC::ArgList& args, NakedPtr<JSC::Exception>& returnedException)

Added: trunk/Source/WebCore/bindings/js/JSPromiseRejectionEventCustom.cpp (0 => 234846)


--- trunk/Source/WebCore/bindings/js/JSPromiseRejectionEventCustom.cpp	                        (rev 0)
+++ trunk/Source/WebCore/bindings/js/JSPromiseRejectionEventCustom.cpp	2018-08-14 13:04:43 UTC (rev 234846)
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2018 Yusuke Suzuki <[email protected]>.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "JSPromiseRejectionEvent.h"
+
+#include "PromiseRejectionEvent.h"
+#include <_javascript_Core/HeapInlines.h>
+#include <_javascript_Core/JSCJSValueInlines.h>
+
+namespace WebCore {
+
+void JSPromiseRejectionEvent::visitAdditionalChildren(JSC::SlotVisitor& visitor)
+{
+    wrapped().reason().visit(visitor);
+}
+
+} // namespace WebCore

Modified: trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp (234845 => 234846)


--- trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp	2018-08-14 13:04:43 UTC (rev 234846)
@@ -62,7 +62,7 @@
     nullptr, // moduleLoaderFetch
     nullptr, // moduleLoaderCreateImportMetaProperties
     nullptr, // moduleLoaderEvaluate
-    nullptr, // promiseRejectionTracker
+    &promiseRejectionTracker,
     &defaultLanguage,
     nullptr, // compileStreaming
     nullptr, // instantiateStreaming

Modified: trunk/Source/WebCore/dom/Microtasks.cpp (234845 => 234846)


--- trunk/Source/WebCore/dom/Microtasks.cpp	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/Source/WebCore/dom/Microtasks.cpp	2018-08-14 13:04:43 UTC (rev 234846)
@@ -47,6 +47,18 @@
     return queue;
 }
 
+MicrotaskQueue& MicrotaskQueue::contextQueue(ScriptExecutionContext& context)
+{
+    // While main thread has many ScriptExecutionContexts, WorkerGlobalScope and worker thread have
+    // one on one correspondence. The lifetime of MicrotaskQueue is aligned to this semantics.
+    // While main thread MicrotaskQueue is persistently held, worker's MicrotaskQueue is held by
+    // WorkerGlobalScope.
+    if (isMainThread())
+        return mainThreadQueue();
+    ASSERT(context.isWorkerGlobalScope());
+    return downcast<WorkerGlobalScope>(context).microtaskQueue();
+}
+
 void MicrotaskQueue::append(std::unique_ptr<Microtask>&& task)
 {
     m_microtaskQueue.append(WTFMove(task));

Modified: trunk/Source/WebCore/dom/Microtasks.h (234845 => 234846)


--- trunk/Source/WebCore/dom/Microtasks.h	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/Source/WebCore/dom/Microtasks.h	2018-08-14 13:04:43 UTC (rev 234846)
@@ -28,6 +28,7 @@
 namespace WebCore {
 
 class MicrotaskQueue;
+class ScriptExecutionContext;
 
 class Microtask {
 public:
@@ -69,6 +70,7 @@
     friend class Microtask;
 public:
     WEBCORE_EXPORT static MicrotaskQueue& mainThreadQueue();
+    WEBCORE_EXPORT static MicrotaskQueue& contextQueue(ScriptExecutionContext&);
 
     WEBCORE_EXPORT MicrotaskQueue();
     WEBCORE_EXPORT ~MicrotaskQueue();

Modified: trunk/Source/WebCore/dom/PromiseRejectionEvent.cpp (234845 => 234846)


--- trunk/Source/WebCore/dom/PromiseRejectionEvent.cpp	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/Source/WebCore/dom/PromiseRejectionEvent.cpp	2018-08-14 13:04:43 UTC (rev 234846)
@@ -34,10 +34,10 @@
 namespace WebCore {
 using namespace JSC;
 
-PromiseRejectionEvent::PromiseRejectionEvent(ExecState& state, const AtomicString& type, const Init& initializer, IsTrusted isTrusted)
+PromiseRejectionEvent::PromiseRejectionEvent(const AtomicString& type, const Init& initializer, IsTrusted isTrusted)
     : Event(type, initializer, isTrusted)
     , m_promise(*(initializer.promise))
-    , m_reason(state.vm(), initializer.reason)
+    , m_reason(initializer.reason)
 {
 }
 

Modified: trunk/Source/WebCore/dom/PromiseRejectionEvent.h (234845 => 234846)


--- trunk/Source/WebCore/dom/PromiseRejectionEvent.h	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/Source/WebCore/dom/PromiseRejectionEvent.h	2018-08-14 13:04:43 UTC (rev 234846)
@@ -26,7 +26,7 @@
 #pragma once
 
 #include "Event.h"
-#include <_javascript_Core/Strong.h>
+#include "JSValueInWrappedObject.h"
 
 namespace WebCore {
 
@@ -39,25 +39,23 @@
         JSC::JSValue reason;
     };
 
-    static Ref<PromiseRejectionEvent> create(JSC::ExecState& state, const AtomicString& type, const Init& initializer, IsTrusted isTrusted = IsTrusted::No)
+    static Ref<PromiseRejectionEvent> create(const AtomicString& type, const Init& initializer, IsTrusted isTrusted = IsTrusted::No)
     {
-        return adoptRef(*new PromiseRejectionEvent(state, type, initializer, isTrusted));
+        return adoptRef(*new PromiseRejectionEvent(type, initializer, isTrusted));
     }
 
     virtual ~PromiseRejectionEvent();
 
     DOMPromise& promise() const { return m_promise.get(); }
-    JSC::JSValue reason() const { return m_reason.get(); }
+    const JSValueInWrappedObject& reason() const { return m_reason; }
 
     EventInterface eventInterface() const override { return PromiseRejectionEventInterfaceType; }
 
 private:
-    PromiseRejectionEvent(JSC::ExecState&, const AtomicString&, const Init&, IsTrusted);
+    PromiseRejectionEvent(const AtomicString&, const Init&, IsTrusted);
 
     Ref<DOMPromise> m_promise;
-    // FIXME: The following use of JSC::Strong is incorrect and can lead to storage leaks
-    // due to reference cycles; we should use JSValueInWrappedObject instead.
-    JSC::Strong<JSC::Unknown> m_reason;
+    JSValueInWrappedObject m_reason;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/dom/PromiseRejectionEvent.idl (234845 => 234846)


--- trunk/Source/WebCore/dom/PromiseRejectionEvent.idl	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/Source/WebCore/dom/PromiseRejectionEvent.idl	2018-08-14 13:04:43 UTC (rev 234846)
@@ -25,8 +25,8 @@
 
 [
     Constructor(DOMString type, PromiseRejectionEventInit eventInitDict),
-    ConstructorCallWith=ScriptState,
-    Exposed=(Window),
+    Exposed=(Window,Worker),
+    JSCustomMarkFunction,
 ] interface PromiseRejectionEvent : Event {
     readonly attribute Promise<any> promise;
     readonly attribute any reason;

Modified: trunk/Source/WebCore/dom/RejectedPromiseTracker.cpp (234845 => 234846)


--- trunk/Source/WebCore/dom/RejectedPromiseTracker.cpp	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/Source/WebCore/dom/RejectedPromiseTracker.cpp	2018-08-14 13:04:43 UTC (rev 234846)
@@ -166,7 +166,7 @@
         initializer.promise = &domPromise;
         initializer.reason = promise.result(vm);
 
-        auto event = PromiseRejectionEvent::create(state, eventNames().unhandledrejectionEvent, initializer);
+        auto event = PromiseRejectionEvent::create(eventNames().unhandledrejectionEvent, initializer);
         auto target = m_context.errorEventTarget();
         target->dispatchEvent(event);
 
@@ -188,7 +188,6 @@
     if (rejectedPromise->isSuspended())
         return;
 
-    auto& state = *rejectedPromise->globalObject()->globalExec();
     auto& promise = *rejectedPromise->promise();
 
     PromiseRejectionEvent::Init initializer;
@@ -195,7 +194,7 @@
     initializer.promise = rejectedPromise.ptr();
     initializer.reason = promise.result(vm);
 
-    auto event = PromiseRejectionEvent::create(state, eventNames().rejectionhandledEvent, initializer);
+    auto event = PromiseRejectionEvent::create(eventNames().rejectionhandledEvent, initializer);
     auto target = m_context.errorEventTarget();
     target->dispatchEvent(event);
 }

Modified: trunk/Source/WebCore/dom/ScriptExecutionContext.cpp (234845 => 234846)


--- trunk/Source/WebCore/dom/ScriptExecutionContext.cpp	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/Source/WebCore/dom/ScriptExecutionContext.cpp	2018-08-14 13:04:43 UTC (rev 234846)
@@ -497,6 +497,11 @@
     return *m_rejectedPromiseTracker.get();
 }
 
+void ScriptExecutionContext::removeRejectedPromiseTracker()
+{
+    m_rejectedPromiseTracker = nullptr;
+}
+
 void ScriptExecutionContext::setDatabaseContext(DatabaseContext* databaseContext)
 {
     m_databaseContext = databaseContext;

Modified: trunk/Source/WebCore/dom/ScriptExecutionContext.h (234845 => 234846)


--- trunk/Source/WebCore/dom/ScriptExecutionContext.h	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/Source/WebCore/dom/ScriptExecutionContext.h	2018-08-14 13:04:43 UTC (rev 234846)
@@ -283,6 +283,7 @@
 
     bool hasPendingActivity() const;
     void removeFromContextsMap();
+    void removeRejectedPromiseTracker();
 
 private:
     // The following addMessage function is deprecated.

Modified: trunk/Source/WebCore/workers/WorkerGlobalScope.cpp (234845 => 234846)


--- trunk/Source/WebCore/workers/WorkerGlobalScope.cpp	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/Source/WebCore/workers/WorkerGlobalScope.cpp	2018-08-14 13:04:43 UTC (rev 234846)
@@ -105,6 +105,25 @@
     return securityOrigin ? securityOrigin->toString() : emptyString();
 }
 
+void WorkerGlobalScope::prepareForTermination()
+{
+#if ENABLE(INDEXED_DATABASE)
+    stopIndexedDatabase();
+#endif
+
+    stopActiveDOMObjects();
+
+    m_inspectorController->workerTerminating();
+
+    // Event listeners would keep DOMWrapperWorld objects alive for too long. Also, they have references to JS objects,
+    // which become dangling once Heap is destroyed.
+    removeAllEventListeners();
+
+    // MicrotaskQueue and RejectedPromiseTracker reference Heap.
+    m_microtaskQueue = nullptr;
+    removeRejectedPromiseTracker();
+}
+
 void WorkerGlobalScope::removeAllEventListeners()
 {
     EventTarget::removeAllEventListeners();
@@ -112,11 +131,6 @@
     m_performance->removeAllObservers();
 }
 
-void WorkerGlobalScope::removeMicrotaskQueue()
-{
-    m_microtaskQueue = nullptr;
-}
-
 bool WorkerGlobalScope::isSecureContext() const
 {
     return securityOrigin() && securityOrigin()->isPotentiallyTrustworthy();

Modified: trunk/Source/WebCore/workers/WorkerGlobalScope.h (234845 => 234846)


--- trunk/Source/WebCore/workers/WorkerGlobalScope.h	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/Source/WebCore/workers/WorkerGlobalScope.h	2018-08-14 13:04:43 UTC (rev 234846)
@@ -69,7 +69,6 @@
 
 #if ENABLE(INDEXED_DATABASE)
     IDBClient::IDBConnectionProxy* idbConnectionProxy() final;
-    void stopIndexedDatabase();
 #endif
 
     WorkerCacheStorageConnection& cacheStorageConnection();
@@ -117,10 +116,10 @@
     Crypto& crypto();
     Performance& performance() const;
 
+    void prepareForTermination();
+
     void removeAllEventListeners() final;
 
-    void removeMicrotaskQueue();
-
     void createImageBitmap(ImageBitmap::Source&&, ImageBitmapOptions&&, ImageBitmap::Promise&&);
     void createImageBitmap(ImageBitmap::Source&&, int sx, int sy, int sw, int sh, ImageBitmapOptions&&, ImageBitmap::Promise&&);
 
@@ -174,6 +173,10 @@
     bool unwrapCryptoKey(const Vector<uint8_t>& wrappedKey, Vector<uint8_t>& key) final;
 #endif
 
+#if ENABLE(INDEXED_DATABASE)
+    void stopIndexedDatabase();
+#endif
+
     URL m_url;
     String m_identifier;
     String m_userAgent;

Modified: trunk/Source/WebCore/workers/WorkerGlobalScope.idl (234845 => 234846)


--- trunk/Source/WebCore/workers/WorkerGlobalScope.idl	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/Source/WebCore/workers/WorkerGlobalScope.idl	2018-08-14 13:04:43 UTC (rev 234846)
@@ -39,6 +39,8 @@
     attribute EventHandler onerror;
     attribute EventHandler onoffline;
     attribute EventHandler ononline;
+    attribute EventHandler onrejectionhandled;
+    attribute EventHandler onunhandledrejection;
 
     // WorkerUtils
 

Modified: trunk/Source/WebCore/workers/WorkerThread.cpp (234845 => 234846)


--- trunk/Source/WebCore/workers/WorkerThread.cpp	2018-08-14 12:41:42 UTC (rev 234845)
+++ trunk/Source/WebCore/workers/WorkerThread.cpp	2018-08-14 13:04:43 UTC (rev 234846)
@@ -287,21 +287,8 @@
         m_runLoop.postTaskAndTerminate({ ScriptExecutionContext::Task::CleanupTask, [] (ScriptExecutionContext& context ) {
             WorkerGlobalScope& workerGlobalScope = downcast<WorkerGlobalScope>(context);
 
-#if ENABLE(INDEXED_DATABASE)
-            workerGlobalScope.stopIndexedDatabase();
-#endif
+            workerGlobalScope.prepareForTermination();
 
-            workerGlobalScope.stopActiveDOMObjects();
-
-            workerGlobalScope.inspectorController().workerTerminating();
-
-            // Event listeners would keep DOMWrapperWorld objects alive for too long. Also, they have references to JS objects,
-            // which become dangling once Heap is destroyed.
-            workerGlobalScope.removeAllEventListeners();
-
-            // MicrotaskQueue references Heap.
-            workerGlobalScope.removeMicrotaskQueue();
-
             // Stick a shutdown command at the end of the queue, so that we deal
             // with all the cleanup tasks the databases post first.
             workerGlobalScope.postTask({ ScriptExecutionContext::Task::CleanupTask, [] (ScriptExecutionContext& context) {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to