Title: [292779] trunk/Source/WebCore
Revision
292779
Author
[email protected]
Date
2022-04-12 11:08:56 -0700 (Tue, 12 Apr 2022)

Log Message

RejectedPromiseTracker can be recreated if we are in a worker / worklet whose execution is terminating
https://bugs.webkit.org/show_bug.cgi?id=239130

Reviewed by Chris Dumez.

We update ScriptExecutionContext::ensureRejectedPromiseTrackerSlow so that we wont
recreate the promise tracker if we are in a worker / worklet whose execution is terminating.

* bindings/js/JSDOMGlobalObject.cpp:
(WebCore::JSDOMGlobalObject::promiseRejectionTracker):
* bindings/js/JSExecState.cpp:
(WebCore::JSExecState::didLeaveScriptContext):
* dom/ScriptExecutionContext.cpp:
(WebCore::ScriptExecutionContext::ensureRejectedPromiseTrackerSlow):
* dom/ScriptExecutionContext.h:
(WebCore::ScriptExecutionContext::ensureRejectedPromiseTracker):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (292778 => 292779)


--- trunk/Source/WebCore/ChangeLog	2022-04-12 17:54:56 UTC (rev 292778)
+++ trunk/Source/WebCore/ChangeLog	2022-04-12 18:08:56 UTC (rev 292779)
@@ -1,3 +1,22 @@
+2022-04-12  Gabriel Nava Marino  <[email protected]>
+
+        RejectedPromiseTracker can be recreated if we are in a worker / worklet whose execution is terminating
+        https://bugs.webkit.org/show_bug.cgi?id=239130
+
+        Reviewed by Chris Dumez.
+
+        We update ScriptExecutionContext::ensureRejectedPromiseTrackerSlow so that we wont
+        recreate the promise tracker if we are in a worker / worklet whose execution is terminating.
+
+        * bindings/js/JSDOMGlobalObject.cpp:
+        (WebCore::JSDOMGlobalObject::promiseRejectionTracker):
+        * bindings/js/JSExecState.cpp:
+        (WebCore::JSExecState::didLeaveScriptContext):
+        * dom/ScriptExecutionContext.cpp:
+        (WebCore::ScriptExecutionContext::ensureRejectedPromiseTrackerSlow):
+        * dom/ScriptExecutionContext.h:
+        (WebCore::ScriptExecutionContext::ensureRejectedPromiseTracker):
+
 2022-04-12  Tyler Wilcock  <[email protected]>
 
         AX: Incorrect role on dynamic lists

Modified: trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp (292778 => 292779)


--- trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp	2022-04-12 17:54:56 UTC (rev 292778)
+++ trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp	2022-04-12 18:08:56 UTC (rev 292779)
@@ -318,15 +318,19 @@
     if (!context)
         return;
 
+    auto rejectedPromiseTracker = context->ensureRejectedPromiseTracker();
+    if (!rejectedPromiseTracker)
+        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(globalObject, *promise);
+        rejectedPromiseTracker->promiseRejected(globalObject, *promise);
         break;
     case JSPromiseRejectionOperation::Handle:
-        context->ensureRejectedPromiseTracker().promiseHandled(globalObject, *promise);
+        rejectedPromiseTracker->promiseHandled(globalObject, *promise);
         break;
     }
 }

Modified: trunk/Source/WebCore/bindings/js/JSExecState.cpp (292778 => 292779)


--- trunk/Source/WebCore/bindings/js/JSExecState.cpp	2022-04-12 17:54:56 UTC (rev 292778)
+++ trunk/Source/WebCore/bindings/js/JSExecState.cpp	2022-04-12 18:08:56 UTC (rev 292779)
@@ -39,7 +39,8 @@
     if (!context)
         return;
     context->eventLoop().performMicrotaskCheckpoint();
-    context->ensureRejectedPromiseTracker().processQueueSoon();
+    if (auto rejectedPromiseTracker = context->ensureRejectedPromiseTracker())
+        rejectedPromiseTracker->processQueueSoon();
 }
 
 JSC::JSValue functionCallHandlerFromAnyThread(JSC::JSGlobalObject* lexicalGlobalObject, JSC::JSValue functionObject, const JSC::CallData& callData, JSC::JSValue thisValue, const JSC::ArgList& args, NakedPtr<JSC::Exception>& returnedException)

Modified: trunk/Source/WebCore/dom/ScriptExecutionContext.cpp (292778 => 292779)


--- trunk/Source/WebCore/dom/ScriptExecutionContext.cpp	2022-04-12 17:54:56 UTC (rev 292778)
+++ trunk/Source/WebCore/dom/ScriptExecutionContext.cpp	2022-04-12 18:08:56 UTC (rev 292779)
@@ -528,14 +528,20 @@
     return DOMTimer::defaultAlignmentInterval();
 }
 
-RejectedPromiseTracker& ScriptExecutionContext::ensureRejectedPromiseTrackerSlow()
+RejectedPromiseTracker* ScriptExecutionContext::ensureRejectedPromiseTrackerSlow()
 {
     // ScriptExecutionContext::vm() in Worker is only available after WorkerGlobalScope initialization is done.
     // When initializing ScriptExecutionContext, vm() is not ready.
 
     ASSERT(!m_rejectedPromiseTracker);
+    if (is<WorkerOrWorkletGlobalScope>(*this)) {
+        auto* scriptController = downcast<WorkerOrWorkletGlobalScope>(*this).script();
+        // Do not re-create the promise tracker if we are in a worker / worklet whose execution is terminating.
+        if (!scriptController || scriptController->isTerminatingExecution())
+            return nullptr;
+    }
     m_rejectedPromiseTracker = makeUnique<RejectedPromiseTracker>(*this, vm());
-    return *m_rejectedPromiseTracker.get();
+    return m_rejectedPromiseTracker.get();
 }
 
 void ScriptExecutionContext::removeRejectedPromiseTracker()

Modified: trunk/Source/WebCore/dom/ScriptExecutionContext.h (292778 => 292779)


--- trunk/Source/WebCore/dom/ScriptExecutionContext.h	2022-04-12 17:54:56 UTC (rev 292778)
+++ trunk/Source/WebCore/dom/ScriptExecutionContext.h	2022-04-12 18:08:56 UTC (rev 292779)
@@ -266,10 +266,10 @@
     int timerNestingLevel() const { return m_timerNestingLevel; }
     void setTimerNestingLevel(int timerNestingLevel) { m_timerNestingLevel = timerNestingLevel; }
 
-    RejectedPromiseTracker& ensureRejectedPromiseTracker()
+    RejectedPromiseTracker* ensureRejectedPromiseTracker()
     {
         if (m_rejectedPromiseTracker)
-            return *m_rejectedPromiseTracker.get();
+            return m_rejectedPromiseTracker.get();
         return ensureRejectedPromiseTrackerSlow();
     }
 
@@ -352,7 +352,7 @@
     enum class ShouldContinue { No, Yes };
     void forEachActiveDOMObject(const Function<ShouldContinue(ActiveDOMObject&)>&) const;
 
-    RejectedPromiseTracker& ensureRejectedPromiseTrackerSlow();
+    RejectedPromiseTracker* ensureRejectedPromiseTrackerSlow();
 
     void checkConsistency() const;
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to