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 "base/bind.h" | 5 #include "base/bind.h" |
6 #include "base/callback.h" | 6 #include "base/callback.h" |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/run_loop.h" | 8 #include "base/run_loop.h" |
9 #include "content/browser/service_worker/embedded_worker_instance.h" | 9 #include "content/browser/service_worker/embedded_worker_instance.h" |
10 #include "content/browser/service_worker/embedded_worker_registry.h" | 10 #include "content/browser/service_worker/embedded_worker_registry.h" |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
269 base::RunLoop run_loop; | 269 base::RunLoop run_loop; |
270 BrowserThread::PostTask( | 270 BrowserThread::PostTask( |
271 BrowserThread::IO, | 271 BrowserThread::IO, |
272 FROM_HERE, | 272 FROM_HERE, |
273 base::Bind( | 273 base::Bind( |
274 &self::ActivateOnIOThread, this, run_loop.QuitClosure(), &status)); | 274 &self::ActivateOnIOThread, this, run_loop.QuitClosure(), &status)); |
275 run_loop.Run(); | 275 run_loop.Run(); |
276 ASSERT_EQ(expected_status, status); | 276 ASSERT_EQ(expected_status, status); |
277 } | 277 } |
278 | 278 |
279 void FetchOnRegisteredWorker(ServiceWorkerFetchEventResult* result, | 279 bool FetchOnRegisteredWorker(ServiceWorkerFetchEventResult* result, |
280 ServiceWorkerResponse* response) { | 280 ServiceWorkerResponse* response) { |
281 FetchResult fetch_result; | 281 FetchResult fetch_result; |
282 fetch_result.status = SERVICE_WORKER_ERROR_FAILED; | 282 fetch_result.status = SERVICE_WORKER_ERROR_FAILED; |
283 base::RunLoop fetch_run_loop; | 283 base::RunLoop fetch_run_loop; |
284 BrowserThread::PostTask(BrowserThread::IO, | 284 BrowserThread::PostTask(BrowserThread::IO, |
285 FROM_HERE, | 285 FROM_HERE, |
286 base::Bind(&self::FetchOnIOThread, | 286 base::Bind(&self::FetchOnIOThread, |
287 this, | 287 this, |
288 fetch_run_loop.QuitClosure(), | 288 fetch_run_loop.QuitClosure(), |
289 &fetch_result)); | 289 &fetch_result)); |
290 fetch_run_loop.Run(); | 290 fetch_run_loop.Run(); |
291 *result = fetch_result.result; | 291 *result = fetch_result.result; |
292 *response = fetch_result.response; | 292 *response = fetch_result.response; |
293 ASSERT_EQ(SERVICE_WORKER_OK, fetch_result.status); | 293 return fetch_result.status == SERVICE_WORKER_OK; |
294 } | 294 } |
295 | 295 |
296 void FetchTestHelper(const std::string& worker_url, | 296 void FetchTestHelper(const std::string& worker_url, |
297 ServiceWorkerFetchEventResult* result, | 297 ServiceWorkerFetchEventResult* result, |
298 ServiceWorkerResponse* response) { | 298 ServiceWorkerResponse* response) { |
299 RunOnIOThread( | 299 RunOnIOThread( |
300 base::Bind(&self::SetUpRegistrationOnIOThread, this, worker_url)); | 300 base::Bind(&self::SetUpRegistrationOnIOThread, this, worker_url)); |
301 | 301 |
302 FetchOnRegisteredWorker(result, response); | 302 FetchOnRegisteredWorker(result, response); |
303 } | 303 } |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 version_->StopWorker(CreateReceiver(BrowserThread::UI, done, result)); | 353 version_->StopWorker(CreateReceiver(BrowserThread::UI, done, result)); |
354 } | 354 } |
355 | 355 |
356 void SyncEventOnIOThread(const base::Closure& done, | 356 void SyncEventOnIOThread(const base::Closure& done, |
357 ServiceWorkerStatusCode* result) { | 357 ServiceWorkerStatusCode* result) { |
358 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 358 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
359 version_->DispatchSyncEvent( | 359 version_->DispatchSyncEvent( |
360 CreateReceiver(BrowserThread::UI, done, result)); | 360 CreateReceiver(BrowserThread::UI, done, result)); |
361 } | 361 } |
362 | 362 |
| 363 bool FireSyncEvent() { |
| 364 // Run the sync event. |
| 365 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
| 366 base::RunLoop sync_run_loop; |
| 367 BrowserThread::PostTask(BrowserThread::IO, |
| 368 FROM_HERE, |
| 369 base::Bind(&self::SyncEventOnIOThread, |
| 370 this, |
| 371 sync_run_loop.QuitClosure(), |
| 372 &status)); |
| 373 sync_run_loop.Run(); |
| 374 return status == SERVICE_WORKER_OK; |
| 375 } |
| 376 |
363 protected: | 377 protected: |
364 int64 next_registration_id_; | 378 int64 next_registration_id_; |
365 scoped_refptr<ServiceWorkerRegistration> registration_; | 379 scoped_refptr<ServiceWorkerRegistration> registration_; |
366 scoped_refptr<ServiceWorkerVersion> version_; | 380 scoped_refptr<ServiceWorkerVersion> version_; |
367 }; | 381 }; |
368 | 382 |
369 IN_PROC_BROWSER_TEST_F(EmbeddedWorkerBrowserTest, StartAndStop) { | 383 IN_PROC_BROWSER_TEST_F(EmbeddedWorkerBrowserTest, StartAndStop) { |
370 // Start a worker and wait until OnStarted() is called. | 384 // Start a worker and wait until OnStarted() is called. |
371 base::RunLoop start_run_loop; | 385 base::RunLoop start_run_loop; |
372 done_closure_ = start_run_loop.QuitClosure(); | 386 done_closure_ = start_run_loop.QuitClosure(); |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
474 ASSERT_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, result); | 488 ASSERT_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, result); |
475 } | 489 } |
476 | 490 |
477 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, FetchEvent_Rejected) { | 491 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, FetchEvent_Rejected) { |
478 ServiceWorkerFetchEventResult result; | 492 ServiceWorkerFetchEventResult result; |
479 ServiceWorkerResponse response; | 493 ServiceWorkerResponse response; |
480 FetchTestHelper("/service_worker/fetch_event_error.js", &result, &response); | 494 FetchTestHelper("/service_worker/fetch_event_error.js", &result, &response); |
481 ASSERT_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, result); | 495 ASSERT_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, result); |
482 } | 496 } |
483 | 497 |
484 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, SyncEventHandled) { | 498 // Show that sync works and that the requestSyncEvents function appropriately |
485 RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, this, | 499 // controls sync events. |
486 "/service_worker/sync.js")); | 500 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, |
| 501 SyncEventAndRequestFunction) { |
| 502 RunOnIOThread(base::Bind( |
| 503 &self::SetUpRegistrationOnIOThread, this, "/service_worker/sync.js")); |
487 ServiceWorkerFetchEventResult result; | 504 ServiceWorkerFetchEventResult result; |
488 ServiceWorkerResponse response; | 505 ServiceWorkerResponse response; |
489 | 506 |
490 // Should 404 before sync event. | 507 // Fetch will return 200 if the sync event was fired, else 404. |
491 FetchOnRegisteredWorker(&result, &response); | 508 // Each fetch event will cause requestSyncEvent to be called with |
| 509 // different parameters, as described in the comments below. |
| 510 // The simpler ways to do this (e.g., putting the command in the URL) |
| 511 // don't work because at the time of writing SWs don't actually pass |
| 512 // the URL to the fetch event. |
| 513 |
| 514 EXPECT_FALSE(FireSyncEvent()); // Should not fire, next response 404. |
| 515 EXPECT_TRUE(FetchOnRegisteredWorker(&result, |
| 516 &response)); // Calls requestSyncEvents() |
492 EXPECT_EQ(404, response.status_code); | 517 EXPECT_EQ(404, response.status_code); |
493 | 518 |
494 // Run the sync event. | 519 EXPECT_FALSE(FireSyncEvent()); // Should not fire, next response 404. |
495 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 520 EXPECT_TRUE( |
496 base::RunLoop sync_run_loop; | 521 FetchOnRegisteredWorker(&result, |
497 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 522 &response)); // Calls requestSyncEvents(true) |
498 base::Bind(&self::SyncEventOnIOThread, this, | 523 EXPECT_EQ(404, response.status_code); |
499 sync_run_loop.QuitClosure(), | |
500 &status)); | |
501 sync_run_loop.Run(); | |
502 ASSERT_EQ(SERVICE_WORKER_OK, status); | |
503 | 524 |
504 // Should 200 after sync event. | 525 EXPECT_TRUE(FireSyncEvent()); // Should fire, next response 200. |
505 FetchOnRegisteredWorker(&result, &response); | 526 EXPECT_TRUE(FetchOnRegisteredWorker( |
| 527 &result, &response)); // Calls requestSyncEvents(false) |
506 EXPECT_EQ(200, response.status_code); | 528 EXPECT_EQ(200, response.status_code); |
| 529 |
| 530 EXPECT_FALSE(FireSyncEvent()); // Should fire, next response 404. |
| 531 EXPECT_TRUE(FetchOnRegisteredWorker(&result, &response)); |
| 532 EXPECT_EQ(404, response.status_code); |
507 } | 533 } |
508 | 534 |
509 class ServiceWorkerBlackBoxBrowserTest : public ServiceWorkerBrowserTest { | 535 class ServiceWorkerBlackBoxBrowserTest : public ServiceWorkerBrowserTest { |
510 public: | 536 public: |
511 typedef ServiceWorkerBlackBoxBrowserTest self; | 537 typedef ServiceWorkerBlackBoxBrowserTest self; |
512 | 538 |
513 static void ExpectResultAndRun(bool expected, | 539 static void ExpectResultAndRun(bool expected, |
514 const base::Closure& continuation, | 540 const base::Closure& continuation, |
515 bool actual) { | 541 bool actual) { |
516 EXPECT_EQ(expected, actual); | 542 EXPECT_EQ(expected, actual); |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
592 base::Bind(&ServiceWorkerBlackBoxBrowserTest::FindRegistrationOnIO, | 618 base::Bind(&ServiceWorkerBlackBoxBrowserTest::FindRegistrationOnIO, |
593 this, | 619 this, |
594 embedded_test_server()->GetURL("/service_worker/empty.html"), | 620 embedded_test_server()->GetURL("/service_worker/empty.html"), |
595 &status, | 621 &status, |
596 &script_url)); | 622 &script_url)); |
597 EXPECT_EQ(SERVICE_WORKER_ERROR_NOT_FOUND, status); | 623 EXPECT_EQ(SERVICE_WORKER_ERROR_NOT_FOUND, status); |
598 } | 624 } |
599 } | 625 } |
600 | 626 |
601 } // namespace content | 627 } // namespace content |
OLD | NEW |