Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(356)

Unified Diff: third_party/WebKit/Source/core/workers/WorkerShadowFetchContext.cpp

Issue 2842123002: WorkerShadowFetchContext
Patch Set: . Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/workers/WorkerShadowFetchContext.cpp
diff --git a/third_party/WebKit/Source/core/workers/WorkerShadowFetchContext.cpp b/third_party/WebKit/Source/core/workers/WorkerShadowFetchContext.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3b2ea91deaed454b732b227d90f3f9e59ae1523f
--- /dev/null
+++ b/third_party/WebKit/Source/core/workers/WorkerShadowFetchContext.cpp
@@ -0,0 +1,379 @@
+// 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/workers/WorkerShadowFetchContext.h"
+
+#include "core/dom/ExecutionContext.h"
+#include "core/dom/SecurityContext.h"
+#include "core/events/EventQueue.h"
+#include "core/frame/ContentSettingsClient.h"
+#include "core/frame/Settings.h"
+#include "core/inspector/ConsoleMessage.h"
+#include "core/loader/ThreadableLoadingContext.h"
+#include "core/loader/appcache/ApplicationCacheHost.h"
+#include "core/workers/ParentFrameTaskRunners.h"
+#include "platform/exported/WrappedResourceRequest.h"
+#include "platform/heap/Handle.h"
+#include "platform/loader/fetch/ResourceFetcher.h"
+#include "platform/weborigin/KURL.h"
+#include "platform/wtf/WTF.h"
+#include "public/platform/WebCachePolicy.h"
+#include "public/platform/modules/serviceworker/WebServiceWorkerNetworkProvider.h"
+
+namespace blink {
+
+class WorkerShadowFetchContext::ExecutionContextImpl
+ : public GarbageCollectedFinalized<
+ WorkerShadowFetchContext::ExecutionContextImpl>,
+ public SecurityContext,
+ public ExecutionContext {
+ USING_GARBAGE_COLLECTED_MIXIN(ExecutionContextImpl);
+
+ public:
+ ExecutionContextImpl(const KURL& url,
+ const String& user_agent,
+ WebAddressSpace address_space)
+ : url_(url), user_agent_(user_agent) {
+ // Setting up the security context.
+ ContentSecurityPolicy* policy = ContentSecurityPolicy::Create();
+ SecurityContext::SetContentSecurityPolicy(policy);
+ SecurityContext::SetSecurityOrigin(SecurityOrigin::Create(url));
+ SecurityContext::SetAddressSpace(address_space);
+ policy->BindToExecutionContext(this);
+ }
+ ~ExecutionContextImpl() {}
+
+ // ExecutionContext overrides:
+ void DisableEval(const String&) final {
+ // TODO(kinuko): Propagate this to the worker global scope.
+ }
+ String UserAgent() const final { return user_agent_; }
+ void PostTask(TaskType,
+ const WebTraceLocation&,
+ std::unique_ptr<ExecutionContextTask>,
+ const String& task_name_for_instrumentation) final {
+ NOTREACHED();
+ }
+ EventTarget* ErrorEventTarget() final { return nullptr; }
+ EventQueue* GetEventQueue() const final { return nullptr; }
+ bool TasksNeedSuspension() final { return tasks_need_suspension_; }
+ void SetTasksNeedSuspension(bool flag) { tasks_need_suspension_ = flag; }
+ SecurityContext& GetSecurityContext() final { return *this; }
+ DOMTimerCoordinator* Timers() final { return nullptr; }
+ void AddConsoleMessage(ConsoleMessage* message) final {
+ // TODO(kinuko): Implement this.
+ }
+ void ExceptionThrown(ErrorEvent* event) final { NOTREACHED(); }
+ bool IsSecureContext(String& error_message) const final {
+ // Until there are APIs that are available in workers and that
+ // require a privileged context test that checks ancestors, just do
+ // a simple check here.
+ if (GetSecurityOrigin()->IsPotentiallyTrustworthy())
+ return true;
+ error_message = GetSecurityOrigin()->IsPotentiallyTrustworthyErrorMessage();
+ return false;
+ }
+ CoreProbeSink* GetProbeSink() final {
+ // TODO(kinuko): Implement this! How we plumb DevTools for frame-less world
+ // largely relies on this part.
+ return nullptr;
+ }
+
+ // SecurityContext overrides:
+ void DidUpdateSecurityOrigin() final { NOTREACHED(); }
+
+ using SecurityContext::GetSecurityOrigin;
+
+ DEFINE_INLINE_TRACE() {
+ SecurityContext::Trace(visitor);
+ ExecutionContext::Trace(visitor);
+ }
+
+ protected:
+ const KURL& VirtualURL() const final { return url_; }
+ KURL VirtualCompleteURL(const String& url) const final {
+ if (url.IsNull())
+ return KURL();
+ return KURL(url_, url);
+ }
+
+ private:
+ const KURL url_;
+ const String user_agent_;
+ bool tasks_need_suspension_ = false;
+};
+
+class WorkerShadowFetchContext::LoadingContextImpl
+ : public GarbageCollected<WorkerShadowFetchContext::LoadingContextImpl>,
+ public ThreadableLoadingContext {
+ USING_GARBAGE_COLLECTED_MIXIN(LoadingContextImpl);
+
+ public:
+ LoadingContextImpl(ExecutionContextImpl* execution_context,
+ ParentFrameTaskRunners* task_runners,
+ ResourceFetcher* resource_fetcher)
+ : execution_context_(execution_context),
+ task_runners_(task_runners),
+ resource_fetcher_(resource_fetcher) {}
+ bool IsContextThread() const final { return IsMainThread(); }
+ ResourceFetcher* GetResourceFetcher() final {
+ DCHECK(IsContextThread());
+ return resource_fetcher_;
+ }
+ SecurityOrigin* GetSecurityOrigin() final {
+ DCHECK(IsContextThread());
+ return execution_context_->GetSecurityOrigin();
+ }
+ bool IsSecureContext() const final {
+ DCHECK(IsContextThread());
+ String unused_error_message;
+ return execution_context_->IsSecureContext(unused_error_message);
+ }
+ KURL FirstPartyForCookies() const final {
+ // TODO(kinuko): Check if this is ok.
+ DCHECK(IsContextThread());
+ return execution_context_->Url();
+ }
+ String UserAgent() const final {
+ DCHECK(IsContextThread());
+ return execution_context_->UserAgent();
+ }
+ RefPtr<WebTaskRunner> GetTaskRunner(TaskType type) final {
+ DCHECK(IsContextThread());
+ return task_runners_->Get(type);
+ }
+ void RecordUseCount(UseCounter::Feature feature) final {
+ DCHECK(IsContextThread());
+ // TODO(kinuko): Implement this.
+ }
+
+ DEFINE_INLINE_TRACE() {
+ visitor->Trace(execution_context_);
+ visitor->Trace(task_runners_);
+ visitor->Trace(resource_fetcher_);
+ ThreadableLoadingContext::Trace(visitor);
+ }
+
+ private:
+ Member<ExecutionContextImpl> execution_context_;
+ Member<ParentFrameTaskRunners> task_runners_;
+ Member<ResourceFetcher> resource_fetcher_;
+};
+
+// static
+WorkerShadowFetchContext* WorkerShadowFetchContext::Create(
+ const KURL& url,
+ const String& user_agent,
+ WebAddressSpace address_space,
+ ApplicationCacheHost* app_cache_host,
+ std::unique_ptr<WebServiceWorkerNetworkProvider> service_worker_provider,
+ std::unique_ptr<Settings> settings,
+ ParentFrameTaskRunners* task_runners) {
+ ExecutionContextImpl* execution_context =
+ new ExecutionContextImpl(url, user_agent, address_space);
+ return new WorkerShadowFetchContext(execution_context, app_cache_host,
+ std::move(service_worker_provider),
+ std::move(settings), task_runners);
+}
+
+WorkerShadowFetchContext::~WorkerShadowFetchContext() = default;
+
+void WorkerShadowFetchContext::Detach() {
+ // TODO(kinuko): Rename this.
+ app_cache_host_->DetachFromDocumentLoader();
+}
+
+void WorkerShadowFetchContext::AddAdditionalRequestHeaders(
+ ResourceRequest& request,
+ FetchResourceType type) {
+ BaseFetchContext::AddAdditionalRequestHeaders(request, type);
+
+ // The remaining modifications are only necessary for HTTP and HTTPS.
+ if (!request.Url().IsEmpty() && !request.Url().ProtocolIsInHTTPFamily())
+ return;
+
+ if (GetSettings() && GetSettings()->GetDataSaverEnabled())
+ request.SetHTTPHeaderField("Save-Data", "on");
+}
+
+WebCachePolicy WorkerShadowFetchContext::ResourceRequestCachePolicy(
+ const ResourceRequest& request,
+ Resource::Type type,
+ FetchParameters::DeferOption defer) const {
+ if (request.HttpMethod() == "POST")
+ return WebCachePolicy::kValidatingCacheData;
+ return WebCachePolicy::kUseProtocolCachePolicy;
+}
+
+void WorkerShadowFetchContext::PrepareRequest(ResourceRequest& request,
+ RedirectType redirect_type) {
+ WrappedResourceRequest webreq(request);
+ service_worker_provider_->WillSendRequest(webreq);
+
+ if (redirect_type == RedirectType::kNotForRedirect)
+ app_cache_host_->WillStartLoading(request);
+}
+
+void WorkerShadowFetchContext::DispatchWillSendRequest(
+ unsigned long identifier,
+ ResourceRequest& request,
+ const ResourceResponse& redirect_response,
+ const FetchInitiatorInfo& initiator_info) {
+ /*
+ probe::willSendRequest(GetFrame(), identifier, MasterDocumentLoader(),
+ request, redirect_response, initiator_info);
+ */
+}
+
+void WorkerShadowFetchContext::DispatchDidReceiveResponse(
+ unsigned long identifier,
+ const ResourceResponse& response,
+ WebURLRequest::FrameType frame_type,
+ WebURLRequest::RequestContext request_context,
+ Resource* resource,
+ ResourceResponseType response_type) {
+ /*
+ probe::didReceiveResourceResponse(GetFrame(), identifier, document_loader,
+ response, resource);
+ */
+}
+
+void WorkerShadowFetchContext::DispatchDidReceiveData(unsigned long identifier,
+ const char* data,
+ int data_length) {
+ // probe::didReceiveData(GetFrame(), identifier, data, data_length);
+}
+
+void WorkerShadowFetchContext::DispatchDidReceiveEncodedData(
+ unsigned long identifier,
+ int encoded_data_length) {
+ /*
+ probe::didReceiveEncodedDataLength(GetFrame(), identifier,
+ encoded_data_length);
+ */
+}
+
+void WorkerShadowFetchContext::DispatchDidFinishLoading(
+ unsigned long identifier,
+ double finish_time,
+ int64_t encoded_data_length,
+ int64_t decoded_body_length) {
+ /*
+ probe::didFinishLoading(GetFrame(), identifier, finish_time,
+ encoded_data_length, decoded_body_length);
+ */
+}
+
+void WorkerShadowFetchContext::DispatchDidFail(unsigned long identifier,
+ const ResourceError& error,
+ int64_t encoded_data_length,
+ bool is_internal_request) {
+ /*
+ probe::didFailLoading(GetFrame(), identifier, error);
+ */
+}
+
+void WorkerShadowFetchContext::AddResourceTiming(
+ const ResourceTimingInfo& info) {
+ /*
+ DOMWindowPerformance::performance(*initiator_document->domWindow())
+ ->AddResourceTiming(info);
+ */
+}
+
+bool WorkerShadowFetchContext::AllowImage(bool images_enabled,
+ const KURL& url) const {
+ return !GetContentSettingsClient() ||
+ GetContentSettingsClient()->AllowImage(images_enabled, url);
+}
+
+bool WorkerShadowFetchContext::IsControlledByServiceWorker() const {
+ return service_worker_provider_->IsControlledByServiceWorker();
+}
+
+int64_t WorkerShadowFetchContext::ServiceWorkerID() const {
+ return service_worker_provider_->ServiceWorkerID();
+}
+
+void WorkerShadowFetchContext::PopulateResourceRequest(
+ const KURL& url,
+ Resource::Type type,
+ const ClientHintsPreferences& hints_preferences,
+ const FetchParameters::ResourceWidth& resource_width,
+ const ResourceLoaderOptions& options,
+ SecurityViolationReportingPolicy reporting_policy,
+ ResourceRequest& request) {
+ SetFirstPartyCookieAndRequestorOrigin(request);
+ CheckCSPForRequest(request, url, options, reporting_policy,
+ request.GetRedirectStatus(),
+ ContentSecurityPolicy::CheckHeaderType::kCheckReportOnly);
+ AddCSPHeaderIfNecessary(type, request);
+}
+
+void WorkerShadowFetchContext::SetFirstPartyCookieAndRequestorOrigin(
+ ResourceRequest& request) {
+ if (request.FirstPartyForCookies().IsNull())
+ request.SetFirstPartyForCookies(loading_context_->FirstPartyForCookies());
+}
+
+RefPtr<WebTaskRunner> WorkerShadowFetchContext::LoadingTaskRunner() const {
+ return loading_context_->GetTaskRunner(TaskType::kNetworking);
+}
+
+ExecutionContext& WorkerShadowFetchContext::GetExecutionContext() {
+ return *execution_context_;
+}
+
+SecurityContext& WorkerShadowFetchContext::GetSecurityContext() {
+ return execution_context_->GetSecurityContext();
+}
+
+ThreadableLoadingContext&
+WorkerShadowFetchContext::GetThreadableLoadingContext() {
+ return *loading_context_;
+}
+
+Settings* WorkerShadowFetchContext::GetSettings() const {
+ return settings_.get();
+}
+
+SecurityContext* WorkerShadowFetchContext::GetParentSecurityContext()
+ const {
+ return execution_context_.Get();
+}
+
+void WorkerShadowFetchContext::CountUsage(UseCounter::Feature feature) const {
+ loading_context_->RecordUseCount(feature);
+}
+
+void WorkerShadowFetchContext::CountDeprecation(
+ UseCounter::Feature feature) const {
+ // As we won't show deprecation warning in {service,shared} workers
+ // this could just be handled as a regular use count.
+ loading_context_->RecordUseCount(feature);
+}
+
+DEFINE_TRACE(WorkerShadowFetchContext) {
+ visitor->Trace(execution_context_);
+ visitor->Trace(loading_context_);
+ visitor->Trace(app_cache_host_);
+ BaseFetchContext::Trace(visitor);
+}
+
+WorkerShadowFetchContext::WorkerShadowFetchContext(
+ ExecutionContextImpl* execution_context,
+ ApplicationCacheHost* app_cache_host,
+ std::unique_ptr<WebServiceWorkerNetworkProvider> service_worker_provider,
+ std::unique_ptr<Settings> settings,
+ ParentFrameTaskRunners* task_runners)
+ : BaseFetchContext(execution_context),
+ execution_context_(execution_context),
+ loading_context_(new LoadingContextImpl(execution_context,
+ task_runners,
+ ResourceFetcher::Create(this))),
+ app_cache_host_(app_cache_host),
+ service_worker_provider_(std::move(service_worker_provider)),
+ settings_(std::move(settings)) {}
+
+} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698