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

Side by Side Diff: content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc

Issue 2142523004: M52: Merge "Reland: service worker: Don't control a subframe of an insecure context" (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2743
Patch Set: fix compile errors Created 4 years, 5 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/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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698