Index: third_party/WebKit/Source/core/loader/ThreadableLoadingContext.cpp |
diff --git a/third_party/WebKit/Source/core/loader/ThreadableLoadingContext.cpp b/third_party/WebKit/Source/core/loader/ThreadableLoadingContext.cpp |
index 0df2ad47213df7af3b4e772b0f8176aebe3ac48d..6e7584d5b020bcaa3f6b098e625d84391dfa351b 100644 |
--- a/third_party/WebKit/Source/core/loader/ThreadableLoadingContext.cpp |
+++ b/third_party/WebKit/Source/core/loader/ThreadableLoadingContext.cpp |
@@ -6,6 +6,8 @@ |
#include "core/dom/Document.h" |
#include "core/dom/TaskRunnerHelper.h" |
+#include "core/loader/WorkerFetchContext.h" |
+#include "core/workers/WorkerGlobalScope.h" |
#include "platform/loader/fetch/ResourceFetcher.h" |
namespace blink { |
@@ -66,9 +68,85 @@ class DocumentThreadableLoadingContext final : public ThreadableLoadingContext { |
Member<Document> document_; |
}; |
+class WorkerThreadableLoadingContext : public ThreadableLoadingContext { |
+ public: |
+ explicit WorkerThreadableLoadingContext( |
+ WorkerGlobalScope& worker_global_scope) |
+ : worker_global_scope_(&worker_global_scope), |
+ fetch_context_(worker_global_scope.FetchContext()) {} |
+ |
+ ~WorkerThreadableLoadingContext() override = default; |
+ |
+ bool IsContextThread() const override { |
+ DCHECK(fetch_context_); |
+ DCHECK(worker_global_scope_); |
+ return worker_global_scope_->IsContextThread(); |
+ } |
+ |
+ ResourceFetcher* GetResourceFetcher() override { |
+ DCHECK(IsContextThread()); |
+ return fetch_context_->GetResourceFetcher(); |
+ } |
+ |
+ SecurityOrigin* GetSecurityOrigin() override { |
+ DCHECK(IsContextThread()); |
+ return worker_global_scope_->GetSecurityOrigin(); |
+ } |
+ |
+ bool IsSecureContext() const override { |
+ DCHECK(IsContextThread()); |
+ String errorMessage; |
+ return worker_global_scope_->IsSecureContext(errorMessage); |
+ } |
+ |
+ KURL FirstPartyForCookies() const override { |
+ DCHECK(IsContextThread()); |
+ // TODO |
+ return worker_global_scope_->Url(); |
+ } |
+ |
+ String UserAgent() const override { |
+ DCHECK(IsContextThread()); |
+ return worker_global_scope_->UserAgent(); |
+ } |
+ |
+ Document* GetLoadingDocument() override { return nullptr; } |
+ |
+ RefPtr<WebTaskRunner> GetTaskRunner(TaskType type) override { |
+ switch (type) { |
+ case TaskType::kTimer: |
+ return fetch_context_->TimerTaskRunner(); |
+ case TaskType::kUnspecedLoading: |
+ case TaskType::kNetworking: |
+ return fetch_context_->LoadingTaskRunner(); |
+ default: |
+ return TaskRunnerHelper::Get(type, GetLoadingDocument()); |
+ } |
+ } |
+ |
+ void RecordUseCount(UseCounter::Feature feature) override { |
+ UseCounter::Count(worker_global_scope_, feature); |
+ } |
+ |
+ DEFINE_INLINE_VIRTUAL_TRACE() { |
+ visitor->Trace(fetch_context_); |
+ visitor->Trace(worker_global_scope_); |
+ ThreadableLoadingContext::Trace(visitor); |
+ } |
+ |
+ private: |
+ Member<WorkerGlobalScope> worker_global_scope_; |
+ Member<WorkerFetchContext> fetch_context_; |
+}; |
+ |
ThreadableLoadingContext* ThreadableLoadingContext::Create(Document& document) { |
// For now this is the only default implementation. |
return new DocumentThreadableLoadingContext(document); |
} |
+ThreadableLoadingContext* ThreadableLoadingContext::Create( |
+ WorkerGlobalScope& worker_global_scope) { |
+ return new WorkerThreadableLoadingContext(worker_global_scope); |
+} |
+ |
} // namespace blink |