Title: [293001] branches/safari-613-branch/Source/WebCore
Revision
293001
Author
alanc...@apple.com
Date
2022-04-18 17:50:22 -0700 (Mon, 18 Apr 2022)

Log Message

Cherry-pick r292779. rdar://problem/89750945

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

    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@292779 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Modified Paths

Diff

Modified: branches/safari-613-branch/Source/WebCore/ChangeLog (293000 => 293001)


--- branches/safari-613-branch/Source/WebCore/ChangeLog	2022-04-19 00:50:18 UTC (rev 293000)
+++ branches/safari-613-branch/Source/WebCore/ChangeLog	2022-04-19 00:50:22 UTC (rev 293001)
@@ -1,5 +1,48 @@
 2022-04-18  Kocsen Chung  <kocsen_ch...@apple.com>
 
+        Cherry-pick r292779. rdar://problem/89750945
+
+    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):
+    
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@292779 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2022-04-12  Gabriel Nava Marino  <gnavamar...@apple.com>
+
+            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-18  Kocsen Chung  <kocsen_ch...@apple.com>
+
         Cherry-pick r292638. rdar://problem/91255370
 
     Simplify / Optimize the whitespace cache implementation

Modified: branches/safari-613-branch/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp (293000 => 293001)


--- branches/safari-613-branch/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp	2022-04-19 00:50:18 UTC (rev 293000)
+++ branches/safari-613-branch/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp	2022-04-19 00:50:22 UTC (rev 293001)
@@ -313,15 +313,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: branches/safari-613-branch/Source/WebCore/bindings/js/JSExecState.cpp (293000 => 293001)


--- branches/safari-613-branch/Source/WebCore/bindings/js/JSExecState.cpp	2022-04-19 00:50:18 UTC (rev 293000)
+++ branches/safari-613-branch/Source/WebCore/bindings/js/JSExecState.cpp	2022-04-19 00:50:22 UTC (rev 293001)
@@ -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: branches/safari-613-branch/Source/WebCore/dom/ScriptExecutionContext.cpp (293000 => 293001)


--- branches/safari-613-branch/Source/WebCore/dom/ScriptExecutionContext.cpp	2022-04-19 00:50:18 UTC (rev 293000)
+++ branches/safari-613-branch/Source/WebCore/dom/ScriptExecutionContext.cpp	2022-04-19 00:50:22 UTC (rev 293001)
@@ -508,14 +508,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: branches/safari-613-branch/Source/WebCore/dom/ScriptExecutionContext.h (293000 => 293001)


--- branches/safari-613-branch/Source/WebCore/dom/ScriptExecutionContext.h	2022-04-19 00:50:18 UTC (rev 293000)
+++ branches/safari-613-branch/Source/WebCore/dom/ScriptExecutionContext.h	2022-04-19 00:50:22 UTC (rev 293001)
@@ -254,10 +254,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();
     }
 
@@ -320,7 +320,7 @@
     enum class ShouldContinue { No, Yes };
     void forEachActiveDOMObject(const Function<ShouldContinue(ActiveDOMObject&)>&) const;
 
-    RejectedPromiseTracker& ensureRejectedPromiseTrackerSlow();
+    RejectedPromiseTracker* ensureRejectedPromiseTrackerSlow();
 
     void checkConsistency() const;
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to