OLD | NEW |
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/service_worker/service_worker_provider_context.h" | 9 #include "content/child/service_worker/service_worker_provider_context.h" |
10 #include "content/common/navigation_params.h" | |
11 #include "content/common/service_worker/service_worker_messages.h" | 10 #include "content/common/service_worker/service_worker_messages.h" |
12 #include "content/common/service_worker/service_worker_utils.h" | 11 #include "content/common/service_worker/service_worker_utils.h" |
13 #include "content/public/common/browser_side_navigation_policy.h" | 12 #include "content/public/common/browser_side_navigation_policy.h" |
14 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" | 13 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" |
15 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 14 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
16 #include "third_party/WebKit/public/web/WebSandboxFlags.h" | 15 #include "third_party/WebKit/public/web/WebSandboxFlags.h" |
17 | 16 |
18 namespace content { | 17 namespace content { |
19 | 18 |
20 namespace { | 19 namespace { |
(...skipping 30 matching lines...) Expand all Loading... |
51 ServiceWorkerNetworkProvider* ServiceWorkerNetworkProvider::FromDocumentState( | 50 ServiceWorkerNetworkProvider* ServiceWorkerNetworkProvider::FromDocumentState( |
52 base::SupportsUserData* datasource_userdata) { | 51 base::SupportsUserData* datasource_userdata) { |
53 return static_cast<ServiceWorkerNetworkProvider*>( | 52 return static_cast<ServiceWorkerNetworkProvider*>( |
54 datasource_userdata->GetUserData(&kUserDataKey)); | 53 datasource_userdata->GetUserData(&kUserDataKey)); |
55 } | 54 } |
56 | 55 |
57 // static | 56 // static |
58 std::unique_ptr<ServiceWorkerNetworkProvider> | 57 std::unique_ptr<ServiceWorkerNetworkProvider> |
59 ServiceWorkerNetworkProvider::CreateForNavigation( | 58 ServiceWorkerNetworkProvider::CreateForNavigation( |
60 int route_id, | 59 int route_id, |
61 const RequestNavigationParams& request_params, | |
62 blink::WebLocalFrame* frame, | 60 blink::WebLocalFrame* frame, |
63 bool content_initiated) { | 61 bool content_initiated) { |
64 bool browser_side_navigation = IsBrowserSideNavigationEnabled(); | |
65 bool should_create_provider_for_window = false; | |
66 int service_worker_provider_id = kInvalidServiceWorkerProviderId; | |
67 std::unique_ptr<ServiceWorkerNetworkProvider> network_provider; | |
68 | |
69 // Determine if a ServiceWorkerNetworkProvider should be created and properly | 62 // Determine if a ServiceWorkerNetworkProvider should be created and properly |
70 // initialized for the navigation. A default ServiceWorkerNetworkProvider | 63 // initialized for the navigation. A default ServiceWorkerNetworkProvider |
71 // will always be created since it is expected in a certain number of places, | 64 // will always be created since it is expected in a certain number of places, |
72 // however it will have an invalid id. | 65 // however it will have an invalid id. |
73 // PlzNavigate: |service_worker_provider_id| can be sent by the browser, if | 66 bool should_create_provider_for_window = |
74 // it already created the SeviceWorkerProviderHost. | 67 ((frame->effectiveSandboxFlags() & blink::WebSandboxFlags::Origin) != |
75 if (browser_side_navigation && !content_initiated) { | 68 blink::WebSandboxFlags::Origin); |
76 should_create_provider_for_window = | |
77 request_params.should_create_service_worker; | |
78 service_worker_provider_id = request_params.service_worker_provider_id; | |
79 DCHECK(ServiceWorkerUtils::IsBrowserAssignedProviderId( | |
80 service_worker_provider_id) || | |
81 service_worker_provider_id == kInvalidServiceWorkerProviderId); | |
82 } else { | |
83 should_create_provider_for_window = | |
84 ((frame->effectiveSandboxFlags() & blink::WebSandboxFlags::Origin) != | |
85 blink::WebSandboxFlags::Origin); | |
86 } | |
87 | 69 |
88 // Now create the ServiceWorkerNetworkProvider (with invalid id if needed). | 70 // Now create the ServiceWorkerNetworkProvider (with invalid id if needed). |
| 71 std::unique_ptr<ServiceWorkerNetworkProvider> network_provider; |
89 if (should_create_provider_for_window) { | 72 if (should_create_provider_for_window) { |
90 // Ideally Document::isSecureContext would be called here, but the document | 73 // Ideally Document::isSecureContext would be called here, but the document |
91 // is not created yet, and due to redirects the URL may change. So pass | 74 // is not created yet, and due to redirects the URL may change. So pass |
92 // is_parent_frame_secure to the browser process, so it can determine the | 75 // is_parent_frame_secure to the browser process, so it can determine the |
93 // context security when deciding whether to allow a service worker to | 76 // context security when deciding whether to allow a service worker to |
94 // control the document. | 77 // control the document. |
95 const bool is_parent_frame_secure = IsFrameSecure(frame->parent()); | 78 const bool is_parent_frame_secure = IsFrameSecure(frame->parent()); |
96 | 79 |
97 if (service_worker_provider_id == kInvalidServiceWorkerProviderId) { | 80 network_provider = std::unique_ptr<ServiceWorkerNetworkProvider>( |
98 network_provider = std::unique_ptr<ServiceWorkerNetworkProvider>( | 81 new ServiceWorkerNetworkProvider(route_id, |
99 new ServiceWorkerNetworkProvider(route_id, | 82 SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
100 SERVICE_WORKER_PROVIDER_FOR_WINDOW, | 83 is_parent_frame_secure)); |
101 is_parent_frame_secure)); | |
102 } else { | |
103 CHECK(browser_side_navigation); | |
104 DCHECK(ServiceWorkerUtils::IsBrowserAssignedProviderId( | |
105 service_worker_provider_id)); | |
106 network_provider = std::unique_ptr<ServiceWorkerNetworkProvider>( | |
107 new ServiceWorkerNetworkProvider( | |
108 route_id, SERVICE_WORKER_PROVIDER_FOR_WINDOW, | |
109 service_worker_provider_id, is_parent_frame_secure)); | |
110 } | |
111 } else { | 84 } else { |
112 network_provider = std::unique_ptr<ServiceWorkerNetworkProvider>( | 85 network_provider = std::unique_ptr<ServiceWorkerNetworkProvider>( |
113 new ServiceWorkerNetworkProvider()); | 86 new ServiceWorkerNetworkProvider()); |
114 } | 87 } |
115 return network_provider; | 88 return network_provider; |
116 } | 89 } |
117 | 90 |
118 ServiceWorkerNetworkProvider::ServiceWorkerNetworkProvider( | 91 ServiceWorkerNetworkProvider::ServiceWorkerNetworkProvider( |
119 int route_id, | 92 int route_id, |
120 ServiceWorkerProviderType provider_type, | 93 ServiceWorkerProviderType provider_type, |
121 int browser_provider_id, | |
122 bool is_parent_frame_secure) | 94 bool is_parent_frame_secure) |
123 : provider_id_(browser_provider_id) { | 95 : provider_id_(GetNextProviderId()) { |
124 if (provider_id_ == kInvalidServiceWorkerProviderId) | 96 DCHECK(provider_id_ != kInvalidServiceWorkerProviderId); |
125 return; | |
126 if (!ChildThreadImpl::current()) | 97 if (!ChildThreadImpl::current()) |
127 return; // May be null in some tests. | 98 return; // May be null in some tests. |
128 context_ = new ServiceWorkerProviderContext( | 99 context_ = new ServiceWorkerProviderContext( |
129 provider_id_, provider_type, | 100 provider_id_, provider_type, |
130 ChildThreadImpl::current()->thread_safe_sender()); | 101 ChildThreadImpl::current()->thread_safe_sender()); |
131 ChildThreadImpl::current()->Send(new ServiceWorkerHostMsg_ProviderCreated( | 102 ChildThreadImpl::current()->Send(new ServiceWorkerHostMsg_ProviderCreated( |
132 provider_id_, route_id, provider_type, is_parent_frame_secure)); | 103 provider_id_, route_id, provider_type, is_parent_frame_secure)); |
133 } | 104 } |
134 | 105 |
135 ServiceWorkerNetworkProvider::ServiceWorkerNetworkProvider( | |
136 int route_id, | |
137 ServiceWorkerProviderType provider_type, | |
138 bool is_parent_frame_secure) | |
139 : ServiceWorkerNetworkProvider(route_id, | |
140 provider_type, | |
141 GetNextProviderId(), | |
142 is_parent_frame_secure) {} | |
143 | |
144 ServiceWorkerNetworkProvider::ServiceWorkerNetworkProvider() | 106 ServiceWorkerNetworkProvider::ServiceWorkerNetworkProvider() |
145 : provider_id_(kInvalidServiceWorkerProviderId) {} | 107 : provider_id_(kInvalidServiceWorkerProviderId) {} |
146 | 108 |
147 ServiceWorkerNetworkProvider::~ServiceWorkerNetworkProvider() { | 109 ServiceWorkerNetworkProvider::~ServiceWorkerNetworkProvider() { |
148 if (provider_id_ == kInvalidServiceWorkerProviderId) | 110 if (provider_id_ == kInvalidServiceWorkerProviderId) |
149 return; | 111 return; |
150 if (!ChildThreadImpl::current()) | 112 if (!ChildThreadImpl::current()) |
151 return; // May be null in some tests. | 113 return; // May be null in some tests. |
152 ChildThreadImpl::current()->Send( | 114 ChildThreadImpl::current()->Send( |
153 new ServiceWorkerHostMsg_ProviderDestroyed(provider_id_)); | 115 new ServiceWorkerHostMsg_ProviderDestroyed(provider_id_)); |
154 } | 116 } |
155 | 117 |
156 void ServiceWorkerNetworkProvider::SetServiceWorkerVersionId( | 118 void ServiceWorkerNetworkProvider::SetServiceWorkerVersionId( |
157 int64_t version_id) { | 119 int64_t version_id) { |
158 DCHECK_NE(kInvalidServiceWorkerProviderId, provider_id_); | 120 DCHECK_NE(kInvalidServiceWorkerProviderId, provider_id_); |
159 if (!ChildThreadImpl::current()) | 121 if (!ChildThreadImpl::current()) |
160 return; // May be null in some tests. | 122 return; // May be null in some tests. |
161 ChildThreadImpl::current()->Send( | 123 ChildThreadImpl::current()->Send( |
162 new ServiceWorkerHostMsg_SetVersionId(provider_id_, version_id)); | 124 new ServiceWorkerHostMsg_SetVersionId(provider_id_, version_id)); |
163 } | 125 } |
164 | 126 |
165 bool ServiceWorkerNetworkProvider::IsControlledByServiceWorker() const { | 127 bool ServiceWorkerNetworkProvider::IsControlledByServiceWorker() const { |
166 return context() && context()->controller(); | 128 return context() && context()->controller(); |
167 } | 129 } |
168 | 130 |
169 } // namespace content | 131 } // namespace content |
OLD | NEW |