| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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_registration.h" | 5 #include "content/browser/service_worker/service_worker_registration.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/files/scoped_temp_dir.h" | 10 #include "base/files/scoped_temp_dir.h" |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 scoped_refptr<ServiceWorkerRegistration> observed_registration_; | 92 scoped_refptr<ServiceWorkerRegistration> observed_registration_; |
| 93 ChangedVersionAttributesMask observed_changed_mask_; | 93 ChangedVersionAttributesMask observed_changed_mask_; |
| 94 ServiceWorkerRegistrationInfo observed_info_; | 94 ServiceWorkerRegistrationInfo observed_info_; |
| 95 }; | 95 }; |
| 96 | 96 |
| 97 private: | 97 private: |
| 98 std::unique_ptr<EmbeddedWorkerTestHelper> helper_; | 98 std::unique_ptr<EmbeddedWorkerTestHelper> helper_; |
| 99 TestBrowserThreadBundle thread_bundle_; | 99 TestBrowserThreadBundle thread_bundle_; |
| 100 }; | 100 }; |
| 101 | 101 |
| 102 TEST_F(ServiceWorkerRegistrationTest, SetAndUnsetVersions) { | 102 class ServiceWorkerRegistrationTestP |
| 103 : public MojoServiceWorkerTestP<ServiceWorkerRegistrationTest> {}; |
| 104 |
| 105 TEST_P(ServiceWorkerRegistrationTestP, SetAndUnsetVersions) { |
| 103 const GURL kScope("http://www.example.not/"); | 106 const GURL kScope("http://www.example.not/"); |
| 104 const GURL kScript("http://www.example.not/service_worker.js"); | 107 const GURL kScript("http://www.example.not/service_worker.js"); |
| 105 int64_t kRegistrationId = 1L; | 108 int64_t kRegistrationId = 1L; |
| 106 scoped_refptr<ServiceWorkerRegistration> registration = | 109 scoped_refptr<ServiceWorkerRegistration> registration = |
| 107 new ServiceWorkerRegistration(kScope, kRegistrationId, | 110 new ServiceWorkerRegistration(kScope, kRegistrationId, |
| 108 context()->AsWeakPtr()); | 111 context()->AsWeakPtr()); |
| 109 | 112 |
| 110 const int64_t version_1_id = 1L; | 113 const int64_t version_1_id = 1L; |
| 111 const int64_t version_2_id = 2L; | 114 const int64_t version_2_id = 2L; |
| 112 scoped_refptr<ServiceWorkerVersion> version_1 = new ServiceWorkerVersion( | 115 scoped_refptr<ServiceWorkerVersion> version_1 = new ServiceWorkerVersion( |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 EXPECT_FALSE(registration->waiting_version()); | 163 EXPECT_FALSE(registration->waiting_version()); |
| 161 EXPECT_EQ(ChangedVersionAttributesMask::WAITING_VERSION, | 164 EXPECT_EQ(ChangedVersionAttributesMask::WAITING_VERSION, |
| 162 listener.observed_changed_mask_.changed()); | 165 listener.observed_changed_mask_.changed()); |
| 163 EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id); | 166 EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id); |
| 164 EXPECT_EQ(listener.observed_info_.waiting_version.version_id, | 167 EXPECT_EQ(listener.observed_info_.waiting_version.version_id, |
| 165 kInvalidServiceWorkerVersionId); | 168 kInvalidServiceWorkerVersionId); |
| 166 EXPECT_EQ(listener.observed_info_.installing_version.version_id, | 169 EXPECT_EQ(listener.observed_info_.installing_version.version_id, |
| 167 kInvalidServiceWorkerVersionId); | 170 kInvalidServiceWorkerVersionId); |
| 168 } | 171 } |
| 169 | 172 |
| 170 TEST_F(ServiceWorkerRegistrationTest, FailedRegistrationNoCrash) { | 173 TEST_P(ServiceWorkerRegistrationTestP, FailedRegistrationNoCrash) { |
| 171 const GURL kScope("http://www.example.not/"); | 174 const GURL kScope("http://www.example.not/"); |
| 172 int64_t kRegistrationId = 1L; | 175 int64_t kRegistrationId = 1L; |
| 173 scoped_refptr<ServiceWorkerRegistration> registration = | 176 scoped_refptr<ServiceWorkerRegistration> registration = |
| 174 new ServiceWorkerRegistration(kScope, kRegistrationId, | 177 new ServiceWorkerRegistration(kScope, kRegistrationId, |
| 175 context()->AsWeakPtr()); | 178 context()->AsWeakPtr()); |
| 176 std::unique_ptr<ServiceWorkerRegistrationHandle> handle( | 179 std::unique_ptr<ServiceWorkerRegistrationHandle> handle( |
| 177 new ServiceWorkerRegistrationHandle( | 180 new ServiceWorkerRegistrationHandle( |
| 178 context()->AsWeakPtr(), base::WeakPtr<ServiceWorkerProviderHost>(), | 181 context()->AsWeakPtr(), base::WeakPtr<ServiceWorkerProviderHost>(), |
| 179 registration.get())); | 182 registration.get())); |
| 180 registration->NotifyRegistrationFailed(); | 183 registration->NotifyRegistrationFailed(); |
| 181 // Don't crash when handle gets destructed. | 184 // Don't crash when handle gets destructed. |
| 182 } | 185 } |
| 183 | 186 |
| 184 // Sets up a registration with a waiting worker, and an active worker | 187 // Sets up a registration with a waiting worker, and an active worker |
| 185 // with a controllee and an inflight request. | 188 // with a controllee and an inflight request. |
| 186 class ServiceWorkerActivationTest : public ServiceWorkerRegistrationTest { | 189 class ServiceWorkerActivationTest : public ServiceWorkerRegistrationTestP { |
| 187 public: | 190 public: |
| 188 ServiceWorkerActivationTest() : ServiceWorkerRegistrationTest() {} | 191 ServiceWorkerActivationTest() : ServiceWorkerRegistrationTestP() {} |
| 189 | 192 |
| 190 void SetUp() override { | 193 void SetUp() override { |
| 191 ServiceWorkerRegistrationTest::SetUp(); | 194 ServiceWorkerRegistrationTest::SetUp(); |
| 192 | 195 |
| 193 const GURL kScope("https://www.example.not/"); | 196 const GURL kScope("https://www.example.not/"); |
| 194 const GURL kScript("https://www.example.not/service_worker.js"); | 197 const GURL kScript("https://www.example.not/service_worker.js"); |
| 195 | 198 |
| 196 registration_ = new ServiceWorkerRegistration( | 199 registration_ = new ServiceWorkerRegistration( |
| 197 kScope, storage()->NewRegistrationId(), context()->AsWeakPtr()); | 200 kScope, storage()->NewRegistrationId(), context()->AsWeakPtr()); |
| 198 | 201 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 ServiceWorkerProviderHost* controllee() { return host_.get(); } | 257 ServiceWorkerProviderHost* controllee() { return host_.get(); } |
| 255 int inflight_request_id() const { return inflight_request_id_; } | 258 int inflight_request_id() const { return inflight_request_id_; } |
| 256 | 259 |
| 257 private: | 260 private: |
| 258 scoped_refptr<ServiceWorkerRegistration> registration_; | 261 scoped_refptr<ServiceWorkerRegistration> registration_; |
| 259 std::unique_ptr<ServiceWorkerProviderHost> host_; | 262 std::unique_ptr<ServiceWorkerProviderHost> host_; |
| 260 int inflight_request_id_ = -1; | 263 int inflight_request_id_ = -1; |
| 261 }; | 264 }; |
| 262 | 265 |
| 263 // Test activation triggered by finishing all requests. | 266 // Test activation triggered by finishing all requests. |
| 264 TEST_F(ServiceWorkerActivationTest, NoInflightRequest) { | 267 TEST_P(ServiceWorkerActivationTest, NoInflightRequest) { |
| 265 scoped_refptr<ServiceWorkerRegistration> reg = registration(); | 268 scoped_refptr<ServiceWorkerRegistration> reg = registration(); |
| 266 scoped_refptr<ServiceWorkerVersion> version_1 = reg->active_version(); | 269 scoped_refptr<ServiceWorkerVersion> version_1 = reg->active_version(); |
| 267 scoped_refptr<ServiceWorkerVersion> version_2 = reg->waiting_version(); | 270 scoped_refptr<ServiceWorkerVersion> version_2 = reg->waiting_version(); |
| 268 | 271 |
| 269 // Remove the controllee. Since there is an in-flight request, | 272 // Remove the controllee. Since there is an in-flight request, |
| 270 // activation should not yet happen. | 273 // activation should not yet happen. |
| 271 version_1->RemoveControllee(controllee()); | 274 version_1->RemoveControllee(controllee()); |
| 272 base::RunLoop().RunUntilIdle(); | 275 base::RunLoop().RunUntilIdle(); |
| 273 EXPECT_EQ(version_1.get(), reg->active_version()); | 276 EXPECT_EQ(version_1.get(), reg->active_version()); |
| 274 | 277 |
| 275 // Finish the request. Activation should happen. | 278 // Finish the request. Activation should happen. |
| 276 version_1->FinishRequest(inflight_request_id(), true /* was_handled */, | 279 version_1->FinishRequest(inflight_request_id(), true /* was_handled */, |
| 277 base::Time::Now()); | 280 base::Time::Now()); |
| 278 base::RunLoop().RunUntilIdle(); | 281 base::RunLoop().RunUntilIdle(); |
| 279 EXPECT_EQ(version_2.get(), reg->active_version()); | 282 EXPECT_EQ(version_2.get(), reg->active_version()); |
| 280 } | 283 } |
| 281 | 284 |
| 282 // Test activation triggered by loss of controllee. | 285 // Test activation triggered by loss of controllee. |
| 283 TEST_F(ServiceWorkerActivationTest, NoControllee) { | 286 TEST_P(ServiceWorkerActivationTest, NoControllee) { |
| 284 scoped_refptr<ServiceWorkerRegistration> reg = registration(); | 287 scoped_refptr<ServiceWorkerRegistration> reg = registration(); |
| 285 scoped_refptr<ServiceWorkerVersion> version_1 = reg->active_version(); | 288 scoped_refptr<ServiceWorkerVersion> version_1 = reg->active_version(); |
| 286 scoped_refptr<ServiceWorkerVersion> version_2 = reg->waiting_version(); | 289 scoped_refptr<ServiceWorkerVersion> version_2 = reg->waiting_version(); |
| 287 | 290 |
| 288 // Finish the request. Since there is a controllee, activation should not yet | 291 // Finish the request. Since there is a controllee, activation should not yet |
| 289 // happen. | 292 // happen. |
| 290 version_1->FinishRequest(inflight_request_id(), true /* was_handled */, | 293 version_1->FinishRequest(inflight_request_id(), true /* was_handled */, |
| 291 base::Time::Now()); | 294 base::Time::Now()); |
| 292 base::RunLoop().RunUntilIdle(); | 295 base::RunLoop().RunUntilIdle(); |
| 293 EXPECT_EQ(version_1.get(), reg->active_version()); | 296 EXPECT_EQ(version_1.get(), reg->active_version()); |
| 294 | 297 |
| 295 // Remove the controllee. Activation should happen. | 298 // Remove the controllee. Activation should happen. |
| 296 version_1->RemoveControllee(controllee()); | 299 version_1->RemoveControllee(controllee()); |
| 297 base::RunLoop().RunUntilIdle(); | 300 base::RunLoop().RunUntilIdle(); |
| 298 EXPECT_EQ(version_2.get(), reg->active_version()); | 301 EXPECT_EQ(version_2.get(), reg->active_version()); |
| 299 } | 302 } |
| 300 | 303 |
| 301 // Test activation triggered by skipWaiting. | 304 // Test activation triggered by skipWaiting. |
| 302 TEST_F(ServiceWorkerActivationTest, SkipWaiting) { | 305 TEST_P(ServiceWorkerActivationTest, SkipWaiting) { |
| 303 scoped_refptr<ServiceWorkerRegistration> reg = registration(); | 306 scoped_refptr<ServiceWorkerRegistration> reg = registration(); |
| 304 scoped_refptr<ServiceWorkerVersion> version_1 = reg->active_version(); | 307 scoped_refptr<ServiceWorkerVersion> version_1 = reg->active_version(); |
| 305 scoped_refptr<ServiceWorkerVersion> version_2 = reg->waiting_version(); | 308 scoped_refptr<ServiceWorkerVersion> version_2 = reg->waiting_version(); |
| 306 | 309 |
| 307 // Finish the in-flight request. Since there is a controllee, | 310 // Finish the in-flight request. Since there is a controllee, |
| 308 // activation should not happen. | 311 // activation should not happen. |
| 309 version_1->FinishRequest(inflight_request_id(), true /* was_handled */, | 312 version_1->FinishRequest(inflight_request_id(), true /* was_handled */, |
| 310 base::Time::Now()); | 313 base::Time::Now()); |
| 311 base::RunLoop().RunUntilIdle(); | 314 base::RunLoop().RunUntilIdle(); |
| 312 EXPECT_EQ(version_1.get(), reg->active_version()); | 315 EXPECT_EQ(version_1.get(), reg->active_version()); |
| 313 | 316 |
| 314 // Call skipWaiting. Activation should happen. | 317 // Call skipWaiting. Activation should happen. |
| 315 version_2->OnSkipWaiting(77 /* dummy request_id */); | 318 version_2->OnSkipWaiting(77 /* dummy request_id */); |
| 316 base::RunLoop().RunUntilIdle(); | 319 base::RunLoop().RunUntilIdle(); |
| 317 EXPECT_EQ(version_2.get(), reg->active_version()); | 320 EXPECT_EQ(version_2.get(), reg->active_version()); |
| 318 } | 321 } |
| 319 | 322 |
| 320 // Test activation triggered by skipWaiting and finishing requests. | 323 // Test activation triggered by skipWaiting and finishing requests. |
| 321 TEST_F(ServiceWorkerActivationTest, SkipWaitingWithInflightRequest) { | 324 TEST_P(ServiceWorkerActivationTest, SkipWaitingWithInflightRequest) { |
| 322 scoped_refptr<ServiceWorkerRegistration> reg = registration(); | 325 scoped_refptr<ServiceWorkerRegistration> reg = registration(); |
| 323 scoped_refptr<ServiceWorkerVersion> version_1 = reg->active_version(); | 326 scoped_refptr<ServiceWorkerVersion> version_1 = reg->active_version(); |
| 324 scoped_refptr<ServiceWorkerVersion> version_2 = reg->waiting_version(); | 327 scoped_refptr<ServiceWorkerVersion> version_2 = reg->waiting_version(); |
| 325 | 328 |
| 326 // Set skip waiting flag. Since there is still an in-flight request, | 329 // Set skip waiting flag. Since there is still an in-flight request, |
| 327 // activation should not happen. | 330 // activation should not happen. |
| 328 version_2->OnSkipWaiting(77 /* dummy request_id */); | 331 version_2->OnSkipWaiting(77 /* dummy request_id */); |
| 329 base::RunLoop().RunUntilIdle(); | 332 base::RunLoop().RunUntilIdle(); |
| 330 EXPECT_EQ(version_1.get(), reg->active_version()); | 333 EXPECT_EQ(version_1.get(), reg->active_version()); |
| 331 | 334 |
| 332 // Finish the request. Activation should happen. | 335 // Finish the request. Activation should happen. |
| 333 version_1->FinishRequest(inflight_request_id(), true /* was_handled */, | 336 version_1->FinishRequest(inflight_request_id(), true /* was_handled */, |
| 334 base::Time::Now()); | 337 base::Time::Now()); |
| 335 base::RunLoop().RunUntilIdle(); | 338 base::RunLoop().RunUntilIdle(); |
| 336 EXPECT_EQ(version_2.get(), reg->active_version()); | 339 EXPECT_EQ(version_2.get(), reg->active_version()); |
| 337 } | 340 } |
| 338 | 341 |
| 342 INSTANTIATE_TEST_CASE_P(ServiceWorkerRegistrationTest, |
| 343 ServiceWorkerRegistrationTestP, |
| 344 testing::Bool()); |
| 345 |
| 346 INSTANTIATE_TEST_CASE_P(ServiceWorkerActivationTest, |
| 347 ServiceWorkerActivationTest, |
| 348 testing::Bool()); |
| 349 |
| 339 } // namespace content | 350 } // namespace content |
| OLD | NEW |