Changeset 268822 in webkit
- Timestamp:
- Oct 21, 2020, 2:15:48 PM (6 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 13 edited
-
ChangeLog (modified) (1 diff)
-
Modules/webaudio/AudioWorkletGlobalScope.cpp (modified) (1 diff)
-
Modules/webaudio/AudioWorkletGlobalScope.h (modified) (1 diff)
-
Modules/webaudio/AudioWorkletThread.cpp (modified) (1 diff)
-
workers/WorkerEventLoop.cpp (modified) (1 diff)
-
workers/WorkerEventLoop.h (modified) (2 diffs)
-
workers/WorkerGlobalScope.cpp (modified) (16 diffs)
-
workers/WorkerGlobalScope.h (modified) (12 diffs)
-
workers/WorkerOrWorkletGlobalScope.cpp (modified) (2 diffs)
-
workers/WorkerOrWorkletGlobalScope.h (modified) (2 diffs)
-
workers/WorkerThread.cpp (modified) (1 diff)
-
worklets/WorkletGlobalScope.cpp (modified) (7 diffs)
-
worklets/WorkletGlobalScope.h (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r268821 r268822 1 2020-10-21 Chris Dumez <cdumez@apple.com> 2 3 Share more code between WorkerGlobalScope and WorkletGlobalScope 4 https://bugs.webkit.org/show_bug.cgi?id=217995 5 6 Reviewed by Darin Adler. 7 8 Share more code between WorkerGlobalScope and WorkletGlobalScope by 9 moving shared logic to WorkerOrWorkletGlobalScope. 10 11 No new tests, no Web-facing behavior change. 12 13 * Modules/webaudio/AudioWorkletGlobalScope.cpp: 14 (WebCore::AudioWorkletGlobalScope::prepareForDestruction): 15 * Modules/webaudio/AudioWorkletGlobalScope.h: 16 * Modules/webaudio/AudioWorkletThread.cpp: 17 (WebCore::AudioWorkletThread::stop): 18 * workers/WorkerEventLoop.cpp: 19 (WebCore::WorkerEventLoop::create): 20 (WebCore::WorkerEventLoop::WorkerEventLoop): 21 * workers/WorkerEventLoop.h: 22 * workers/WorkerGlobalScope.cpp: 23 (WebCore::WorkerGlobalScope::WorkerGlobalScope): 24 (WebCore::WorkerGlobalScope::prepareForDestruction): 25 (WebCore::WorkerGlobalScope::removeAllEventListeners): 26 (WebCore::WorkerGlobalScope::suspend): 27 (WebCore::WorkerGlobalScope::resume): 28 (WebCore::WorkerGlobalScope::close): 29 (WebCore::WorkerGlobalScope::wrapCryptoKey): 30 (WebCore::WorkerGlobalScope::unwrapCryptoKey): 31 (WebCore::WorkerGlobalScope::thread const): 32 * workers/WorkerGlobalScope.h: 33 * workers/WorkerOrWorkletGlobalScope.cpp: 34 (WebCore::WorkerOrWorkletGlobalScope::WorkerOrWorkletGlobalScope): 35 (WebCore::WorkerOrWorkletGlobalScope::prepareForDestruction): 36 (WebCore::WorkerOrWorkletGlobalScope::disableEval): 37 (WebCore::WorkerOrWorkletGlobalScope::disableWebAssembly): 38 (WebCore::WorkerOrWorkletGlobalScope::isJSExecutionForbidden const): 39 (WebCore::WorkerOrWorkletGlobalScope::eventLoop): 40 (WebCore::WorkerOrWorkletGlobalScope::isContextThread const): 41 (WebCore::WorkerOrWorkletGlobalScope::postTask): 42 * workers/WorkerOrWorkletGlobalScope.h: 43 (WebCore::WorkerOrWorkletGlobalScope::isClosing const): 44 (WebCore::WorkerOrWorkletGlobalScope::workerOrWorkletThread const): 45 (WebCore::WorkerOrWorkletGlobalScope::markAsClosing): 46 * workers/WorkerThread.cpp: 47 (WebCore::WorkerThread::stop): 48 * worklets/WorkletGlobalScope.cpp: 49 (WebCore::WorkletGlobalScope::WorkletGlobalScope): 50 (WebCore::WorkletGlobalScope::prepareForDestruction): 51 * worklets/WorkletGlobalScope.h: 52 1 53 2020-10-21 Zalan Bujtas <zalan@apple.com> 2 54 -
trunk/Source/WebCore/Modules/webaudio/AudioWorkletGlobalScope.cpp
r268812 r268822 144 144 } 145 145 146 void AudioWorkletGlobalScope::prepareFor Termination()146 void AudioWorkletGlobalScope::prepareForDestruction() 147 147 { 148 if (auto* defaultTaskGroup = this->defaultTaskGroup())149 defaultTaskGroup->stopAndDiscardAllTasks();150 stopActiveDOMObjects();151 152 148 m_processorConstructorMap.clear(); 153 149 154 // Event listeners would keep DOMWrapperWorld objects alive for too long. Also, they have references to JS objects, 155 // which become dangling once Heap is destroyed. 156 removeAllEventListeners(); 157 158 // MicrotaskQueue and RejectedPromiseTracker reference Heap. 159 if (auto* eventLoop = this->existingEventLoop()) 160 eventLoop->clearMicrotaskQueue(); 161 removeRejectedPromiseTracker(); 162 } 163 164 void AudioWorkletGlobalScope::postTask(Task&& task) 165 { 166 thread().runLoop().postTask(WTFMove(task)); 150 WorkletGlobalScope::prepareForDestruction(); 167 151 } 168 152 -
trunk/Source/WebCore/Modules/webaudio/AudioWorkletGlobalScope.h
r268369 r268822 62 62 63 63 AudioWorkletThread& thread() const; 64 void prepareForTermination(); 65 66 void postTask(Task&&) final; 64 void prepareForDestruction() final; 67 65 68 66 std::unique_ptr<AudioWorkletProcessorConstructionData> takePendingProcessorConstructionData(); -
trunk/Source/WebCore/Modules/webaudio/AudioWorkletThread.cpp
r268775 r268822 88 88 auto& workletGlobalScope = downcast<AudioWorkletGlobalScope>(context); 89 89 90 workletGlobalScope.prepareFor Termination();90 workletGlobalScope.prepareForDestruction(); 91 91 92 92 // Stick a shutdown command at the end of the queue, so that we deal -
trunk/Source/WebCore/workers/WorkerEventLoop.cpp
r267859 r268822 28 28 29 29 #include "Microtasks.h" 30 #include "WorkerGlobalScope.h" 31 #include "WorkletGlobalScope.h" 30 #include "WorkerOrWorkletGlobalScope.h" 32 31 33 32 namespace WebCore { 34 33 35 Ref<WorkerEventLoop> WorkerEventLoop::create(Worker GlobalScope& context)34 Ref<WorkerEventLoop> WorkerEventLoop::create(WorkerOrWorkletGlobalScope& context) 36 35 { 37 36 return adoptRef(*new WorkerEventLoop(context)); 38 37 } 39 38 40 Ref<WorkerEventLoop> WorkerEventLoop::create(WorkletGlobalScope& context) 41 { 42 return adoptRef(*new WorkerEventLoop(context)); 43 } 44 45 WorkerEventLoop::WorkerEventLoop(ScriptExecutionContext& context) 39 WorkerEventLoop::WorkerEventLoop(WorkerOrWorkletGlobalScope& context) 46 40 : ContextDestructionObserver(&context) 47 41 { -
trunk/Source/WebCore/workers/WorkerEventLoop.h
r267859 r268822 31 31 namespace WebCore { 32 32 33 class WorkerGlobalScope; 34 class WorkletGlobalScope; 33 class WorkerOrWorkletGlobalScope; 35 34 36 35 class WorkerEventLoop final : public EventLoop, private ContextDestructionObserver { 37 36 public: 38 // Explicitly take WorkerGlobalScope and WorkletGlobalScope for documentation purposes. 39 static Ref<WorkerEventLoop> create(WorkerGlobalScope&); 40 static Ref<WorkerEventLoop> create(WorkletGlobalScope&); 37 static Ref<WorkerEventLoop> create(WorkerOrWorkletGlobalScope&); 41 38 42 39 virtual ~WorkerEventLoop(); … … 46 43 47 44 private: 48 explicit WorkerEventLoop( ScriptExecutionContext&);45 explicit WorkerEventLoop(WorkerOrWorkletGlobalScope&); 49 46 50 47 void scheduleToRun() final; -
trunk/Source/WebCore/workers/WorkerGlobalScope.cpp
r268775 r268822 44 44 #include "ServiceWorkerGlobalScope.h" 45 45 #include "SocketProvider.h" 46 #include "WorkerEventLoop.h"47 46 #include "WorkerInspectorController.h" 48 47 #include "WorkerLoaderProxy.h" … … 63 62 64 63 WorkerGlobalScope::WorkerGlobalScope(const WorkerParameters& params, Ref<SecurityOrigin>&& origin, WorkerThread& thread, Ref<SecurityOrigin>&& topOrigin, IDBClient::IDBConnectionProxy* connectionProxy, SocketProvider* socketProvider) 65 : m_url(params.scriptURL) 64 : WorkerOrWorkletGlobalScope(JSC::VM::create(), &thread) 65 , m_url(params.scriptURL) 66 66 , m_identifier(params.identifier) 67 67 , m_userAgent(params.userAgent) 68 , m_thread(thread)69 68 , m_inspectorController(makeUnique<WorkerInspectorController>(*this)) 70 69 , m_isOnline(params.isOnline) … … 107 106 } 108 107 109 EventLoopTaskGroup& WorkerGlobalScope::eventLoop()110 {111 ASSERT(isContextThread());112 if (UNLIKELY(!m_defaultTaskGroup)) {113 m_eventLoop = WorkerEventLoop::create(*this);114 m_defaultTaskGroup = makeUnique<EventLoopTaskGroup>(*m_eventLoop);115 if (activeDOMObjectsAreStopped())116 m_defaultTaskGroup->stopAndDiscardAllTasks();117 }118 return *m_defaultTaskGroup;119 }120 121 108 String WorkerGlobalScope::origin() const 122 109 { … … 125 112 } 126 113 127 void WorkerGlobalScope::prepareForTermination() 128 { 114 void WorkerGlobalScope::prepareForDestruction() 115 { 116 WorkerOrWorkletGlobalScope::prepareForDestruction(); 117 129 118 #if ENABLE(INDEXED_DATABASE) 130 119 stopIndexedDatabase(); 131 120 #endif 132 121 133 if (m_defaultTaskGroup)134 m_defaultTaskGroup->stopAndDiscardAllTasks();135 stopActiveDOMObjects();136 137 122 if (m_cacheStorageConnection) 138 123 m_cacheStorageConnection->clearPendingRequests(); 139 124 140 125 m_inspectorController->workerTerminating(); 141 142 // Event listeners would keep DOMWrapperWorld objects alive for too long. Also, they have references to JS objects,143 // which become dangling once Heap is destroyed.144 removeAllEventListeners();145 146 // MicrotaskQueue and RejectedPromiseTracker reference Heap.147 if (m_eventLoop)148 m_eventLoop->clearMicrotaskQueue();149 removeRejectedPromiseTracker();150 126 } 151 127 152 128 void WorkerGlobalScope::removeAllEventListeners() 153 129 { 154 EventTarget::removeAllEventListeners();130 WorkerOrWorkletGlobalScope::removeAllEventListeners(); 155 131 m_performance->removeAllEventListeners(); 156 132 m_performance->removeAllObservers(); … … 185 161 } 186 162 187 void WorkerGlobalScope::disableEval(const String& errorMessage)188 {189 script()->disableEval(errorMessage);190 }191 192 void WorkerGlobalScope::disableWebAssembly(const String& errorMessage)193 {194 script()->disableWebAssembly(errorMessage);195 }196 197 163 SocketProvider* WorkerGlobalScope::socketProvider() 198 164 { … … 223 189 #if ENABLE(INDEXED_DATABASE_IN_WORKERS) 224 190 if (m_connectionProxy) 225 m_connectionProxy->setContextSuspended(* scriptExecutionContext(), true);191 m_connectionProxy->setContextSuspended(*this, true); 226 192 #endif 227 193 } … … 231 197 #if ENABLE(INDEXED_DATABASE_IN_WORKERS) 232 198 if (m_connectionProxy) 233 m_connectionProxy->setContextSuspended(* scriptExecutionContext(), false);199 m_connectionProxy->setContextSuspended(*this, false); 234 200 #endif 235 201 } … … 246 212 void WorkerGlobalScope::close() 247 213 { 248 if ( m_closing)214 if (isClosing()) 249 215 return; 250 216 … … 252 218 // After m_closing is set, all the tasks in the queue continue to be fetched but only 253 219 // tasks with isCleanupTask()==true will be executed. 254 m _closing = true;220 markAsClosing(); 255 221 postTask({ ScriptExecutionContext::Task::CleanupTask, [] (ScriptExecutionContext& context) { 256 222 ASSERT_WITH_SECURITY_IMPLICATION(is<WorkerGlobalScope>(context)); … … 273 239 if (m_navigator) 274 240 m_navigator->setIsOnline(isOnline); 275 }276 277 void WorkerGlobalScope::postTask(Task&& task)278 {279 thread().runLoop().postTask(WTFMove(task));280 241 } 281 242 … … 407 368 } 408 369 409 bool WorkerGlobalScope::isContextThread() const410 {411 return thread().thread() == &Thread::current();412 }413 414 bool WorkerGlobalScope::isJSExecutionForbidden() const415 {416 return script()->isExecutionForbidden();417 }418 419 370 #if ENABLE(WEB_CRYPTO) 420 371 … … 444 395 auto doneContainer = CryptoBooleanContainer::create(); 445 396 auto wrappedKeyContainer = CryptoBufferContainer::create(); 446 m_thread.workerLoaderProxy().postTaskToLoader([resultContainer, key, wrappedKeyContainer, doneContainer, workerMessagingProxy = makeRef(downcast<WorkerMessagingProxy>(m_thread.workerLoaderProxy()))](ScriptExecutionContext& context) {397 thread().workerLoaderProxy().postTaskToLoader([resultContainer, key, wrappedKeyContainer, doneContainer, workerMessagingProxy = makeRef(downcast<WorkerMessagingProxy>(thread().workerLoaderProxy()))](ScriptExecutionContext& context) { 447 398 resultContainer->setBoolean(context.wrapCryptoKey(key, wrappedKeyContainer->buffer())); 448 399 doneContainer->setBoolean(true); … … 454 405 auto waitResult = MessageQueueMessageReceived; 455 406 while (!doneContainer->boolean() && waitResult != MessageQueueTerminated) 456 waitResult = m_thread.runLoop().runInMode(this, WorkerRunLoop::defaultMode());407 waitResult = thread().runLoop().runInMode(this, WorkerRunLoop::defaultMode()); 457 408 458 409 if (doneContainer->boolean()) … … 467 418 auto doneContainer = CryptoBooleanContainer::create(); 468 419 auto keyContainer = CryptoBufferContainer::create(); 469 m_thread.workerLoaderProxy().postTaskToLoader([resultContainer, wrappedKey, keyContainer, doneContainer, workerMessagingProxy = makeRef(downcast<WorkerMessagingProxy>(m_thread.workerLoaderProxy()))](ScriptExecutionContext& context) {420 thread().workerLoaderProxy().postTaskToLoader([resultContainer, wrappedKey, keyContainer, doneContainer, workerMessagingProxy = makeRef(downcast<WorkerMessagingProxy>(thread().workerLoaderProxy()))](ScriptExecutionContext& context) { 470 421 resultContainer->setBoolean(context.unwrapCryptoKey(wrappedKey, keyContainer->buffer())); 471 422 doneContainer->setBoolean(true); … … 477 428 auto waitResult = MessageQueueMessageReceived; 478 429 while (!doneContainer->boolean() && waitResult != MessageQueueTerminated) 479 waitResult = m_thread.runLoop().runInMode(this, WorkerRunLoop::defaultMode());430 waitResult = thread().runLoop().runInMode(this, WorkerRunLoop::defaultMode()); 480 431 481 432 if (doneContainer->boolean()) … … 543 494 } 544 495 496 WorkerThread& WorkerGlobalScope::thread() const 497 { 498 return *static_cast<WorkerThread*>(workerOrWorkletThread()); 499 } 500 545 501 } // namespace WebCore -
trunk/Source/WebCore/workers/WorkerGlobalScope.h
r268775 r268822 29 29 #include "Base64Utilities.h" 30 30 #include "CacheStorageConnection.h" 31 #include "EventTarget.h"32 31 #include "ImageBitmap.h" 33 32 #include "ScriptExecutionContext.h" … … 47 46 class ContentSecurityPolicyResponseHeaders; 48 47 class Crypto; 49 class EventLoopTaskGroup;50 48 class Performance; 51 49 class ScheduledAction; 52 class WorkerEventLoop;53 50 class WorkerInspectorController; 54 51 class WorkerLocation; … … 61 58 } 62 59 63 class WorkerGlobalScope : public RefCounted<WorkerGlobalScope>, public Supplementable<WorkerGlobalScope>, public EventTargetWithInlineData, public Base64Utilities, public WorkerOrWorkletGlobalScope {60 class WorkerGlobalScope : public Supplementable<WorkerGlobalScope>, public Base64Utilities, public WorkerOrWorkletGlobalScope { 64 61 WTF_MAKE_ISO_ALLOCATED(WorkerGlobalScope); 65 62 public: … … 68 65 virtual bool isDedicatedWorkerGlobalScope() const { return false; } 69 66 virtual bool isServiceWorkerGlobalScope() const { return false; } 70 71 EventLoopTaskGroup& eventLoop() final;72 67 73 68 const URL& url() const final { return m_url; } … … 89 84 WorkerInspectorController& inspectorController() const { return *m_inspectorController; } 90 85 91 WorkerThread& thread() const { return m_thread; }86 WorkerThread& thread() const; 92 87 93 88 using ScriptExecutionContext::hasPendingActivity; 94 95 void postTask(Task&&) final; // Executes the task on context's thread asynchronously.96 89 97 90 WorkerGlobalScope& self() { return *this; } … … 109 102 void clearInterval(int timeoutId); 110 103 111 bool isContextThread() const final;112 104 bool isSecureContext() const final; 113 105 … … 115 107 WorkerLocation* optionalLocation() const { return m_location.get(); } 116 108 117 using RefCounted::ref;118 using RefCounted::deref;119 120 bool isClosing() const final { return m_closing; }121 122 109 void addConsoleMessage(std::unique_ptr<Inspector::ConsoleMessage>&&) final; 123 110 … … 127 114 Performance& performance() const; 128 115 129 void prepareFor Termination();116 void prepareForDestruction() final; 130 117 131 118 void removeAllEventListeners() final; … … 148 135 149 136 private: 150 void refScriptExecutionContext() final { ref(); }151 void derefScriptExecutionContext() final { deref(); }152 153 void refEventTarget() final { ref(); }154 void derefEventTarget() final { deref(); }155 156 137 void logExceptionToConsole(const String& errorMessage, const String& sourceURL, int lineNumber, int columnNumber, RefPtr<Inspector::ScriptCallStack>&&) final; 157 138 … … 162 143 163 144 bool isWorkerGlobalScope() const final { return true; } 164 WorkerThread* workerOrWorkletThread() const final { return &m_thread; } 165 166 ScriptExecutionContext* scriptExecutionContext() const final { return const_cast<WorkerGlobalScope*>(this); } 145 167 146 URL completeURL(const String&, ForceUTF8 = ForceUTF8::No) const final; 168 147 String userAgent(const URL&) const final; 169 void disableEval(const String& errorMessage) final;170 void disableWebAssembly(const String& errorMessage) final;171 148 EventTarget* errorEventTarget() final; 172 149 String resourceRequestIdentifier() const final { return m_identifier; } … … 174 151 175 152 bool shouldBypassMainWorldContentSecurityPolicy() const final { return m_shouldBypassMainWorldContentSecurityPolicy; } 176 bool isJSExecutionForbidden() const final;177 153 178 154 #if ENABLE(WEB_CRYPTO) … … 192 168 mutable RefPtr<WorkerNavigator> m_navigator; 193 169 194 WorkerThread& m_thread;195 170 std::unique_ptr<WorkerOrWorkletScriptController> m_script; 196 171 std::unique_ptr<WorkerInspectorController> m_inspectorController; 197 172 198 bool m_closing { false };199 173 bool m_isOnline; 200 174 bool m_shouldBypassMainWorldContentSecurityPolicy; 201 202 RefPtr<WorkerEventLoop> m_eventLoop;203 std::unique_ptr<EventLoopTaskGroup> m_defaultTaskGroup;204 175 205 176 Ref<SecurityOrigin> m_topOrigin; -
trunk/Source/WebCore/workers/WorkerOrWorkletGlobalScope.cpp
r268775 r268822 27 27 #include "WorkerOrWorkletGlobalScope.h" 28 28 29 #include "WorkerEventLoop.h" 29 30 #include "WorkerOrWorkletScriptController.h" 31 #include <wtf/IsoMallocInlines.h> 30 32 31 33 namespace WebCore { 32 34 33 WorkerOrWorkletGlobalScope::WorkerOrWorkletGlobalScope() 34 : m_script(makeUnique<WorkerOrWorkletScriptController>(this)) 35 WTF_MAKE_ISO_ALLOCATED_IMPL(WorkerOrWorkletGlobalScope); 36 37 WorkerOrWorkletGlobalScope::WorkerOrWorkletGlobalScope(Ref<JSC::VM>&& vm, WorkerOrWorkletThread* thread) 38 : m_script(makeUnique<WorkerOrWorkletScriptController>(WTFMove(vm), this)) 39 , m_thread(thread) 35 40 { 36 41 } 37 42 38 WorkerOrWorkletGlobalScope::WorkerOrWorkletGlobalScope(Ref<JSC::VM>&& vm) 39 : m_script(makeUnique<WorkerOrWorkletScriptController>(WTFMove(vm), this)) 43 WorkerOrWorkletGlobalScope::~WorkerOrWorkletGlobalScope() = default; 44 45 void WorkerOrWorkletGlobalScope::prepareForDestruction() 40 46 { 47 if (m_defaultTaskGroup) 48 m_defaultTaskGroup->stopAndDiscardAllTasks(); 49 50 stopActiveDOMObjects(); 51 52 // Event listeners would keep DOMWrapperWorld objects alive for too long. Also, they have references to JS objects, 53 // which become dangling once Heap is destroyed. 54 removeAllEventListeners(); 55 56 // MicrotaskQueue and RejectedPromiseTracker reference Heap. 57 if (m_eventLoop) 58 m_eventLoop->clearMicrotaskQueue(); 59 removeRejectedPromiseTracker(); 41 60 } 42 61 … … 46 65 } 47 66 67 void WorkerOrWorkletGlobalScope::disableEval(const String& errorMessage) 68 { 69 m_script->disableEval(errorMessage); 70 } 71 72 void WorkerOrWorkletGlobalScope::disableWebAssembly(const String& errorMessage) 73 { 74 m_script->disableWebAssembly(errorMessage); 75 } 76 77 bool WorkerOrWorkletGlobalScope::isJSExecutionForbidden() const 78 { 79 return !m_script || m_script->isExecutionForbidden(); 80 } 81 82 EventLoopTaskGroup& WorkerOrWorkletGlobalScope::eventLoop() 83 { 84 ASSERT(isContextThread()); 85 if (UNLIKELY(!m_defaultTaskGroup)) { 86 m_eventLoop = WorkerEventLoop::create(*this); 87 m_defaultTaskGroup = makeUnique<EventLoopTaskGroup>(*m_eventLoop); 88 if (activeDOMObjectsAreStopped()) 89 m_defaultTaskGroup->stopAndDiscardAllTasks(); 90 } 91 return *m_defaultTaskGroup; 92 } 93 94 bool WorkerOrWorkletGlobalScope::isContextThread() const 95 { 96 auto* thread = workerOrWorkletThread(); 97 return thread ? thread->thread() == &Thread::current() : isMainThread(); 98 } 99 100 void WorkerOrWorkletGlobalScope::postTask(Task&& task) 101 { 102 ASSERT(workerOrWorkletThread()); 103 workerOrWorkletThread()->runLoop().postTask(WTFMove(task)); 104 } 105 48 106 } // namespace WebCore -
trunk/Source/WebCore/workers/WorkerOrWorkletGlobalScope.h
r268775 r268822 26 26 #pragma once 27 27 28 #include "EventTarget.h" 28 29 #include "ScriptExecutionContext.h" 29 30 30 31 namespace WebCore { 31 32 33 class EventLoopTaskGroup; 34 class WorkerEventLoop; 32 35 class WorkerOrWorkletScriptController; 33 36 class WorkerOrWorkletThread; 34 37 35 class WorkerOrWorkletGlobalScope : public ScriptExecutionContext { 38 class WorkerOrWorkletGlobalScope : public ScriptExecutionContext, public RefCounted<WorkerOrWorkletGlobalScope>, public EventTargetWithInlineData { 39 WTF_MAKE_ISO_ALLOCATED(WorkerOrWorkletGlobalScope); 40 WTF_MAKE_NONCOPYABLE(WorkerOrWorkletGlobalScope); 36 41 public: 37 virtual ~WorkerOrWorkletGlobalScope() = default;42 virtual ~WorkerOrWorkletGlobalScope(); 38 43 39 virtual bool isClosing() const = 0;40 virtual WorkerOrWorkletThread* workerOrWorkletThread() const = 0;44 bool isClosing() const { return m_isClosing; } 45 WorkerOrWorkletThread* workerOrWorkletThread() const { return m_thread; } 41 46 42 47 WorkerOrWorkletScriptController* script() const { return m_script.get(); } … … 45 50 unsigned long createUniqueIdentifier() { return m_uniqueIdentifier++; } 46 51 52 // ScriptExecutionContext. 53 EventLoopTaskGroup& eventLoop() final; 54 bool isContextThread() const final; 55 void postTask(Task&&) final; // Executes the task on context's thread asynchronously. 56 57 virtual void prepareForDestruction(); 58 59 using RefCounted::ref; 60 using RefCounted::deref; 61 47 62 protected: 48 WorkerOrWorkletGlobalScope(); 49 explicit WorkerOrWorkletGlobalScope(Ref<JSC::VM>&&); 63 WorkerOrWorkletGlobalScope(Ref<JSC::VM>&&, WorkerOrWorkletThread*); 64 65 // ScriptExecutionContext. 66 bool isJSExecutionForbidden() const final; 67 68 void markAsClosing() { m_isClosing = true; } 50 69 51 70 private: 71 // ScriptExecutionContext. 72 void disableEval(const String& errorMessage) final; 73 void disableWebAssembly(const String& errorMessage) final; 74 void refScriptExecutionContext() final { ref(); } 75 void derefScriptExecutionContext() final { deref(); } 76 77 // EventTarget. 78 ScriptExecutionContext* scriptExecutionContext() const final { return const_cast<WorkerOrWorkletGlobalScope*>(this); } 79 void refEventTarget() final { ref(); } 80 void derefEventTarget() final { deref(); } 81 52 82 std::unique_ptr<WorkerOrWorkletScriptController> m_script; 83 WorkerOrWorkletThread* m_thread; 84 RefPtr<WorkerEventLoop> m_eventLoop; 85 std::unique_ptr<EventLoopTaskGroup> m_defaultTaskGroup; 53 86 unsigned long m_uniqueIdentifier { 1 }; 87 bool m_isClosing { false }; 54 88 }; 55 89 -
trunk/Source/WebCore/workers/WorkerThread.cpp
r268775 r268822 321 321 WorkerGlobalScope& workerGlobalScope = downcast<WorkerGlobalScope>(context); 322 322 323 workerGlobalScope.prepareFor Termination();323 workerGlobalScope.prepareForDestruction(); 324 324 325 325 // Stick a shutdown command at the end of the queue, so that we deal -
trunk/Source/WebCore/worklets/WorkletGlobalScope.cpp
r268775 r268822 34 34 #include "SecurityOriginPolicy.h" 35 35 #include "Settings.h" 36 #include "WorkerEventLoop.h"37 36 #include "WorkerMessagePortChannelProvider.h" 38 37 #include "WorkerOrWorkletThread.h" … … 50 49 51 50 WorkletGlobalScope::WorkletGlobalScope(WorkerOrWorkletThread& thread, const WorkletParameters& parameters) 52 : m_thread(&thread)51 : WorkerOrWorkletGlobalScope(JSC::VM::create(), &thread) 53 52 , m_topOrigin(SecurityOrigin::createUnique()) 54 53 , m_url(parameters.windowURL) … … 63 62 64 63 WorkletGlobalScope::WorkletGlobalScope(Document& document, Ref<JSC::VM>&& vm, ScriptSourceCode&& code) 65 : WorkerOrWorkletGlobalScope(WTFMove(vm) )64 : WorkerOrWorkletGlobalScope(WTFMove(vm), nullptr) 66 65 , m_document(makeWeakPtr(document)) 67 66 , m_topOrigin(SecurityOrigin::createUnique()) … … 89 88 void WorkletGlobalScope::prepareForDestruction() 90 89 { 91 if (!script()) 92 return; 93 if (m_defaultTaskGroup) 94 m_defaultTaskGroup->stopAndDiscardAllTasks(); 95 stopActiveDOMObjects(); 96 removeAllEventListeners(); 97 if (m_eventLoop) 98 m_eventLoop->clearMicrotaskQueue(); 99 removeRejectedPromiseTracker(); 100 script()->vm().notifyNeedTermination(); 101 clearScript(); 90 WorkerOrWorkletGlobalScope::prepareForDestruction(); 91 92 if (script()) { 93 script()->vm().notifyNeedTermination(); 94 clearScript(); 95 } 102 96 } 103 97 … … 106 100 static NeverDestroyed<WorkletGlobalScopesSet> scopes; 107 101 return scopes; 108 }109 110 EventLoopTaskGroup& WorkletGlobalScope::eventLoop()111 {112 if (UNLIKELY(!m_defaultTaskGroup)) {113 m_eventLoop = WorkerEventLoop::create(*this);114 m_defaultTaskGroup = makeUnique<EventLoopTaskGroup>(*m_eventLoop);115 if (activeDOMObjectsAreStopped())116 m_defaultTaskGroup->stopAndDiscardAllTasks();117 }118 return *m_defaultTaskGroup;119 102 } 120 103 … … 130 113 if (m_code) 131 114 script()->evaluate(*m_code); 132 }133 134 bool WorkletGlobalScope::isJSExecutionForbidden() const135 {136 return !script() || script()->isExecutionForbidden();137 }138 139 void WorkletGlobalScope::disableEval(const String& errorMessage)140 {141 script()->disableEval(errorMessage);142 }143 144 void WorkletGlobalScope::disableWebAssembly(const String& errorMessage)145 {146 script()->disableWebAssembly(errorMessage);147 115 } 148 116 … … 258 226 } 259 227 260 bool WorkletGlobalScope::isContextThread() const261 {262 if (m_thread)263 return m_thread->thread() == &Thread::current();264 return isMainThread();265 }266 267 228 } // namespace WebCore -
trunk/Source/WebCore/worklets/WorkletGlobalScope.h
r268775 r268822 28 28 29 29 #include "Document.h" 30 #include "EventTarget.h"31 30 #include "ExceptionOr.h" 32 31 #include "FetchRequestCredentials.h" 33 32 #include "ScriptExecutionContext.h" 34 33 #include "ScriptSourceCode.h" 35 #include "WorkerEventLoop.h"36 34 #include "WorkerOrWorkletGlobalScope.h" 37 35 #include "WorkerOrWorkletScriptController.h" … … 48 46 namespace WebCore { 49 47 50 class EventLoopTaskGroup;51 48 class MessagePortChannelProvider; 52 class WorkerEventLoop;53 49 class WorkerMessagePortChannelProvider; 54 50 class WorkerScriptLoader; … … 59 55 using WorkletGlobalScopeIdentifier = ObjectIdentifier<WorkletGlobalScopeIdentifierType>; 60 56 61 class WorkletGlobalScope : public RefCounted<WorkletGlobalScope>, public EventTargetWithInlineData, publicWorkerOrWorkletGlobalScope, public WorkerScriptLoaderClient {57 class WorkletGlobalScope : public WorkerOrWorkletGlobalScope, public WorkerScriptLoaderClient { 62 58 WTF_MAKE_ISO_ALLOCATED(WorkletGlobalScope); 63 59 public: … … 76 72 MessagePortChannelProvider& messagePortChannelProvider(); 77 73 78 EventLoopTaskGroup& eventLoop() final;79 80 74 const URL& url() const final { return m_url; } 81 75 … … 84 78 ReferrerPolicy referrerPolicy() const final; 85 79 86 using RefCounted::ref;87 using RefCounted::deref;88 89 WorkerOrWorkletThread* workerOrWorkletThread() const final { return m_thread.get(); }90 91 80 void addConsoleMessage(std::unique_ptr<Inspector::ConsoleMessage>&&) final; 92 81 93 bool isJSExecutionForbidden() const final;94 82 SecurityOrigin& topOrigin() const final { return m_topOrigin.get(); } 95 83 96 84 SocketProvider* socketProvider() final { return nullptr; } 97 85 98 // WorkerOrWorkletGlobalScope.99 bool isClosing() const final { return m_isClosing; }100 101 bool isContextThread() const final;102 86 bool isSecureContext() const final { return false; } 103 87 104 88 JSC::RuntimeFlags jsRuntimeFlags() const { return m_jsRuntimeFlags; } 105 89 106 v irtual void prepareForDestruction();90 void prepareForDestruction() override; 107 91 108 92 void fetchAndInvokeScript(const URL&, FetchRequestCredentials, CompletionHandler<void(Optional<Exception>&&)>&&); … … 114 98 WorkletGlobalScope(WorkerOrWorkletThread&, const WorkletParameters&); 115 99 WorkletGlobalScope(Document&, Ref<JSC::VM>&&, ScriptSourceCode&&); 116 WorkletGlobalScope(const WorkletGlobalScope&) = delete;117 WorkletGlobalScope(WorkletGlobalScope&&) = delete;118 119 WorkerEventLoop* existingEventLoop() const { return m_eventLoop.get(); }120 EventLoopTaskGroup* defaultTaskGroup() const { return m_defaultTaskGroup.get(); }121 100 122 101 private: … … 125 104 #endif 126 105 127 void postTask(Task&&) override { ASSERT_NOT_REACHED(); } 128 129 void refScriptExecutionContext() final { ref(); } 130 void derefScriptExecutionContext() final { deref(); } 131 132 void refEventTarget() final { ref(); } 133 void derefEventTarget() final { deref(); } 134 135 ScriptExecutionContext* scriptExecutionContext() const final { return const_cast<WorkletGlobalScope*>(this); } 106 // EventTarget. 136 107 EventTargetInterface eventTargetInterface() const final { return WorkletGlobalScopeEventTargetInterfaceType; } 137 108 … … 154 125 URL completeURL(const String&, ForceUTF8 = ForceUTF8::No) const final; 155 126 String userAgent(const URL&) const final; 156 void disableEval(const String&) final;157 void disableWebAssembly(const String&) final;158 127 159 128 struct ScriptFetchJob { … … 167 136 168 137 WeakPtr<Document> m_document; 169 RefPtr<WorkerOrWorkletThread> m_thread;170 138 171 139 Ref<SecurityOrigin> m_topOrigin; 172 173 RefPtr<WorkerEventLoop> m_eventLoop;174 std::unique_ptr<EventLoopTaskGroup> m_defaultTaskGroup;175 140 176 141 URL m_url; … … 183 148 Deque<ScriptFetchJob> m_scriptFetchJobs; 184 149 HashSet<URL> m_evaluatedModules; 185 186 bool m_isClosing { false };187 150 }; 188 151
Note:
See TracChangeset
for help on using the changeset viewer.