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 "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "content/browser/fileapi/chrome_blob_storage_context.h" | 10 #include "content/browser/fileapi/chrome_blob_storage_context.h" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 scoped_ptr<storage::BlobDataHandle> blob_data_handle; | 55 scoped_ptr<storage::BlobDataHandle> blob_data_handle; |
56 }; | 56 }; |
57 | 57 |
58 void RunAndQuit(const base::Closure& closure, | 58 void RunAndQuit(const base::Closure& closure, |
59 const base::Closure& quit, | 59 const base::Closure& quit, |
60 base::MessageLoopProxy* original_message_loop) { | 60 base::MessageLoopProxy* original_message_loop) { |
61 closure.Run(); | 61 closure.Run(); |
62 original_message_loop->PostTask(FROM_HERE, quit); | 62 original_message_loop->PostTask(FROM_HERE, quit); |
63 } | 63 } |
64 | 64 |
65 void RunOnIOThread(const base::Closure& closure) { | 65 void RunOnIOThreadWithDelay(const base::Closure& closure, |
| 66 base::TimeDelta delay) { |
66 base::RunLoop run_loop; | 67 base::RunLoop run_loop; |
67 BrowserThread::PostTask( | 68 BrowserThread::PostDelayedTask( |
68 BrowserThread::IO, FROM_HERE, | 69 BrowserThread::IO, FROM_HERE, |
69 base::Bind(&RunAndQuit, closure, run_loop.QuitClosure(), | 70 base::Bind(&RunAndQuit, closure, run_loop.QuitClosure(), |
70 base::MessageLoopProxy::current())); | 71 base::MessageLoopProxy::current()), |
| 72 delay); |
71 run_loop.Run(); | 73 run_loop.Run(); |
72 } | 74 } |
73 | 75 |
| 76 void RunOnIOThread(const base::Closure& closure) { |
| 77 RunOnIOThreadWithDelay(closure, base::TimeDelta()); |
| 78 } |
| 79 |
74 void RunOnIOThread( | 80 void RunOnIOThread( |
75 const base::Callback<void(const base::Closure& continuation)>& closure) { | 81 const base::Callback<void(const base::Closure& continuation)>& closure) { |
76 base::RunLoop run_loop; | 82 base::RunLoop run_loop; |
77 base::Closure quit_on_original_thread = | 83 base::Closure quit_on_original_thread = |
78 base::Bind(base::IgnoreResult(&base::MessageLoopProxy::PostTask), | 84 base::Bind(base::IgnoreResult(&base::MessageLoopProxy::PostTask), |
79 base::MessageLoopProxy::current().get(), | 85 base::MessageLoopProxy::current().get(), |
80 FROM_HERE, | 86 FROM_HERE, |
81 run_loop.QuitClosure()); | 87 run_loop.QuitClosure()); |
82 BrowserThread::PostTask(BrowserThread::IO, | 88 BrowserThread::PostTask(BrowserThread::IO, |
83 FROM_HERE, | 89 FROM_HERE, |
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
515 wrapper()->context()->storage()->NewRegistrationId(), | 521 wrapper()->context()->storage()->NewRegistrationId(), |
516 wrapper()->context()->AsWeakPtr()); | 522 wrapper()->context()->AsWeakPtr()); |
517 version_ = new ServiceWorkerVersion( | 523 version_ = new ServiceWorkerVersion( |
518 registration_.get(), | 524 registration_.get(), |
519 embedded_test_server()->GetURL(worker_url), | 525 embedded_test_server()->GetURL(worker_url), |
520 wrapper()->context()->storage()->NewVersionId(), | 526 wrapper()->context()->storage()->NewVersionId(), |
521 wrapper()->context()->AsWeakPtr()); | 527 wrapper()->context()->AsWeakPtr()); |
522 AssociateRendererProcessToPattern(pattern); | 528 AssociateRendererProcessToPattern(pattern); |
523 } | 529 } |
524 | 530 |
| 531 void TimeoutWorkerOnIOThread() { |
| 532 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 533 version_->PingWorker(); |
| 534 version_->OnPingTimeout(); |
| 535 } |
| 536 |
525 void StartOnIOThread(const base::Closure& done, | 537 void StartOnIOThread(const base::Closure& done, |
526 ServiceWorkerStatusCode* result) { | 538 ServiceWorkerStatusCode* result) { |
527 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 539 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
528 version_->StartWorker(CreateReceiver(BrowserThread::UI, done, result)); | 540 version_->StartWorker(CreateReceiver(BrowserThread::UI, done, result)); |
529 } | 541 } |
530 | 542 |
531 void InstallOnIOThread(const base::Closure& done, | 543 void InstallOnIOThread(const base::Closure& done, |
532 ServiceWorkerStatusCode* result) { | 544 ServiceWorkerStatusCode* result) { |
533 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 545 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
534 version_->SetStatus(ServiceWorkerVersion::INSTALLING); | 546 version_->SetStatus(ServiceWorkerVersion::INSTALLING); |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
692 ActivateTestHelper("/service_worker/worker_activate_rejected.js", | 704 ActivateTestHelper("/service_worker/worker_activate_rejected.js", |
693 SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED); | 705 SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED); |
694 } | 706 } |
695 | 707 |
696 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, | 708 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, |
697 InstallWithWaitUntil_Rejected) { | 709 InstallWithWaitUntil_Rejected) { |
698 InstallTestHelper("/service_worker/worker_install_rejected.js", | 710 InstallTestHelper("/service_worker/worker_install_rejected.js", |
699 SERVICE_WORKER_ERROR_INSTALL_WORKER_FAILED); | 711 SERVICE_WORKER_ERROR_INSTALL_WORKER_FAILED); |
700 } | 712 } |
701 | 713 |
| 714 class WaitForLoaded : public EmbeddedWorkerInstance::Listener { |
| 715 public: |
| 716 WaitForLoaded(const base::Closure& quit) : quit_(quit) {} |
| 717 |
| 718 void OnScriptLoaded() override { |
| 719 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, quit_); |
| 720 } |
| 721 bool OnMessageReceived(const IPC::Message& message) override { return false; } |
| 722 |
| 723 private: |
| 724 base::Closure quit_; |
| 725 }; |
| 726 |
| 727 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, TimeoutStartingWorker) { |
| 728 RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, this, |
| 729 "/service_worker/while_true_worker.js")); |
| 730 |
| 731 // Start a worker, waiting until the script is loaded. |
| 732 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
| 733 base::RunLoop start_run_loop; |
| 734 base::RunLoop load_run_loop; |
| 735 WaitForLoaded wait_for_load(load_run_loop.QuitClosure()); |
| 736 version_->embedded_worker()->AddListener(&wait_for_load); |
| 737 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 738 base::Bind(&self::StartOnIOThread, this, |
| 739 start_run_loop.QuitClosure(), &status)); |
| 740 load_run_loop.Run(); |
| 741 version_->embedded_worker()->RemoveListener(&wait_for_load); |
| 742 |
| 743 // The script has loaded but start has not completed yet. |
| 744 ASSERT_EQ(SERVICE_WORKER_ERROR_FAILED, status); |
| 745 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); |
| 746 |
| 747 // Simulate execution timeout. Use a delay to prevent killing the worker |
| 748 // before it's started execution. |
| 749 EXPECT_TRUE(version_->ping_worker_timer_.IsRunning()); |
| 750 RunOnIOThreadWithDelay(base::Bind(&self::TimeoutWorkerOnIOThread, this), |
| 751 base::TimeDelta::FromMilliseconds(100)); |
| 752 start_run_loop.Run(); |
| 753 |
| 754 EXPECT_EQ(SERVICE_WORKER_ERROR_START_WORKER_FAILED, status); |
| 755 } |
| 756 |
| 757 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, TimeoutWorkerInEvent) { |
| 758 RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, this, |
| 759 "/service_worker/while_true_in_install_worker.js")); |
| 760 |
| 761 // Start a worker. |
| 762 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
| 763 base::RunLoop start_run_loop; |
| 764 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 765 base::Bind(&self::StartOnIOThread, this, |
| 766 start_run_loop.QuitClosure(), &status)); |
| 767 start_run_loop.Run(); |
| 768 ASSERT_EQ(SERVICE_WORKER_OK, status); |
| 769 |
| 770 // Dispatch an event. |
| 771 base::RunLoop install_run_loop; |
| 772 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 773 base::Bind(&self::InstallOnIOThread, this, |
| 774 install_run_loop.QuitClosure(), &status)); |
| 775 |
| 776 // Simulate execution timeout. Use a delay to prevent killing the worker |
| 777 // before it's started execution. |
| 778 EXPECT_TRUE(version_->ping_worker_timer_.IsRunning()); |
| 779 RunOnIOThreadWithDelay(base::Bind(&self::TimeoutWorkerOnIOThread, this), |
| 780 base::TimeDelta::FromMilliseconds(100)); |
| 781 install_run_loop.Run(); |
| 782 |
| 783 EXPECT_EQ(SERVICE_WORKER_ERROR_INSTALL_WORKER_FAILED, status); |
| 784 } |
| 785 |
702 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, FetchEvent_Response) { | 786 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, FetchEvent_Response) { |
703 ServiceWorkerFetchEventResult result; | 787 ServiceWorkerFetchEventResult result; |
704 ServiceWorkerResponse response; | 788 ServiceWorkerResponse response; |
705 scoped_ptr<storage::BlobDataHandle> blob_data_handle; | 789 scoped_ptr<storage::BlobDataHandle> blob_data_handle; |
706 FetchTestHelper("/service_worker/fetch_event.js", | 790 FetchTestHelper("/service_worker/fetch_event.js", |
707 &result, &response, &blob_data_handle); | 791 &result, &response, &blob_data_handle); |
708 ASSERT_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, result); | 792 ASSERT_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, result); |
709 EXPECT_EQ(301, response.status_code); | 793 EXPECT_EQ(301, response.status_code); |
710 EXPECT_EQ("Moved Permanently", response.status_text); | 794 EXPECT_EQ("Moved Permanently", response.status_text); |
711 ServiceWorkerHeaderMap expected_headers; | 795 ServiceWorkerHeaderMap expected_headers; |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1040 const base::string16 kOKTitle2(base::ASCIIToUTF16("OK_2")); | 1124 const base::string16 kOKTitle2(base::ASCIIToUTF16("OK_2")); |
1041 const base::string16 kFailTitle2(base::ASCIIToUTF16("FAIL_2")); | 1125 const base::string16 kFailTitle2(base::ASCIIToUTF16("FAIL_2")); |
1042 content::TitleWatcher title_watcher2(shell()->web_contents(), kOKTitle2); | 1126 content::TitleWatcher title_watcher2(shell()->web_contents(), kOKTitle2); |
1043 title_watcher2.AlsoWaitForTitle(kFailTitle2); | 1127 title_watcher2.AlsoWaitForTitle(kFailTitle2); |
1044 | 1128 |
1045 NavigateToURL(shell(), embedded_test_server()->GetURL(kConfirmPageUrl)); | 1129 NavigateToURL(shell(), embedded_test_server()->GetURL(kConfirmPageUrl)); |
1046 EXPECT_EQ(kOKTitle2, title_watcher2.WaitAndGetTitle()); | 1130 EXPECT_EQ(kOKTitle2, title_watcher2.WaitAndGetTitle()); |
1047 } | 1131 } |
1048 | 1132 |
1049 } // namespace content | 1133 } // namespace content |
OLD | NEW |