Index: third_party/WebKit/Source/core/dom/TaskRunnerHelper.cpp |
diff --git a/third_party/WebKit/Source/core/dom/TaskRunnerHelper.cpp b/third_party/WebKit/Source/core/dom/TaskRunnerHelper.cpp |
index 3cd58decb843f85ad59e404f818108a9de83ccb1..1fae76c7b9ee820729837691ae23a1fa4448cd1d 100644 |
--- a/third_party/WebKit/Source/core/dom/TaskRunnerHelper.cpp |
+++ b/third_party/WebKit/Source/core/dom/TaskRunnerHelper.cpp |
@@ -7,6 +7,8 @@ |
#include "core/dom/Document.h" |
#include "core/dom/ExecutionContext.h" |
#include "core/frame/LocalFrame.h" |
+#include "core/workers/WorkerOrWorkletGlobalScope.h" |
+#include "core/workers/WorkerThread.h" |
#include "platform/WebFrameScheduler.h" |
#include "platform/WebTaskRunner.h" |
#include "public/platform/Platform.h" |
@@ -53,6 +55,8 @@ RefPtr<WebTaskRunner> TaskRunnerHelper::Get(TaskType type, LocalFrame* frame) { |
case TaskType::kUnthrottled: |
return frame ? frame->FrameScheduler()->UnthrottledTaskRunner() |
: Platform::Current()->CurrentThread()->GetWebTaskRunner(); |
+ case TaskType::kNumberOfTaskTypes: |
+ break; |
} |
NOTREACHED(); |
return nullptr; |
@@ -64,10 +68,15 @@ RefPtr<WebTaskRunner> TaskRunnerHelper::Get(TaskType type, Document* document) { |
RefPtr<WebTaskRunner> TaskRunnerHelper::Get( |
TaskType type, |
- ExecutionContext* execution_context) { |
- return Get(type, execution_context && execution_context->IsDocument() |
- ? static_cast<Document*>(execution_context) |
- : nullptr); |
+ ExecutionContext* executionContext) { |
+ if (!executionContext) |
+ return Get(type, ToDocument(executionContext)); |
+ if (executionContext->IsDocument()) |
+ return Get(type, ToDocument(executionContext)); |
+ if (executionContext->IsWorkerOrWorkletGlobalScope()) |
+ return Get(type, ToWorkerOrWorkletGlobalScope(executionContext)); |
+ executionContext = nullptr; |
+ return Get(type, ToDocument(executionContext)); |
} |
RefPtr<WebTaskRunner> TaskRunnerHelper::Get(TaskType type, |
@@ -76,4 +85,48 @@ RefPtr<WebTaskRunner> TaskRunnerHelper::Get(TaskType type, |
script_state ? ExecutionContext::From(script_state) : nullptr); |
} |
+RefPtr<WebTaskRunner> TaskRunnerHelper::Get( |
+ TaskType type, |
+ WorkerOrWorkletGlobalScope* global_scope) { |
+ DCHECK(global_scope); |
+ // TODO(nhiroki): Add |DCHECK(global_scope->IsContextThread())| here after |
+ // https://crbug.com/694925 is fixed. |
+ |
+ switch (type) { |
+ case TaskType::kDOMManipulation: |
+ case TaskType::kUserInteraction: |
+ case TaskType::kNetworking: |
+ case TaskType::kHistoryTraversal: |
+ case TaskType::kEmbed: |
+ case TaskType::kMediaElementEvent: |
+ case TaskType::kCanvasBlobSerialization: |
+ case TaskType::kMicrotask: |
+ case TaskType::kTimer: |
+ case TaskType::kRemoteEvent: |
+ case TaskType::kWebSocket: |
+ case TaskType::kPostedMessage: |
+ case TaskType::kUnshippedPortMessage: |
+ case TaskType::kFileReading: |
+ case TaskType::kDatabaseAccess: |
+ case TaskType::kPresentation: |
+ case TaskType::kSensor: |
+ case TaskType::kPerformanceTimeline: |
+ case TaskType::kWebGL: |
+ case TaskType::kMiscPlatformAPI: |
+ case TaskType::kUnspecedTimer: |
+ case TaskType::kUnspecedLoading: |
+ case TaskType::kUnthrottled: |
+ // UnthrottledTaskRunner is generally discouraged in future. |
+ // TODO(nhiroki): Identify which tasks should be throttled and move them |
+ // into other task runners. See also comments in Get(LocalFrame). |
+ return global_scope->GetThread() |
+ ->GetGlobalScopeScheduler() |
+ ->UnthrottledTaskRunner(); |
+ case TaskType::kNumberOfTaskTypes: |
+ break; |
+ } |
+ NOTREACHED(); |
+ return nullptr; |
+} |
+ |
} // namespace blink |