| 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/single_thread_task_runner.h" | 9 #include "base/single_thread_task_runner.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 *body = std::string(data->items()[0]->bytes(), data->items()[0]->length()); | 164 *body = std::string(data->items()[0]->bytes(), data->items()[0]->length()); |
| 165 } | 165 } |
| 166 | 166 |
| 167 void ExpectResultAndRun(bool expected, | 167 void ExpectResultAndRun(bool expected, |
| 168 const base::Closure& continuation, | 168 const base::Closure& continuation, |
| 169 bool actual) { | 169 bool actual) { |
| 170 EXPECT_EQ(expected, actual); | 170 EXPECT_EQ(expected, actual); |
| 171 continuation.Run(); | 171 continuation.Run(); |
| 172 } | 172 } |
| 173 | 173 |
| 174 SyncRegistrationPtr CreateOneShotSyncRegistration(const std::string& tag) { | |
| 175 SyncRegistrationPtr registration = SyncRegistration::New(); | |
| 176 registration->tag = tag; | |
| 177 return registration.Pass(); | |
| 178 } | |
| 179 | |
| 180 class WorkerActivatedObserver | 174 class WorkerActivatedObserver |
| 181 : public ServiceWorkerContextObserver, | 175 : public ServiceWorkerContextObserver, |
| 182 public base::RefCountedThreadSafe<WorkerActivatedObserver> { | 176 public base::RefCountedThreadSafe<WorkerActivatedObserver> { |
| 183 public: | 177 public: |
| 184 explicit WorkerActivatedObserver(ServiceWorkerContextWrapper* context) | 178 explicit WorkerActivatedObserver(ServiceWorkerContextWrapper* context) |
| 185 : context_(context) {} | 179 : context_(context) {} |
| 186 void Init() { | 180 void Init() { |
| 187 RunOnIOThread(base::Bind(&WorkerActivatedObserver::InitOnIOThread, this)); | 181 RunOnIOThread(base::Bind(&WorkerActivatedObserver::InitOnIOThread, this)); |
| 188 } | 182 } |
| 189 // ServiceWorkerContextObserver overrides. | 183 // ServiceWorkerContextObserver overrides. |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 533 base::RunLoop run_loop; | 527 base::RunLoop run_loop; |
| 534 BrowserThread::PostTask( | 528 BrowserThread::PostTask( |
| 535 BrowserThread::IO, | 529 BrowserThread::IO, |
| 536 FROM_HERE, | 530 FROM_HERE, |
| 537 base::Bind( | 531 base::Bind( |
| 538 &self::ActivateOnIOThread, this, run_loop.QuitClosure(), &status)); | 532 &self::ActivateOnIOThread, this, run_loop.QuitClosure(), &status)); |
| 539 run_loop.Run(); | 533 run_loop.Run(); |
| 540 ASSERT_EQ(expected_status, status); | 534 ASSERT_EQ(expected_status, status); |
| 541 } | 535 } |
| 542 | 536 |
| 543 base::string16 RunSyncTestWithConsoleOutput( | |
| 544 const std::string& worker_url, | |
| 545 ServiceWorkerStatusCode expected_status) { | |
| 546 RunOnIOThread( | |
| 547 base::Bind(&self::SetUpRegistrationOnIOThread, this, worker_url)); | |
| 548 return SyncOnRegisteredWorkerWithConsoleOutput(expected_status); | |
| 549 } | |
| 550 | |
| 551 void SyncOnRegisteredWorker(ServiceWorkerStatusCode expected_status) { | |
| 552 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | |
| 553 base::RunLoop sync_run_loop; | |
| 554 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | |
| 555 base::Bind(&self::SyncEventOnIOThread, this, | |
| 556 sync_run_loop.QuitClosure(), &status)); | |
| 557 sync_run_loop.Run(); | |
| 558 ASSERT_EQ(expected_status, status); | |
| 559 } | |
| 560 | |
| 561 base::string16 SyncOnRegisteredWorkerWithConsoleOutput( | |
| 562 ServiceWorkerStatusCode expected_status) { | |
| 563 ConsoleListener console_listener; | |
| 564 version_->embedded_worker()->AddListener(&console_listener); | |
| 565 | |
| 566 SyncOnRegisteredWorker(expected_status); | |
| 567 | |
| 568 console_listener.WaitForConsoleMessages(1); | |
| 569 base::string16 console_output = console_listener.messages()[0]; | |
| 570 version_->embedded_worker()->RemoveListener(&console_listener); | |
| 571 return console_output; | |
| 572 } | |
| 573 | |
| 574 void FetchOnRegisteredWorker( | 537 void FetchOnRegisteredWorker( |
| 575 ServiceWorkerFetchEventResult* result, | 538 ServiceWorkerFetchEventResult* result, |
| 576 ServiceWorkerResponse* response, | 539 ServiceWorkerResponse* response, |
| 577 scoped_ptr<storage::BlobDataHandle>* blob_data_handle) { | 540 scoped_ptr<storage::BlobDataHandle>* blob_data_handle) { |
| 578 blob_context_ = ChromeBlobStorageContext::GetFor( | 541 blob_context_ = ChromeBlobStorageContext::GetFor( |
| 579 shell()->web_contents()->GetBrowserContext()); | 542 shell()->web_contents()->GetBrowserContext()); |
| 580 bool prepare_result = false; | 543 bool prepare_result = false; |
| 581 FetchResult fetch_result; | 544 FetchResult fetch_result; |
| 582 fetch_result.status = SERVICE_WORKER_ERROR_FAILED; | 545 fetch_result.status = SERVICE_WORKER_ERROR_FAILED; |
| 583 base::RunLoop fetch_run_loop; | 546 base::RunLoop fetch_run_loop; |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 783 CreateResponseReceiver( | 746 CreateResponseReceiver( |
| 784 BrowserThread::UI, done, blob_context_.get(), result)); | 747 BrowserThread::UI, done, blob_context_.get(), result)); |
| 785 } | 748 } |
| 786 | 749 |
| 787 void StopOnIOThread(const base::Closure& done, | 750 void StopOnIOThread(const base::Closure& done, |
| 788 ServiceWorkerStatusCode* result) { | 751 ServiceWorkerStatusCode* result) { |
| 789 ASSERT_TRUE(version_.get()); | 752 ASSERT_TRUE(version_.get()); |
| 790 version_->StopWorker(CreateReceiver(BrowserThread::UI, done, result)); | 753 version_->StopWorker(CreateReceiver(BrowserThread::UI, done, result)); |
| 791 } | 754 } |
| 792 | 755 |
| 793 void SyncEventOnIOThread(const base::Closure& done, | |
| 794 ServiceWorkerStatusCode* result) { | |
| 795 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
| 796 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | |
| 797 version_->DispatchSyncEvent( | |
| 798 CreateOneShotSyncRegistration(""), | |
| 799 CreateReceiver(BrowserThread::UI, done, result)); | |
| 800 } | |
| 801 | |
| 802 protected: | 756 protected: |
| 803 scoped_refptr<ServiceWorkerRegistration> registration_; | 757 scoped_refptr<ServiceWorkerRegistration> registration_; |
| 804 scoped_refptr<ServiceWorkerVersion> version_; | 758 scoped_refptr<ServiceWorkerVersion> version_; |
| 805 scoped_refptr<ChromeBlobStorageContext> blob_context_; | 759 scoped_refptr<ChromeBlobStorageContext> blob_context_; |
| 806 }; | 760 }; |
| 807 | 761 |
| 808 IN_PROC_BROWSER_TEST_F(EmbeddedWorkerBrowserTest, StartAndStop) { | 762 IN_PROC_BROWSER_TEST_F(EmbeddedWorkerBrowserTest, StartAndStop) { |
| 809 // Start a worker and wait until OnStarted() is called. | 763 // Start a worker and wait until OnStarted() is called. |
| 810 base::RunLoop start_run_loop; | 764 base::RunLoop start_run_loop; |
| 811 done_closure_ = start_run_loop.QuitClosure(); | 765 done_closure_ = start_run_loop.QuitClosure(); |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1110 console_listener.messages()[0].find(expected1)); | 1064 console_listener.messages()[0].find(expected1)); |
| 1111 ASSERT_EQ(0u, console_listener.messages()[1].find(expected2)); | 1065 ASSERT_EQ(0u, console_listener.messages()[1].find(expected2)); |
| 1112 version_->embedded_worker()->RemoveListener(&console_listener); | 1066 version_->embedded_worker()->RemoveListener(&console_listener); |
| 1113 | 1067 |
| 1114 ASSERT_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, result); | 1068 ASSERT_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, result); |
| 1115 EXPECT_EQ(0, response.status_code); | 1069 EXPECT_EQ(0, response.status_code); |
| 1116 | 1070 |
| 1117 ASSERT_FALSE(blob_data_handle); | 1071 ASSERT_FALSE(blob_data_handle); |
| 1118 } | 1072 } |
| 1119 | 1073 |
| 1120 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, SyncEventHandled) { | |
| 1121 RunOnIOThread(base::Bind( | |
| 1122 &self::SetUpRegistrationOnIOThread, this, "/service_worker/sync.js")); | |
| 1123 ServiceWorkerFetchEventResult result; | |
| 1124 ServiceWorkerResponse response; | |
| 1125 scoped_ptr<storage::BlobDataHandle> blob_data_handle; | |
| 1126 // Should 404 before sync event. | |
| 1127 FetchOnRegisteredWorker(&result, &response, &blob_data_handle); | |
| 1128 EXPECT_EQ(404, response.status_code); | |
| 1129 | |
| 1130 // Run the sync event. | |
| 1131 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | |
| 1132 base::RunLoop sync_run_loop; | |
| 1133 BrowserThread::PostTask(BrowserThread::IO, | |
| 1134 FROM_HERE, | |
| 1135 base::Bind(&self::SyncEventOnIOThread, | |
| 1136 this, | |
| 1137 sync_run_loop.QuitClosure(), | |
| 1138 &status)); | |
| 1139 sync_run_loop.Run(); | |
| 1140 ASSERT_EQ(SERVICE_WORKER_OK, status); | |
| 1141 | |
| 1142 // Should 200 after sync event. | |
| 1143 FetchOnRegisteredWorker(&result, &response, &blob_data_handle); | |
| 1144 EXPECT_EQ(200, response.status_code); | |
| 1145 } | |
| 1146 | |
| 1147 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, SyncEventInterface) { | |
| 1148 // Verify that the fired sync event has the correct interface. | |
| 1149 // The js event handler will console.log the event properties. | |
| 1150 base::string16 console_output = RunSyncTestWithConsoleOutput( | |
| 1151 "/background_sync/sync_event_interface.js", SERVICE_WORKER_OK); | |
| 1152 | |
| 1153 EXPECT_FALSE(console_output.empty()); | |
| 1154 | |
| 1155 // Console output is a pipe-delimited string, as: | |
| 1156 // <event prototype>|<typeof waitUntil> | |
| 1157 std::vector<base::string16> event_properties = | |
| 1158 base::SplitString(console_output, base::string16(1, '|'), | |
| 1159 base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); | |
| 1160 | |
| 1161 const base::string16::size_type num_properties = 2; | |
| 1162 const base::string16 event_type = base::ASCIIToUTF16("SyncEvent"); | |
| 1163 const base::string16 wait_until_type = base::ASCIIToUTF16("function"); | |
| 1164 EXPECT_EQ(num_properties, event_properties.size()); | |
| 1165 EXPECT_EQ(event_type, event_properties[0]); | |
| 1166 EXPECT_EQ(wait_until_type, event_properties[1]); | |
| 1167 } | |
| 1168 | |
| 1169 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, | |
| 1170 SyncEventWaitUntil_Fulfilled) { | |
| 1171 base::string16 console_output = RunSyncTestWithConsoleOutput( | |
| 1172 "/background_sync/sync_event_fulfilled.js", SERVICE_WORKER_OK); | |
| 1173 | |
| 1174 // Verify that the event.waitUntil function resolved the promise. If so, | |
| 1175 // the js event handler will console.log the expected output. | |
| 1176 const base::string16 expected = base::ASCIIToUTF16("Fulfilling onsync event"); | |
| 1177 EXPECT_EQ(expected, console_output); | |
| 1178 } | |
| 1179 | |
| 1180 // https://crbug.com/504202 | |
| 1181 #if defined(THREAD_SANITIZER) | |
| 1182 #define MAYBE_SyncEventWaitUntil_Rejected DISABLED_SyncEventWaitUntil_Rejected | |
| 1183 #else | |
| 1184 #define MAYBE_SyncEventWaitUntil_Rejected SyncEventWaitUntil_Rejected | |
| 1185 #endif | |
| 1186 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, | |
| 1187 MAYBE_SyncEventWaitUntil_Rejected) { | |
| 1188 base::string16 console_output = RunSyncTestWithConsoleOutput( | |
| 1189 "/background_sync/sync_event_rejected.js", | |
| 1190 SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED); | |
| 1191 | |
| 1192 // Verify that the event.waitUntil function rejected the promise. If so, | |
| 1193 // the js event handler will console.log the expected output. | |
| 1194 const base::string16 expected = base::ASCIIToUTF16("Rejecting onsync event"); | |
| 1195 EXPECT_EQ(expected, console_output); | |
| 1196 } | |
| 1197 | |
| 1198 IN_PROC_BROWSER_TEST_F(ServiceWorkerBrowserTest, Reload) { | 1074 IN_PROC_BROWSER_TEST_F(ServiceWorkerBrowserTest, Reload) { |
| 1199 const char kPageUrl[] = "/service_worker/reload.html"; | 1075 const char kPageUrl[] = "/service_worker/reload.html"; |
| 1200 const char kWorkerUrl[] = "/service_worker/fetch_event_reload.js"; | 1076 const char kWorkerUrl[] = "/service_worker/fetch_event_reload.js"; |
| 1201 scoped_refptr<WorkerActivatedObserver> observer = | 1077 scoped_refptr<WorkerActivatedObserver> observer = |
| 1202 new WorkerActivatedObserver(wrapper()); | 1078 new WorkerActivatedObserver(wrapper()); |
| 1203 observer->Init(); | 1079 observer->Init(); |
| 1204 public_context()->RegisterServiceWorker( | 1080 public_context()->RegisterServiceWorker( |
| 1205 embedded_test_server()->GetURL(kPageUrl), | 1081 embedded_test_server()->GetURL(kPageUrl), |
| 1206 embedded_test_server()->GetURL(kWorkerUrl), | 1082 embedded_test_server()->GetURL(kWorkerUrl), |
| 1207 base::Bind(&ExpectResultAndRun, true, base::Bind(&base::DoNothing))); | 1083 base::Bind(&ExpectResultAndRun, true, base::Bind(&base::DoNothing))); |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1528 ASSERT_EQ(SERVICE_WORKER_OK, status); | 1404 ASSERT_EQ(SERVICE_WORKER_OK, status); |
| 1529 // Stop the worker. | 1405 // Stop the worker. |
| 1530 StopWorker(SERVICE_WORKER_OK); | 1406 StopWorker(SERVICE_WORKER_OK); |
| 1531 // Restart the worker. | 1407 // Restart the worker. |
| 1532 StartWorker(SERVICE_WORKER_OK); | 1408 StartWorker(SERVICE_WORKER_OK); |
| 1533 // Stop the worker. | 1409 // Stop the worker. |
| 1534 StopWorker(SERVICE_WORKER_OK); | 1410 StopWorker(SERVICE_WORKER_OK); |
| 1535 } | 1411 } |
| 1536 | 1412 |
| 1537 } // namespace content | 1413 } // namespace content |
| OLD | NEW |