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/browser/service_worker/service_worker_controllee_request_handl
er.h" | 5 #include "content/browser/service_worker/service_worker_controllee_request_handl
er.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 int64_t service_worker_version_id, | 48 int64_t service_worker_version_id, |
49 const GURL& scope, | 49 const GURL& scope, |
50 const GURL& script_url, | 50 const GURL& script_url, |
51 bool pause_after_download) override { | 51 bool pause_after_download) override { |
52 SimulateWorkerStopped(embedded_worker_id); | 52 SimulateWorkerStopped(embedded_worker_id); |
53 } | 53 } |
54 }; | 54 }; |
55 | 55 |
56 class ServiceWorkerControlleeRequestHandlerTest : public testing::Test { | 56 class ServiceWorkerControlleeRequestHandlerTest : public testing::Test { |
57 public: | 57 public: |
| 58 class ServiceWorkerRequestTestResources { |
| 59 public: |
| 60 ServiceWorkerRequestTestResources( |
| 61 ServiceWorkerControlleeRequestHandlerTest* test, |
| 62 const GURL& url, |
| 63 ResourceType type) |
| 64 : test_(test), |
| 65 request_(test->url_request_context_.CreateRequest( |
| 66 url, |
| 67 net::DEFAULT_PRIORITY, |
| 68 &test->url_request_delegate_)), |
| 69 handler_(new ServiceWorkerControlleeRequestHandler( |
| 70 test->context()->AsWeakPtr(), |
| 71 test->provider_host_, |
| 72 base::WeakPtr<storage::BlobStorageContext>(), |
| 73 FETCH_REQUEST_MODE_NO_CORS, |
| 74 FETCH_CREDENTIALS_MODE_OMIT, |
| 75 FetchRedirectMode::FOLLOW_MODE, |
| 76 type, |
| 77 REQUEST_CONTEXT_TYPE_HYPERLINK, |
| 78 REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL, |
| 79 scoped_refptr<ResourceRequestBody>())), |
| 80 job_(nullptr) {} |
| 81 |
| 82 ServiceWorkerURLRequestJob* MaybeCreateJob() { |
| 83 job_.reset(handler_->MaybeCreateJob(request_.get(), nullptr, |
| 84 &test_->mock_resource_context_)); |
| 85 return static_cast<ServiceWorkerURLRequestJob*>(job_.get()); |
| 86 } |
| 87 |
| 88 void ResetHandler() { handler_.reset(nullptr); } |
| 89 |
| 90 private: |
| 91 ServiceWorkerControlleeRequestHandlerTest* test_; |
| 92 std::unique_ptr<net::URLRequest> request_; |
| 93 std::unique_ptr<ServiceWorkerControlleeRequestHandler> handler_; |
| 94 std::unique_ptr<net::URLRequestJob> job_; |
| 95 }; |
| 96 |
58 ServiceWorkerControlleeRequestHandlerTest() | 97 ServiceWorkerControlleeRequestHandlerTest() |
59 : browser_thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {} | 98 : browser_thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {} |
60 | 99 |
61 void SetUp() override { | 100 void SetUp() override { |
62 SetUpWithHelper(new EmbeddedWorkerTestHelper(base::FilePath())); | 101 SetUpWithHelper(new EmbeddedWorkerTestHelper(base::FilePath())); |
63 } | 102 } |
64 | 103 |
65 void SetUpWithHelper(EmbeddedWorkerTestHelper* helper) { | 104 void SetUpWithHelper(EmbeddedWorkerTestHelper* helper) { |
66 helper_.reset(helper); | 105 helper_.reset(helper); |
67 | 106 |
68 // A new unstored registration/version. | 107 // A new unstored registration/version. |
69 scope_ = GURL("http://host/scope/"); | 108 scope_ = GURL("https://host/scope/"); |
70 script_url_ = GURL("http://host/script.js"); | 109 script_url_ = GURL("https://host/script.js"); |
71 registration_ = new ServiceWorkerRegistration( | 110 registration_ = new ServiceWorkerRegistration( |
72 scope_, 1L, context()->AsWeakPtr()); | 111 scope_, 1L, context()->AsWeakPtr()); |
73 version_ = new ServiceWorkerVersion( | 112 version_ = new ServiceWorkerVersion( |
74 registration_.get(), script_url_, 1L, context()->AsWeakPtr()); | 113 registration_.get(), script_url_, 1L, context()->AsWeakPtr()); |
75 | 114 |
76 std::vector<ServiceWorkerDatabase::ResourceRecord> records; | 115 std::vector<ServiceWorkerDatabase::ResourceRecord> records; |
77 records.push_back( | 116 records.push_back( |
78 ServiceWorkerDatabase::ResourceRecord(10, version_->script_url(), 100)); | 117 ServiceWorkerDatabase::ResourceRecord(10, version_->script_url(), 100)); |
79 version_->script_cache_map()->SetResources(records); | 118 version_->script_cache_map()->SetResources(records); |
80 | 119 |
81 // An empty host. | 120 // An empty host. |
82 std::unique_ptr<ServiceWorkerProviderHost> host( | 121 std::unique_ptr<ServiceWorkerProviderHost> host( |
83 new ServiceWorkerProviderHost(helper_->mock_render_process_id(), | 122 new ServiceWorkerProviderHost( |
84 MSG_ROUTING_NONE, kMockProviderId, | 123 helper_->mock_render_process_id(), MSG_ROUTING_NONE, |
85 SERVICE_WORKER_PROVIDER_FOR_WINDOW, | 124 kMockProviderId, SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
86 context()->AsWeakPtr(), NULL)); | 125 ServiceWorkerProviderHost::FrameSecurityLevel::SECURE, |
| 126 context()->AsWeakPtr(), NULL)); |
87 provider_host_ = host->AsWeakPtr(); | 127 provider_host_ = host->AsWeakPtr(); |
88 context()->AddProviderHost(std::move(host)); | 128 context()->AddProviderHost(std::move(host)); |
89 | 129 |
90 context()->storage()->LazyInitialize(base::Bind(&base::DoNothing)); | 130 context()->storage()->LazyInitialize(base::Bind(&base::DoNothing)); |
91 base::RunLoop().RunUntilIdle(); | 131 base::RunLoop().RunUntilIdle(); |
92 } | 132 } |
93 | 133 |
94 void TearDown() override { | 134 void TearDown() override { |
95 version_ = NULL; | 135 version_ = NULL; |
96 registration_ = NULL; | 136 registration_ = NULL; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 // Store an activated worker. | 172 // Store an activated worker. |
133 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | 173 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
134 registration_->SetActiveVersion(version_); | 174 registration_->SetActiveVersion(version_); |
135 context()->storage()->StoreRegistration( | 175 context()->storage()->StoreRegistration( |
136 registration_.get(), | 176 registration_.get(), |
137 version_.get(), | 177 version_.get(), |
138 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 178 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
139 base::RunLoop().RunUntilIdle(); | 179 base::RunLoop().RunUntilIdle(); |
140 | 180 |
141 // Conduct a main resource load. | 181 // Conduct a main resource load. |
142 const GURL kDocUrl("http://host/scope/doc"); | 182 ServiceWorkerRequestTestResources test_resources( |
143 std::unique_ptr<net::URLRequest> request = url_request_context_.CreateRequest( | 183 this, GURL("https://host/scope/doc"), RESOURCE_TYPE_MAIN_FRAME); |
144 kDocUrl, net::DEFAULT_PRIORITY, &url_request_delegate_); | 184 ServiceWorkerURLRequestJob* sw_job = test_resources.MaybeCreateJob(); |
145 std::unique_ptr<ServiceWorkerControlleeRequestHandler> handler( | |
146 new ServiceWorkerControlleeRequestHandler( | |
147 context()->AsWeakPtr(), provider_host_, | |
148 base::WeakPtr<storage::BlobStorageContext>(), | |
149 FETCH_REQUEST_MODE_NO_CORS, FETCH_CREDENTIALS_MODE_OMIT, | |
150 FetchRedirectMode::FOLLOW_MODE, RESOURCE_TYPE_MAIN_FRAME, | |
151 REQUEST_CONTEXT_TYPE_HYPERLINK, REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL, | |
152 scoped_refptr<ResourceRequestBody>())); | |
153 std::unique_ptr<net::URLRequestJob> job( | |
154 handler->MaybeCreateJob(request.get(), nullptr, &mock_resource_context_)); | |
155 ServiceWorkerURLRequestJob* sw_job = | |
156 static_cast<ServiceWorkerURLRequestJob*>(job.get()); | |
157 | 185 |
158 EXPECT_FALSE(sw_job->ShouldFallbackToNetwork()); | 186 EXPECT_FALSE(sw_job->ShouldFallbackToNetwork()); |
159 EXPECT_FALSE(sw_job->ShouldForwardToServiceWorker()); | 187 EXPECT_FALSE(sw_job->ShouldForwardToServiceWorker()); |
160 EXPECT_FALSE(version_->HasControllee()); | 188 EXPECT_FALSE(version_->HasControllee()); |
161 base::RunLoop().RunUntilIdle(); | 189 base::RunLoop().RunUntilIdle(); |
162 | 190 |
163 // Verify we did not use the worker. | 191 // Verify we did not use the worker. |
164 EXPECT_TRUE(sw_job->ShouldFallbackToNetwork()); | 192 EXPECT_TRUE(sw_job->ShouldFallbackToNetwork()); |
165 EXPECT_FALSE(sw_job->ShouldForwardToServiceWorker()); | 193 EXPECT_FALSE(sw_job->ShouldForwardToServiceWorker()); |
166 EXPECT_FALSE(version_->HasControllee()); | 194 EXPECT_FALSE(version_->HasControllee()); |
167 | 195 |
168 SetBrowserClientForTesting(old_browser_client); | 196 SetBrowserClientForTesting(old_browser_client); |
169 } | 197 } |
170 | 198 |
171 TEST_F(ServiceWorkerControlleeRequestHandlerTest, ActivateWaitingVersion) { | 199 TEST_F(ServiceWorkerControlleeRequestHandlerTest, ActivateWaitingVersion) { |
172 // Store a registration that is installed but not activated yet. | 200 // Store a registration that is installed but not activated yet. |
173 version_->SetStatus(ServiceWorkerVersion::INSTALLED); | 201 version_->SetStatus(ServiceWorkerVersion::INSTALLED); |
174 registration_->SetWaitingVersion(version_); | 202 registration_->SetWaitingVersion(version_); |
175 context()->storage()->StoreRegistration( | 203 context()->storage()->StoreRegistration( |
176 registration_.get(), | 204 registration_.get(), |
177 version_.get(), | 205 version_.get(), |
178 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 206 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
179 base::RunLoop().RunUntilIdle(); | 207 base::RunLoop().RunUntilIdle(); |
180 | 208 |
181 // Conduct a main resource load. | 209 // Conduct a main resource load. |
182 const GURL kDocUrl("http://host/scope/doc"); | 210 ServiceWorkerRequestTestResources test_resources( |
183 std::unique_ptr<net::URLRequest> request = url_request_context_.CreateRequest( | 211 this, GURL("https://host/scope/doc"), RESOURCE_TYPE_MAIN_FRAME); |
184 kDocUrl, net::DEFAULT_PRIORITY, &url_request_delegate_); | 212 ServiceWorkerURLRequestJob* sw_job = test_resources.MaybeCreateJob(); |
185 std::unique_ptr<ServiceWorkerControlleeRequestHandler> handler( | |
186 new ServiceWorkerControlleeRequestHandler( | |
187 context()->AsWeakPtr(), provider_host_, | |
188 base::WeakPtr<storage::BlobStorageContext>(), | |
189 FETCH_REQUEST_MODE_NO_CORS, FETCH_CREDENTIALS_MODE_OMIT, | |
190 FetchRedirectMode::FOLLOW_MODE, RESOURCE_TYPE_MAIN_FRAME, | |
191 REQUEST_CONTEXT_TYPE_HYPERLINK, REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL, | |
192 scoped_refptr<ResourceRequestBody>())); | |
193 std::unique_ptr<net::URLRequestJob> job( | |
194 handler->MaybeCreateJob(request.get(), nullptr, &mock_resource_context_)); | |
195 ServiceWorkerURLRequestJob* sw_job = | |
196 static_cast<ServiceWorkerURLRequestJob*>(job.get()); | |
197 | 213 |
198 EXPECT_FALSE(sw_job->ShouldFallbackToNetwork()); | 214 EXPECT_FALSE(sw_job->ShouldFallbackToNetwork()); |
199 EXPECT_FALSE(sw_job->ShouldForwardToServiceWorker()); | 215 EXPECT_FALSE(sw_job->ShouldForwardToServiceWorker()); |
200 EXPECT_FALSE(version_->HasControllee()); | 216 EXPECT_FALSE(version_->HasControllee()); |
201 | 217 |
202 base::RunLoop().RunUntilIdle(); | 218 base::RunLoop().RunUntilIdle(); |
203 | 219 |
204 EXPECT_EQ(ServiceWorkerVersion::ACTIVATED, | 220 EXPECT_EQ(ServiceWorkerVersion::ACTIVATED, |
205 version_->status()); | 221 version_->status()); |
206 EXPECT_FALSE(sw_job->ShouldFallbackToNetwork()); | 222 EXPECT_FALSE(sw_job->ShouldFallbackToNetwork()); |
207 EXPECT_TRUE(sw_job->ShouldForwardToServiceWorker()); | 223 EXPECT_TRUE(sw_job->ShouldForwardToServiceWorker()); |
208 EXPECT_TRUE(version_->HasControllee()); | 224 EXPECT_TRUE(version_->HasControllee()); |
209 | 225 |
210 // Navigations should trigger an update too. | 226 // Navigations should trigger an update too. |
211 handler.reset(NULL); | 227 test_resources.ResetHandler(); |
212 EXPECT_TRUE(version_->update_timer_.IsRunning()); | 228 EXPECT_TRUE(version_->update_timer_.IsRunning()); |
213 } | 229 } |
214 | 230 |
215 // Test that an installing registration is associated with a provider host. | 231 // Test that an installing registration is associated with a provider host. |
216 TEST_F(ServiceWorkerControlleeRequestHandlerTest, InstallingRegistration) { | 232 TEST_F(ServiceWorkerControlleeRequestHandlerTest, InstallingRegistration) { |
217 // Create an installing registration. | 233 // Create an installing registration. |
218 version_->SetStatus(ServiceWorkerVersion::INSTALLING); | 234 version_->SetStatus(ServiceWorkerVersion::INSTALLING); |
219 registration_->SetInstallingVersion(version_); | 235 registration_->SetInstallingVersion(version_); |
220 context()->storage()->NotifyInstallingRegistration(registration_.get()); | 236 context()->storage()->NotifyInstallingRegistration(registration_.get()); |
221 | 237 |
222 // Conduct a main resource load. | 238 // Conduct a main resource load. |
223 const GURL kDocUrl("http://host/scope/doc"); | 239 ServiceWorkerRequestTestResources test_resources( |
224 std::unique_ptr<net::URLRequest> request = url_request_context_.CreateRequest( | 240 this, GURL("https://host/scope/doc"), RESOURCE_TYPE_MAIN_FRAME); |
225 kDocUrl, net::DEFAULT_PRIORITY, &url_request_delegate_); | 241 ServiceWorkerURLRequestJob* job = test_resources.MaybeCreateJob(); |
226 std::unique_ptr<ServiceWorkerControlleeRequestHandler> handler( | 242 |
227 new ServiceWorkerControlleeRequestHandler( | |
228 context()->AsWeakPtr(), provider_host_, | |
229 base::WeakPtr<storage::BlobStorageContext>(), | |
230 FETCH_REQUEST_MODE_NO_CORS, FETCH_CREDENTIALS_MODE_OMIT, | |
231 FetchRedirectMode::FOLLOW_MODE, RESOURCE_TYPE_MAIN_FRAME, | |
232 REQUEST_CONTEXT_TYPE_HYPERLINK, REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL, | |
233 scoped_refptr<ResourceRequestBody>())); | |
234 std::unique_ptr<net::URLRequestJob> job( | |
235 handler->MaybeCreateJob(request.get(), nullptr, &mock_resource_context_)); | |
236 base::RunLoop().RunUntilIdle(); | 243 base::RunLoop().RunUntilIdle(); |
237 | 244 |
238 // The handler should have fallen back to network and destroyed the job. The | 245 // The handler should have fallen back to network and destroyed the job. The |
239 // registration should be associated with the provider host, although it is | 246 // registration should be associated with the provider host, although it is |
240 // not controlled since there is no active version. | 247 // not controlled since there is no active version. |
241 EXPECT_FALSE(job); | 248 EXPECT_FALSE(job); |
242 EXPECT_EQ(registration_.get(), provider_host_->associated_registration()); | 249 EXPECT_EQ(registration_.get(), provider_host_->associated_registration()); |
243 EXPECT_EQ(version_.get(), provider_host_->installing_version()); | 250 EXPECT_EQ(version_.get(), provider_host_->installing_version()); |
244 EXPECT_FALSE(version_->HasControllee()); | 251 EXPECT_FALSE(version_->HasControllee()); |
245 EXPECT_FALSE(provider_host_->controlling_version()); | 252 EXPECT_FALSE(provider_host_->controlling_version()); |
246 } | 253 } |
247 | 254 |
248 // Test to not regress crbug/414118. | 255 // Test to not regress crbug/414118. |
249 TEST_F(ServiceWorkerControlleeRequestHandlerTest, DeletedProviderHost) { | 256 TEST_F(ServiceWorkerControlleeRequestHandlerTest, DeletedProviderHost) { |
250 // Store a registration so the call to FindRegistrationForDocument will read | 257 // Store a registration so the call to FindRegistrationForDocument will read |
251 // from the database. | 258 // from the database. |
252 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | 259 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
253 registration_->SetActiveVersion(version_); | 260 registration_->SetActiveVersion(version_); |
254 context()->storage()->StoreRegistration( | 261 context()->storage()->StoreRegistration( |
255 registration_.get(), | 262 registration_.get(), |
256 version_.get(), | 263 version_.get(), |
257 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 264 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
258 base::RunLoop().RunUntilIdle(); | 265 base::RunLoop().RunUntilIdle(); |
259 version_ = NULL; | 266 version_ = NULL; |
260 registration_ = NULL; | 267 registration_ = NULL; |
261 | 268 |
262 // Conduct a main resource load. | 269 // Conduct a main resource load. |
263 const GURL kDocUrl("http://host/scope/doc"); | 270 ServiceWorkerRequestTestResources test_resources( |
264 std::unique_ptr<net::URLRequest> request = url_request_context_.CreateRequest( | 271 this, GURL("https://host/scope/doc"), RESOURCE_TYPE_MAIN_FRAME); |
265 kDocUrl, net::DEFAULT_PRIORITY, &url_request_delegate_); | 272 ServiceWorkerURLRequestJob* sw_job = test_resources.MaybeCreateJob(); |
266 std::unique_ptr<ServiceWorkerControlleeRequestHandler> handler( | |
267 new ServiceWorkerControlleeRequestHandler( | |
268 context()->AsWeakPtr(), provider_host_, | |
269 base::WeakPtr<storage::BlobStorageContext>(), | |
270 FETCH_REQUEST_MODE_NO_CORS, FETCH_CREDENTIALS_MODE_OMIT, | |
271 FetchRedirectMode::FOLLOW_MODE, RESOURCE_TYPE_MAIN_FRAME, | |
272 REQUEST_CONTEXT_TYPE_HYPERLINK, REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL, | |
273 scoped_refptr<ResourceRequestBody>())); | |
274 std::unique_ptr<net::URLRequestJob> job( | |
275 handler->MaybeCreateJob(request.get(), nullptr, &mock_resource_context_)); | |
276 ServiceWorkerURLRequestJob* sw_job = | |
277 static_cast<ServiceWorkerURLRequestJob*>(job.get()); | |
278 | 273 |
279 EXPECT_FALSE(sw_job->ShouldFallbackToNetwork()); | 274 EXPECT_FALSE(sw_job->ShouldFallbackToNetwork()); |
280 EXPECT_FALSE(sw_job->ShouldForwardToServiceWorker()); | 275 EXPECT_FALSE(sw_job->ShouldForwardToServiceWorker()); |
281 | 276 |
282 // Shouldn't crash if the ProviderHost is deleted prior to completion of | 277 // Shouldn't crash if the ProviderHost is deleted prior to completion of |
283 // the database lookup. | 278 // the database lookup. |
284 context()->RemoveProviderHost(helper_->mock_render_process_id(), | 279 context()->RemoveProviderHost(helper_->mock_render_process_id(), |
285 kMockProviderId); | 280 kMockProviderId); |
286 EXPECT_FALSE(provider_host_.get()); | 281 EXPECT_FALSE(provider_host_.get()); |
287 base::RunLoop().RunUntilIdle(); | 282 base::RunLoop().RunUntilIdle(); |
288 EXPECT_TRUE(sw_job->ShouldFallbackToNetwork()); | 283 EXPECT_TRUE(sw_job->ShouldFallbackToNetwork()); |
289 EXPECT_FALSE(sw_job->ShouldForwardToServiceWorker()); | 284 EXPECT_FALSE(sw_job->ShouldForwardToServiceWorker()); |
290 } | 285 } |
291 | 286 |
292 } // namespace content | 287 } // namespace content |
OLD | NEW |