| Index: third_party/WebKit/Source/core/loader/WorkerFetchContext.cpp
|
| diff --git a/third_party/WebKit/Source/core/loader/WorkerFetchContext.cpp b/third_party/WebKit/Source/core/loader/WorkerFetchContext.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7ff3efa36cb40e095012e7eb87ba3f5df9fd9644
|
| --- /dev/null
|
| +++ b/third_party/WebKit/Source/core/loader/WorkerFetchContext.cpp
|
| @@ -0,0 +1,103 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "core/loader/WorkerFetchContext.h"
|
| +
|
| +#include "core/workers/WorkerClients.h"
|
| +#include "core/workers/WorkerGlobalScope.h"
|
| +#include "platform/Supplementable.h"
|
| +#include "platform/WebTaskRunner.h"
|
| +#include "platform/exported/WrappedResourceRequest.h"
|
| +#include "public/platform/Platform.h"
|
| +#include "public/platform/WebScheduler.h"
|
| +#include "public/platform/WebThread.h"
|
| +#include "public/platform/WebWorkerFetchContext.h"
|
| +
|
| +namespace blink {
|
| +
|
| +namespace {
|
| +
|
| +// WorkerFetchContextHolder is used to pass the WebWorkerFetchContext from the
|
| +// main thread to the worker thread by attaching to the WorkerClients as a
|
| +// Supplement.
|
| +class WorkerFetchContextHolder final
|
| + : public GarbageCollectedFinalized<WorkerFetchContextHolder>,
|
| + public Supplement<WorkerClients> {
|
| + USING_GARBAGE_COLLECTED_MIXIN(WorkerFetchContextHolder);
|
| +
|
| + public:
|
| + static WorkerFetchContextHolder* From(WorkerClients& clients) {
|
| + return static_cast<WorkerFetchContextHolder*>(
|
| + Supplement<WorkerClients>::From(clients, SupplementName()));
|
| + }
|
| + static const char* SupplementName() { return "WorkerFetchContextHolder"; }
|
| +
|
| + explicit WorkerFetchContextHolder(
|
| + std::unique_ptr<WebWorkerFetchContext> web_context)
|
| + : web_context_(std::move(web_context)) {}
|
| + virtual ~WorkerFetchContextHolder() {}
|
| +
|
| + std::unique_ptr<WebWorkerFetchContext> TakeContext() {
|
| + return std::move(web_context_);
|
| + }
|
| +
|
| + DEFINE_INLINE_VIRTUAL_TRACE() { Supplement<WorkerClients>::Trace(visitor); }
|
| +
|
| + private:
|
| + std::unique_ptr<WebWorkerFetchContext> web_context_;
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +WorkerFetchContext::~WorkerFetchContext() {}
|
| +
|
| +WorkerFetchContext* WorkerFetchContext::Create(
|
| + WorkerGlobalScope& worker_global_scope) {
|
| + DCHECK(worker_global_scope.IsContextThread());
|
| + WorkerClients* worker_clients = worker_global_scope.Clients();
|
| + DCHECK(worker_clients);
|
| + WorkerFetchContextHolder* holder =
|
| + static_cast<WorkerFetchContextHolder*>(Supplement<WorkerClients>::From(
|
| + *worker_clients, WorkerFetchContextHolder::SupplementName()));
|
| + if (!holder)
|
| + return nullptr;
|
| + std::unique_ptr<WebWorkerFetchContext> web_context = holder->TakeContext();
|
| + DCHECK(web_context);
|
| + return new WorkerFetchContext(std::move(web_context));
|
| +}
|
| +
|
| +WorkerFetchContext::WorkerFetchContext(
|
| + std::unique_ptr<WebWorkerFetchContext> web_context)
|
| + : web_context_(std::move(web_context)) {
|
| + web_context_->InitializeOnWorkerThread(Platform::Current()
|
| + ->CurrentThread()
|
| + ->Scheduler()
|
| + ->LoadingTaskRunner()
|
| + ->ToSingleThreadTaskRunner());
|
| +}
|
| +
|
| +std::unique_ptr<WebURLLoader> WorkerFetchContext::CreateURLLoader() {
|
| + return web_context_->CreateURLLoader();
|
| +}
|
| +
|
| +bool WorkerFetchContext::IsControlledByServiceWorker() const {
|
| + return web_context_->IsControlledByServiceWorker();
|
| +}
|
| +
|
| +void WorkerFetchContext::PrepareRequest(ResourceRequest& request,
|
| + RedirectType) {
|
| + WrappedResourceRequest webreq(request);
|
| + web_context_->WillSendRequest(webreq);
|
| +}
|
| +
|
| +void ProvideWorkerFetchContextToWorker(
|
| + WorkerClients* clients,
|
| + std::unique_ptr<WebWorkerFetchContext> web_context) {
|
| + DCHECK(clients);
|
| + WorkerFetchContextHolder::ProvideTo(
|
| + *clients, WorkerFetchContextHolder::SupplementName(),
|
| + new WorkerFetchContextHolder(std::move(web_context)));
|
| +}
|
| +
|
| +} // namespace blink
|
|
|