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 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 | 334 |
341 void AssociateRendererProcessToPattern(const GURL& pattern) { | 335 void AssociateRendererProcessToPattern(const GURL& pattern) { |
342 wrapper_->process_manager()->AddProcessReferenceToPattern( | 336 wrapper_->process_manager()->AddProcessReferenceToPattern( |
343 pattern, shell()->web_contents()->GetRenderProcessHost()->GetID()); | 337 pattern, shell()->web_contents()->GetRenderProcessHost()->GetID()); |
344 } | 338 } |
345 | 339 |
346 private: | 340 private: |
347 scoped_refptr<ServiceWorkerContextWrapper> wrapper_; | 341 scoped_refptr<ServiceWorkerContextWrapper> wrapper_; |
348 }; | 342 }; |
349 | 343 |
350 class EmbeddedWorkerBrowserTest : public ServiceWorkerBrowserTest, | |
351 public EmbeddedWorkerInstance::Listener { | |
352 public: | |
353 using self = EmbeddedWorkerBrowserTest; | |
354 | |
355 EmbeddedWorkerBrowserTest() | |
356 : last_worker_status_(EmbeddedWorkerInstance::STOPPED) {} | |
357 ~EmbeddedWorkerBrowserTest() override {} | |
358 | |
359 void TearDownOnIOThread() override { | |
360 if (worker_) { | |
361 worker_->RemoveListener(this); | |
362 if (worker_->status() == EmbeddedWorkerInstance::STARTING || | |
363 worker_->status() == EmbeddedWorkerInstance::RUNNING) { | |
364 worker_->Stop(); | |
365 } | |
366 worker_.reset(); | |
367 } | |
368 } | |
369 | |
370 void SetUpCommandLine(base::CommandLine* command_line) override { | |
371 ServiceWorkerBrowserTest::SetUpCommandLine(command_line); | |
372 | |
373 // Code caching requires a bit more infrastructure that we don't care | |
374 // about in this test. | |
375 command_line->AppendSwitchASCII(switches::kV8CacheOptions, "none"); | |
376 } | |
377 | |
378 void StartOnIOThread() { | |
379 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
380 worker_ = wrapper()->context()->embedded_worker_registry()->CreateWorker(); | |
381 EXPECT_EQ(EmbeddedWorkerInstance::STOPPED, worker_->status()); | |
382 worker_->AddListener(this); | |
383 | |
384 const int64 service_worker_version_id = 33L; | |
385 const GURL pattern = embedded_test_server()->GetURL("/"); | |
386 const GURL script_url = embedded_test_server()->GetURL( | |
387 "/service_worker/worker.js"); | |
388 AssociateRendererProcessToPattern(pattern); | |
389 int process_id = shell()->web_contents()->GetRenderProcessHost()->GetID(); | |
390 wrapper()->process_manager()->AddProcessReferenceToPattern( | |
391 pattern, process_id); | |
392 worker_->Start( | |
393 service_worker_version_id, | |
394 pattern, | |
395 script_url, | |
396 base::Bind(&EmbeddedWorkerBrowserTest::StartOnIOThread2, this)); | |
397 } | |
398 | |
399 void StartOnIOThread2(ServiceWorkerStatusCode status) { | |
400 last_worker_status_ = worker_->status(); | |
401 EXPECT_EQ(SERVICE_WORKER_OK, status); | |
402 EXPECT_EQ(EmbeddedWorkerInstance::STARTING, last_worker_status_); | |
403 | |
404 if (status != SERVICE_WORKER_OK && !done_closure_.is_null()) | |
405 done_closure_.Run(); | |
406 } | |
407 | |
408 void StopOnIOThread() { | |
409 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
410 EXPECT_EQ(EmbeddedWorkerInstance::RUNNING, worker_->status()); | |
411 | |
412 ServiceWorkerStatusCode status = worker_->Stop(); | |
413 | |
414 last_worker_status_ = worker_->status(); | |
415 EXPECT_EQ(SERVICE_WORKER_OK, status); | |
416 EXPECT_EQ(EmbeddedWorkerInstance::STOPPING, last_worker_status_); | |
417 | |
418 if (status != SERVICE_WORKER_OK && !done_closure_.is_null()) | |
419 done_closure_.Run(); | |
420 } | |
421 | |
422 protected: | |
423 // EmbeddedWorkerInstance::Observer overrides: | |
424 void OnStarted() override { | |
425 ASSERT_TRUE(worker_ != NULL); | |
426 ASSERT_FALSE(done_closure_.is_null()); | |
427 last_worker_status_ = worker_->status(); | |
428 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done_closure_); | |
429 } | |
430 void OnStopped(EmbeddedWorkerInstance::Status old_status) override { | |
431 ASSERT_TRUE(worker_ != NULL); | |
432 ASSERT_FALSE(done_closure_.is_null()); | |
433 last_worker_status_ = worker_->status(); | |
434 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done_closure_); | |
435 } | |
436 void OnReportException(const base::string16& error_message, | |
437 int line_number, | |
438 int column_number, | |
439 const GURL& source_url) override {} | |
440 void OnReportConsoleMessage(int source_identifier, | |
441 int message_level, | |
442 const base::string16& message, | |
443 int line_number, | |
444 const GURL& source_url) override {} | |
445 bool OnMessageReceived(const IPC::Message& message) override { return false; } | |
446 | |
447 scoped_ptr<EmbeddedWorkerInstance> worker_; | |
448 EmbeddedWorkerInstance::Status last_worker_status_; | |
449 | |
450 // Called by EmbeddedWorkerInstance::Observer overrides so that | |
451 // test code can wait for the worker status notifications. | |
452 base::Closure done_closure_; | |
453 }; | |
454 | |
455 class ConsoleListener : public EmbeddedWorkerInstance::Listener { | 344 class ConsoleListener : public EmbeddedWorkerInstance::Listener { |
456 public: | 345 public: |
457 void OnReportConsoleMessage(int source_identifier, | 346 void OnReportConsoleMessage(int source_identifier, |
458 int message_level, | 347 int message_level, |
459 const base::string16& message, | 348 const base::string16& message, |
460 int line_number, | 349 int line_number, |
461 const GURL& source_url) override { | 350 const GURL& source_url) override { |
462 messages_.push_back(message); | 351 messages_.push_back(message); |
463 if (!quit_.is_null() && messages_.size() == expected_message_count_) { | 352 if (!quit_.is_null() && messages_.size() == expected_message_count_) { |
464 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, quit_); | 353 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, quit_); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
533 base::RunLoop run_loop; | 422 base::RunLoop run_loop; |
534 BrowserThread::PostTask( | 423 BrowserThread::PostTask( |
535 BrowserThread::IO, | 424 BrowserThread::IO, |
536 FROM_HERE, | 425 FROM_HERE, |
537 base::Bind( | 426 base::Bind( |
538 &self::ActivateOnIOThread, this, run_loop.QuitClosure(), &status)); | 427 &self::ActivateOnIOThread, this, run_loop.QuitClosure(), &status)); |
539 run_loop.Run(); | 428 run_loop.Run(); |
540 ASSERT_EQ(expected_status, status); | 429 ASSERT_EQ(expected_status, status); |
541 } | 430 } |
542 | 431 |
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( | 432 void FetchOnRegisteredWorker( |
575 ServiceWorkerFetchEventResult* result, | 433 ServiceWorkerFetchEventResult* result, |
576 ServiceWorkerResponse* response, | 434 ServiceWorkerResponse* response, |
577 scoped_ptr<storage::BlobDataHandle>* blob_data_handle) { | 435 scoped_ptr<storage::BlobDataHandle>* blob_data_handle) { |
578 blob_context_ = ChromeBlobStorageContext::GetFor( | 436 blob_context_ = ChromeBlobStorageContext::GetFor( |
579 shell()->web_contents()->GetBrowserContext()); | 437 shell()->web_contents()->GetBrowserContext()); |
580 bool prepare_result = false; | 438 bool prepare_result = false; |
581 FetchResult fetch_result; | 439 FetchResult fetch_result; |
582 fetch_result.status = SERVICE_WORKER_ERROR_FAILED; | 440 fetch_result.status = SERVICE_WORKER_ERROR_FAILED; |
583 base::RunLoop fetch_run_loop; | 441 base::RunLoop fetch_run_loop; |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
783 CreateResponseReceiver( | 641 CreateResponseReceiver( |
784 BrowserThread::UI, done, blob_context_.get(), result)); | 642 BrowserThread::UI, done, blob_context_.get(), result)); |
785 } | 643 } |
786 | 644 |
787 void StopOnIOThread(const base::Closure& done, | 645 void StopOnIOThread(const base::Closure& done, |
788 ServiceWorkerStatusCode* result) { | 646 ServiceWorkerStatusCode* result) { |
789 ASSERT_TRUE(version_.get()); | 647 ASSERT_TRUE(version_.get()); |
790 version_->StopWorker(CreateReceiver(BrowserThread::UI, done, result)); | 648 version_->StopWorker(CreateReceiver(BrowserThread::UI, done, result)); |
791 } | 649 } |
792 | 650 |
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: | 651 protected: |
803 scoped_refptr<ServiceWorkerRegistration> registration_; | 652 scoped_refptr<ServiceWorkerRegistration> registration_; |
804 scoped_refptr<ServiceWorkerVersion> version_; | 653 scoped_refptr<ServiceWorkerVersion> version_; |
805 scoped_refptr<ChromeBlobStorageContext> blob_context_; | 654 scoped_refptr<ChromeBlobStorageContext> blob_context_; |
806 }; | 655 }; |
807 | 656 |
808 IN_PROC_BROWSER_TEST_F(EmbeddedWorkerBrowserTest, StartAndStop) { | |
809 // Start a worker and wait until OnStarted() is called. | |
810 base::RunLoop start_run_loop; | |
811 done_closure_ = start_run_loop.QuitClosure(); | |
812 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | |
813 base::Bind(&self::StartOnIOThread, this)); | |
814 start_run_loop.Run(); | |
815 | |
816 ASSERT_EQ(EmbeddedWorkerInstance::RUNNING, last_worker_status_); | |
817 | |
818 // Stop a worker and wait until OnStopped() is called. | |
819 base::RunLoop stop_run_loop; | |
820 done_closure_ = stop_run_loop.QuitClosure(); | |
821 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | |
822 base::Bind(&self::StopOnIOThread, this)); | |
823 stop_run_loop.Run(); | |
824 | |
825 ASSERT_EQ(EmbeddedWorkerInstance::STOPPED, last_worker_status_); | |
826 } | |
827 | |
828 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, StartAndStop) { | 657 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, StartAndStop) { |
829 RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, this, | 658 RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, this, |
830 "/service_worker/worker.js")); | 659 "/service_worker/worker.js")); |
831 | 660 |
832 // Start a worker. | 661 // Start a worker. |
833 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 662 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
834 base::RunLoop start_run_loop; | 663 base::RunLoop start_run_loop; |
835 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 664 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
836 base::Bind(&self::StartOnIOThread, this, | 665 base::Bind(&self::StartOnIOThread, this, |
837 start_run_loop.QuitClosure(), | 666 start_run_loop.QuitClosure(), |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1110 console_listener.messages()[0].find(expected1)); | 939 console_listener.messages()[0].find(expected1)); |
1111 ASSERT_EQ(0u, console_listener.messages()[1].find(expected2)); | 940 ASSERT_EQ(0u, console_listener.messages()[1].find(expected2)); |
1112 version_->embedded_worker()->RemoveListener(&console_listener); | 941 version_->embedded_worker()->RemoveListener(&console_listener); |
1113 | 942 |
1114 ASSERT_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, result); | 943 ASSERT_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, result); |
1115 EXPECT_EQ(0, response.status_code); | 944 EXPECT_EQ(0, response.status_code); |
1116 | 945 |
1117 ASSERT_FALSE(blob_data_handle); | 946 ASSERT_FALSE(blob_data_handle); |
1118 } | 947 } |
1119 | 948 |
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) { | 949 IN_PROC_BROWSER_TEST_F(ServiceWorkerBrowserTest, Reload) { |
1199 const char kPageUrl[] = "/service_worker/reload.html"; | 950 const char kPageUrl[] = "/service_worker/reload.html"; |
1200 const char kWorkerUrl[] = "/service_worker/fetch_event_reload.js"; | 951 const char kWorkerUrl[] = "/service_worker/fetch_event_reload.js"; |
1201 scoped_refptr<WorkerActivatedObserver> observer = | 952 scoped_refptr<WorkerActivatedObserver> observer = |
1202 new WorkerActivatedObserver(wrapper()); | 953 new WorkerActivatedObserver(wrapper()); |
1203 observer->Init(); | 954 observer->Init(); |
1204 public_context()->RegisterServiceWorker( | 955 public_context()->RegisterServiceWorker( |
1205 embedded_test_server()->GetURL(kPageUrl), | 956 embedded_test_server()->GetURL(kPageUrl), |
1206 embedded_test_server()->GetURL(kWorkerUrl), | 957 embedded_test_server()->GetURL(kWorkerUrl), |
1207 base::Bind(&ExpectResultAndRun, true, base::Bind(&base::DoNothing))); | 958 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); | 1279 ASSERT_EQ(SERVICE_WORKER_OK, status); |
1529 // Stop the worker. | 1280 // Stop the worker. |
1530 StopWorker(SERVICE_WORKER_OK); | 1281 StopWorker(SERVICE_WORKER_OK); |
1531 // Restart the worker. | 1282 // Restart the worker. |
1532 StartWorker(SERVICE_WORKER_OK); | 1283 StartWorker(SERVICE_WORKER_OK); |
1533 // Stop the worker. | 1284 // Stop the worker. |
1534 StopWorker(SERVICE_WORKER_OK); | 1285 StopWorker(SERVICE_WORKER_OK); |
1535 } | 1286 } |
1536 | 1287 |
1537 } // namespace content | 1288 } // namespace content |
OLD | NEW |