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

Side by Side Diff: content/child/service_worker/service_worker_network_provider.cc

Issue 2733283004: Expose WebServiceWorkerNetworkProvider on DataSource (Closed)
Patch Set: addressed comments Created 3 years, 9 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/child/service_worker/service_worker_network_provider.h" 5 #include "content/child/service_worker/service_worker_network_provider.h"
6 6
7 #include "base/atomic_sequence_num.h" 7 #include "base/atomic_sequence_num.h"
8 #include "content/child/child_thread_impl.h" 8 #include "content/child/child_thread_impl.h"
9 #include "content/child/request_extra_data.h"
10 #include "content/child/service_worker/service_worker_handle_reference.h"
9 #include "content/child/service_worker/service_worker_provider_context.h" 11 #include "content/child/service_worker/service_worker_provider_context.h"
10 #include "content/common/navigation_params.h" 12 #include "content/common/navigation_params.h"
11 #include "content/common/service_worker/service_worker_messages.h" 13 #include "content/common/service_worker/service_worker_messages.h"
12 #include "content/common/service_worker/service_worker_provider_host_info.h" 14 #include "content/common/service_worker/service_worker_provider_host_info.h"
13 #include "content/common/service_worker/service_worker_utils.h" 15 #include "content/common/service_worker/service_worker_utils.h"
14 #include "content/public/common/browser_side_navigation_policy.h" 16 #include "content/public/common/browser_side_navigation_policy.h"
15 #include "ipc/ipc_sync_channel.h" 17 #include "ipc/ipc_sync_channel.h"
16 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" 18 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h"
19 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor kerNetworkProvider.h"
17 #include "third_party/WebKit/public/web/WebLocalFrame.h" 20 #include "third_party/WebKit/public/web/WebLocalFrame.h"
18 #include "third_party/WebKit/public/web/WebSandboxFlags.h" 21 #include "third_party/WebKit/public/web/WebSandboxFlags.h"
19 22
20 namespace content { 23 namespace content {
21 24
22 namespace { 25 namespace {
23 26
24 const char kUserDataKey[] = "SWProviderKey";
25
26 // Must be unique in the child process. 27 // Must be unique in the child process.
27 int GetNextProviderId() { 28 int GetNextProviderId() {
28 static base::StaticAtomicSequenceNumber sequence; 29 static base::StaticAtomicSequenceNumber sequence;
29 return sequence.GetNext(); // We start at zero. 30 return sequence.GetNext(); // We start at zero.
30 } 31 }
31 32
32 // Returns whether it's possible for a document whose frame is a descendant of 33 // Returns whether it's possible for a document whose frame is a descendant of
33 // |frame| to be a secure context, not considering scheme exceptions (since any 34 // |frame| to be a secure context, not considering scheme exceptions (since any
34 // document can be a secure context if it has a scheme exception). See 35 // document can be a secure context if it has a scheme exception). See
35 // Document::isSecureContextImpl for more details. 36 // Document::isSecureContextImpl for more details.
36 bool IsFrameSecure(blink::WebFrame* frame) { 37 bool IsFrameSecure(blink::WebFrame* frame) {
37 while (frame) { 38 while (frame) {
38 if (!frame->getSecurityOrigin().isPotentiallyTrustworthy()) 39 if (!frame->getSecurityOrigin().isPotentiallyTrustworthy())
39 return false; 40 return false;
40 frame = frame->parent(); 41 frame = frame->parent();
41 } 42 }
42 return true; 43 return true;
43 } 44 }
44 45
46 // An WebServiceWorkerNetworkProvider for frame. This wraps
47 // ServiceWorkerNetworkProvider implementation and is owned by blink.
48 class WebServiceWorkerNetworkProviderForFrame
49 : public blink::WebServiceWorkerNetworkProvider {
50 public:
51 WebServiceWorkerNetworkProviderForFrame(
52 std::unique_ptr<ServiceWorkerNetworkProvider> provider)
53 : provider_(std::move(provider)) {}
54
55 void willSendRequest(blink::WebURLRequest& request) override {
56 RequestExtraData* extra_data =
57 static_cast<RequestExtraData*>(request.getExtraData());
58 if (!extra_data)
59 extra_data = new RequestExtraData();
60 extra_data->set_service_worker_provider_id(provider_->provider_id());
61 request.setExtraData(extra_data);
62 }
63
64 bool isControlledByServiceWorker() override {
65 return provider_->IsControlledByServiceWorker();
66 }
67
68 int64_t serviceWorkerID() override {
69 if (provider_->context() && provider_->context()->controller())
70 return provider_->context()->controller()->version_id();
71 return kInvalidServiceWorkerVersionId;
72 }
73
74 ServiceWorkerNetworkProvider* provider() { return provider_.get(); }
75
76 private:
77 std::unique_ptr<ServiceWorkerNetworkProvider> provider_;
78 };
79
45 } // namespace 80 } // namespace
46 81
47 void ServiceWorkerNetworkProvider::AttachToDocumentState(
48 base::SupportsUserData* datasource_userdata,
49 std::unique_ptr<ServiceWorkerNetworkProvider> network_provider) {
50 datasource_userdata->SetUserData(&kUserDataKey, network_provider.release());
51 }
52
53 ServiceWorkerNetworkProvider* ServiceWorkerNetworkProvider::FromDocumentState(
54 base::SupportsUserData* datasource_userdata) {
55 return static_cast<ServiceWorkerNetworkProvider*>(
56 datasource_userdata->GetUserData(&kUserDataKey));
57 }
58
59 // static 82 // static
60 std::unique_ptr<ServiceWorkerNetworkProvider> 83 std::unique_ptr<blink::WebServiceWorkerNetworkProvider>
61 ServiceWorkerNetworkProvider::CreateForNavigation( 84 ServiceWorkerNetworkProvider::CreateForNavigation(
62 int route_id, 85 int route_id,
63 const RequestNavigationParams& request_params, 86 const RequestNavigationParams& request_params,
64 blink::WebLocalFrame* frame, 87 blink::WebLocalFrame* frame,
65 bool content_initiated) { 88 bool content_initiated) {
66 bool browser_side_navigation = IsBrowserSideNavigationEnabled(); 89 bool browser_side_navigation = IsBrowserSideNavigationEnabled();
67 bool should_create_provider_for_window = false; 90 bool should_create_provider_for_window = false;
68 int service_worker_provider_id = kInvalidServiceWorkerProviderId; 91 int service_worker_provider_id = kInvalidServiceWorkerProviderId;
69 std::unique_ptr<ServiceWorkerNetworkProvider> network_provider; 92 std::unique_ptr<ServiceWorkerNetworkProvider> network_provider;
70 93
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 service_worker_provider_id)); 130 service_worker_provider_id));
108 network_provider = std::unique_ptr<ServiceWorkerNetworkProvider>( 131 network_provider = std::unique_ptr<ServiceWorkerNetworkProvider>(
109 new ServiceWorkerNetworkProvider( 132 new ServiceWorkerNetworkProvider(
110 route_id, SERVICE_WORKER_PROVIDER_FOR_WINDOW, 133 route_id, SERVICE_WORKER_PROVIDER_FOR_WINDOW,
111 service_worker_provider_id, is_parent_frame_secure)); 134 service_worker_provider_id, is_parent_frame_secure));
112 } 135 }
113 } else { 136 } else {
114 network_provider = std::unique_ptr<ServiceWorkerNetworkProvider>( 137 network_provider = std::unique_ptr<ServiceWorkerNetworkProvider>(
115 new ServiceWorkerNetworkProvider()); 138 new ServiceWorkerNetworkProvider());
116 } 139 }
117 return network_provider; 140 return base::MakeUnique<WebServiceWorkerNetworkProviderForFrame>(
141 std::move(network_provider));
142 }
143
144 // static
145 ServiceWorkerNetworkProvider*
146 ServiceWorkerNetworkProvider::FromWebServiceWorkerNetworkProvider(
147 blink::WebServiceWorkerNetworkProvider* provider) {
148 return static_cast<WebServiceWorkerNetworkProviderForFrame*>(provider)
149 ->provider();
118 } 150 }
119 151
120 ServiceWorkerNetworkProvider::ServiceWorkerNetworkProvider( 152 ServiceWorkerNetworkProvider::ServiceWorkerNetworkProvider(
121 int route_id, 153 int route_id,
122 ServiceWorkerProviderType provider_type, 154 ServiceWorkerProviderType provider_type,
123 int browser_provider_id, 155 int browser_provider_id,
124 bool is_parent_frame_secure) 156 bool is_parent_frame_secure)
125 : provider_id_(browser_provider_id) { 157 : provider_id_(browser_provider_id) {
126 if (provider_id_ == kInvalidServiceWorkerProviderId) 158 if (provider_id_ == kInvalidServiceWorkerProviderId)
127 return; 159 return;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 return; // May be null in some tests. 197 return; // May be null in some tests.
166 dispatcher_host_->OnSetHostedVersionId(provider_id(), version_id, 198 dispatcher_host_->OnSetHostedVersionId(provider_id(), version_id,
167 embedded_worker_id); 199 embedded_worker_id);
168 } 200 }
169 201
170 bool ServiceWorkerNetworkProvider::IsControlledByServiceWorker() const { 202 bool ServiceWorkerNetworkProvider::IsControlledByServiceWorker() const {
171 return context() && context()->controller(); 203 return context() && context()->controller();
172 } 204 }
173 205
174 } // namespace content 206 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698