| 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 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 ServiceWorkerVersion::FetchCallback CreateResponseReceiver( | 124 ServiceWorkerVersion::FetchCallback CreateResponseReceiver( |
| 125 BrowserThread::ID run_quit_thread, | 125 BrowserThread::ID run_quit_thread, |
| 126 const base::Closure& quit, | 126 const base::Closure& quit, |
| 127 ChromeBlobStorageContext* blob_context, | 127 ChromeBlobStorageContext* blob_context, |
| 128 FetchResult* result) { | 128 FetchResult* result) { |
| 129 return base::Bind(&ReceiveFetchResult, run_quit_thread, quit, | 129 return base::Bind(&ReceiveFetchResult, run_quit_thread, quit, |
| 130 make_scoped_refptr<ChromeBlobStorageContext>(blob_context), | 130 make_scoped_refptr<ChromeBlobStorageContext>(blob_context), |
| 131 result); | 131 result); |
| 132 } | 132 } |
| 133 | 133 |
| 134 void ReceiveFindRegistrationStatus( |
| 135 BrowserThread::ID run_quit_thread, |
| 136 const base::Closure& quit, |
| 137 ServiceWorkerStatusCode* out_status, |
| 138 ServiceWorkerStatusCode status, |
| 139 const scoped_refptr<ServiceWorkerRegistration>& registration) { |
| 140 *out_status = status; |
| 141 if (!quit.is_null()) |
| 142 BrowserThread::PostTask(run_quit_thread, FROM_HERE, quit); |
| 143 } |
| 144 |
| 145 ServiceWorkerStorage::FindRegistrationCallback CreateFindRegistrationReceiver( |
| 146 BrowserThread::ID run_quit_thread, |
| 147 const base::Closure& quit, |
| 148 ServiceWorkerStatusCode* status) { |
| 149 return base::Bind(&ReceiveFindRegistrationStatus, run_quit_thread, quit, |
| 150 status); |
| 151 } |
| 152 |
| 134 void ReadResponseBody(std::string* body, | 153 void ReadResponseBody(std::string* body, |
| 135 storage::BlobDataHandle* blob_data_handle) { | 154 storage::BlobDataHandle* blob_data_handle) { |
| 136 ASSERT_TRUE(blob_data_handle); | 155 ASSERT_TRUE(blob_data_handle); |
| 137 scoped_ptr<storage::BlobDataSnapshot> data = | 156 scoped_ptr<storage::BlobDataSnapshot> data = |
| 138 blob_data_handle->CreateSnapshot(); | 157 blob_data_handle->CreateSnapshot(); |
| 139 ASSERT_EQ(1U, data->items().size()); | 158 ASSERT_EQ(1U, data->items().size()); |
| 140 *body = std::string(data->items()[0]->bytes(), data->items()[0]->length()); | 159 *body = std::string(data->items()[0]->bytes(), data->items()[0]->length()); |
| 141 } | 160 } |
| 142 | 161 |
| 143 void ExpectResultAndRun(bool expected, | 162 void ExpectResultAndRun(bool expected, |
| 144 const base::Closure& continuation, | 163 const base::Closure& continuation, |
| 145 bool actual) { | 164 bool actual) { |
| 146 EXPECT_EQ(expected, actual); | 165 EXPECT_EQ(expected, actual); |
| 147 continuation.Run(); | 166 continuation.Run(); |
| 148 } | 167 } |
| 149 | 168 |
| 150 class WorkerActivatedObserver | 169 class WorkerActivatedObserver |
| 151 : public ServiceWorkerContextObserver, | 170 : public ServiceWorkerContextObserver, |
| 152 public base::RefCountedThreadSafe<WorkerActivatedObserver> { | 171 public base::RefCountedThreadSafe<WorkerActivatedObserver> { |
| 153 public: | 172 public: |
| 154 explicit WorkerActivatedObserver(ServiceWorkerContextWrapper* context) | 173 explicit WorkerActivatedObserver(ServiceWorkerContextWrapper* context) |
| 155 : context_(context) {} | 174 : context_(context) {} |
| 156 void Init() { | 175 void Init() { |
| 157 RunOnIOThread(base::Bind(&WorkerActivatedObserver::InitOnIOThread, this)); | 176 RunOnIOThread(base::Bind(&WorkerActivatedObserver::InitOnIOThread, this)); |
| 158 } | 177 } |
| 159 // ServiceWorkerContextObserver overrides. | 178 // ServiceWorkerContextObserver overrides. |
| 160 void OnVersionStateChanged(int64 version_id, | 179 void OnVersionStateChanged(int64 version_id, |
| 161 ServiceWorkerVersion::Status) override { | 180 ServiceWorkerVersion::Status) override { |
| 162 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 181 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 163 const ServiceWorkerVersion* version = context_->GetLiveVersion(version_id); | 182 const ServiceWorkerVersion* version = context_->GetLiveVersion(version_id); |
| 164 if (version->status() == ServiceWorkerVersion::ACTIVATED) { | 183 if (version->status() == ServiceWorkerVersion::ACTIVATED) { |
| 165 context_->RemoveObserver(this); | 184 context_->RemoveObserver(this); |
| 166 BrowserThread::PostTask(BrowserThread::UI, | 185 BrowserThread::PostTask(BrowserThread::UI, |
| 167 FROM_HERE, | 186 FROM_HERE, |
| 168 base::Bind(&WorkerActivatedObserver::Quit, this)); | 187 base::Bind(&WorkerActivatedObserver::Quit, this)); |
| 169 } | 188 } |
| 170 } | 189 } |
| 171 void Wait() { run_loop_.Run(); } | 190 void Wait() { run_loop_.Run(); } |
| 172 | 191 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 request, network_delegate, headers, body_, true); | 239 request, network_delegate, headers, body_, true); |
| 221 } | 240 } |
| 222 | 241 |
| 223 private: | 242 private: |
| 224 std::string body_; | 243 std::string body_; |
| 225 DISALLOW_COPY_AND_ASSIGN(LongLivedResourceInterceptor); | 244 DISALLOW_COPY_AND_ASSIGN(LongLivedResourceInterceptor); |
| 226 }; | 245 }; |
| 227 | 246 |
| 228 void CreateLongLivedResourceInterceptors( | 247 void CreateLongLivedResourceInterceptors( |
| 229 const GURL& worker_url, const GURL& import_url) { | 248 const GURL& worker_url, const GURL& import_url) { |
| 230 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 249 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 231 scoped_ptr<net::URLRequestInterceptor> interceptor; | 250 scoped_ptr<net::URLRequestInterceptor> interceptor; |
| 232 | 251 |
| 233 interceptor.reset(new LongLivedResourceInterceptor( | 252 interceptor.reset(new LongLivedResourceInterceptor( |
| 234 "importScripts('long_lived_import.js');")); | 253 "importScripts('long_lived_import.js');")); |
| 235 net::URLRequestFilter::GetInstance()->AddUrlInterceptor( | 254 net::URLRequestFilter::GetInstance()->AddUrlInterceptor( |
| 236 worker_url, interceptor.Pass()); | 255 worker_url, interceptor.Pass()); |
| 237 | 256 |
| 238 interceptor.reset(new LongLivedResourceInterceptor( | 257 interceptor.reset(new LongLivedResourceInterceptor( |
| 239 "// the imported script does nothing")); | 258 "// the imported script does nothing")); |
| 240 net::URLRequestFilter::GetInstance()->AddUrlInterceptor( | 259 net::URLRequestFilter::GetInstance()->AddUrlInterceptor( |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 541 void FetchTestHelper(const std::string& worker_url, | 560 void FetchTestHelper(const std::string& worker_url, |
| 542 ServiceWorkerFetchEventResult* result, | 561 ServiceWorkerFetchEventResult* result, |
| 543 ServiceWorkerResponse* response, | 562 ServiceWorkerResponse* response, |
| 544 scoped_ptr<storage::BlobDataHandle>* blob_data_handle) { | 563 scoped_ptr<storage::BlobDataHandle>* blob_data_handle) { |
| 545 RunOnIOThread( | 564 RunOnIOThread( |
| 546 base::Bind(&self::SetUpRegistrationOnIOThread, this, worker_url)); | 565 base::Bind(&self::SetUpRegistrationOnIOThread, this, worker_url)); |
| 547 FetchOnRegisteredWorker(result, response, blob_data_handle); | 566 FetchOnRegisteredWorker(result, response, blob_data_handle); |
| 548 } | 567 } |
| 549 | 568 |
| 550 void SetUpRegistrationOnIOThread(const std::string& worker_url) { | 569 void SetUpRegistrationOnIOThread(const std::string& worker_url) { |
| 570 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 551 const GURL pattern = embedded_test_server()->GetURL("/service_worker/"); | 571 const GURL pattern = embedded_test_server()->GetURL("/service_worker/"); |
| 552 registration_ = new ServiceWorkerRegistration( | 572 registration_ = new ServiceWorkerRegistration( |
| 553 pattern, | 573 pattern, |
| 554 wrapper()->context()->storage()->NewRegistrationId(), | 574 wrapper()->context()->storage()->NewRegistrationId(), |
| 555 wrapper()->context()->AsWeakPtr()); | 575 wrapper()->context()->AsWeakPtr()); |
| 556 version_ = new ServiceWorkerVersion( | 576 version_ = new ServiceWorkerVersion( |
| 557 registration_.get(), | 577 registration_.get(), |
| 558 embedded_test_server()->GetURL(worker_url), | 578 embedded_test_server()->GetURL(worker_url), |
| 559 wrapper()->context()->storage()->NewVersionId(), | 579 wrapper()->context()->storage()->NewVersionId(), |
| 560 wrapper()->context()->AsWeakPtr()); | 580 wrapper()->context()->AsWeakPtr()); |
| 561 | 581 |
| 562 // Make the registration findable via storage functions. | 582 // Make the registration findable via storage functions. |
| 563 wrapper()->context()->storage()->NotifyInstallingRegistration( | 583 wrapper()->context()->storage()->NotifyInstallingRegistration( |
| 564 registration_.get()); | 584 registration_.get()); |
| 565 | 585 |
| 566 AssociateRendererProcessToPattern(pattern); | 586 AssociateRendererProcessToPattern(pattern); |
| 567 } | 587 } |
| 568 | 588 |
| 569 void TimeoutWorkerOnIOThread() { | 589 void TimeoutWorkerOnIOThread() { |
| 570 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 590 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 571 version_->PingWorker(); | 591 version_->PingWorker(); |
| 572 version_->OnPingTimeout(); | 592 version_->OnPingTimeout(); |
| 573 } | 593 } |
| 574 | 594 |
| 595 void AddControlleeOnIOThread() { |
| 596 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 597 scoped_ptr<ServiceWorkerProviderHost> host(new ServiceWorkerProviderHost( |
| 598 33 /* dummy render process id */, |
| 599 MSG_ROUTING_NONE /* render_frame_id */, 1 /* dummy provider_id */, |
| 600 SERVICE_WORKER_PROVIDER_FOR_WINDOW, wrapper()->context()->AsWeakPtr(), |
| 601 NULL)); |
| 602 host->SetDocumentUrl( |
| 603 embedded_test_server()->GetURL("/service_worker/host")); |
| 604 host->AssociateRegistration(registration_.get(), |
| 605 false /* notify_controllerchange */); |
| 606 wrapper()->context()->AddProviderHost(host.Pass()); |
| 607 } |
| 608 |
| 609 void AddWaitingWorkerOnIOThread(const std::string& worker_url) { |
| 610 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 611 scoped_refptr<ServiceWorkerVersion> waiting_version( |
| 612 new ServiceWorkerVersion( |
| 613 registration_.get(), embedded_test_server()->GetURL(worker_url), |
| 614 wrapper()->context()->storage()->NewVersionId(), |
| 615 wrapper()->context()->AsWeakPtr())); |
| 616 waiting_version->SetStatus(ServiceWorkerVersion::INSTALLED); |
| 617 registration_->SetWaitingVersion(waiting_version.get()); |
| 618 registration_->ActivateWaitingVersionWhenReady(); |
| 619 } |
| 620 |
| 575 void StartWorker(ServiceWorkerStatusCode expected_status) { | 621 void StartWorker(ServiceWorkerStatusCode expected_status) { |
| 576 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 622 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 577 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 623 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
| 578 base::RunLoop start_run_loop; | 624 base::RunLoop start_run_loop; |
| 579 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 625 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 580 base::Bind(&self::StartOnIOThread, this, | 626 base::Bind(&self::StartOnIOThread, this, |
| 581 start_run_loop.QuitClosure(), | 627 start_run_loop.QuitClosure(), |
| 582 &status)); | 628 &status)); |
| 583 start_run_loop.Run(); | 629 start_run_loop.Run(); |
| 584 ASSERT_EQ(expected_status, status); | 630 ASSERT_EQ(expected_status, status); |
| 585 } | 631 } |
| 586 | 632 |
| 587 void StopWorker(ServiceWorkerStatusCode expected_status) { | 633 void StopWorker(ServiceWorkerStatusCode expected_status) { |
| 588 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 634 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 589 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 635 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
| 590 base::RunLoop stop_run_loop; | 636 base::RunLoop stop_run_loop; |
| 591 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 637 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 592 base::Bind(&self::StopOnIOThread, this, | 638 base::Bind(&self::StopOnIOThread, this, |
| 593 stop_run_loop.QuitClosure(), | 639 stop_run_loop.QuitClosure(), |
| 594 &status)); | 640 &status)); |
| 595 stop_run_loop.Run(); | 641 stop_run_loop.Run(); |
| 596 ASSERT_EQ(expected_status, status); | 642 ASSERT_EQ(expected_status, status); |
| 597 } | 643 } |
| 598 | 644 |
| 645 void StoreRegistration(int64 version_id, |
| 646 ServiceWorkerStatusCode expected_status) { |
| 647 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 648 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
| 649 base::RunLoop store_run_loop; |
| 650 BrowserThread::PostTask( |
| 651 BrowserThread::IO, FROM_HERE, |
| 652 base::Bind(&self::StoreOnIOThread, this, store_run_loop.QuitClosure(), |
| 653 &status, version_id)); |
| 654 store_run_loop.Run(); |
| 655 ASSERT_EQ(expected_status, status); |
| 656 |
| 657 RunOnIOThread(base::Bind(&self::NotifyDoneInstallingRegistrationOnIOThread, |
| 658 this, status)); |
| 659 } |
| 660 |
| 661 void FindRegistrationForId(int64 id, |
| 662 const GURL& origin, |
| 663 ServiceWorkerStatusCode expected_status) { |
| 664 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 665 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
| 666 base::RunLoop run_loop; |
| 667 BrowserThread::PostTask( |
| 668 BrowserThread::IO, FROM_HERE, |
| 669 base::Bind(&self::FindRegistrationForIdOnIOThread, this, |
| 670 run_loop.QuitClosure(), &status, id, origin)); |
| 671 run_loop.Run(); |
| 672 ASSERT_EQ(expected_status, status); |
| 673 } |
| 674 |
| 675 void FindRegistrationForIdOnIOThread(const base::Closure& done, |
| 676 ServiceWorkerStatusCode* result, |
| 677 int64 id, |
| 678 const GURL& origin) { |
| 679 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 680 wrapper()->context()->storage()->FindRegistrationForId( |
| 681 id, origin, |
| 682 CreateFindRegistrationReceiver(BrowserThread::UI, done, result)); |
| 683 } |
| 684 |
| 685 void NotifyDoneInstallingRegistrationOnIOThread( |
| 686 ServiceWorkerStatusCode status) { |
| 687 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 688 wrapper()->context()->storage()->NotifyDoneInstallingRegistration( |
| 689 registration_.get(), version_.get(), status); |
| 690 } |
| 691 |
| 692 void RemoveLiveRegistrationOnIOThread(int64 id) { |
| 693 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 694 wrapper()->context()->RemoveLiveRegistration(id); |
| 695 } |
| 696 |
| 599 void StartOnIOThread(const base::Closure& done, | 697 void StartOnIOThread(const base::Closure& done, |
| 600 ServiceWorkerStatusCode* result) { | 698 ServiceWorkerStatusCode* result) { |
| 601 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 699 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 602 version_->StartWorker(CreateReceiver(BrowserThread::UI, done, result)); | 700 version_->StartWorker(CreateReceiver(BrowserThread::UI, done, result)); |
| 603 } | 701 } |
| 604 | 702 |
| 605 void InstallOnIOThread(const base::Closure& done, | 703 void InstallOnIOThread(const base::Closure& done, |
| 606 ServiceWorkerStatusCode* result) { | 704 ServiceWorkerStatusCode* result) { |
| 607 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 705 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 608 version_->SetStatus(ServiceWorkerVersion::INSTALLING); | 706 version_->SetStatus(ServiceWorkerVersion::INSTALLING); |
| 609 version_->DispatchInstallEvent( | 707 version_->DispatchInstallEvent( |
| 610 CreateReceiver(BrowserThread::UI, done, result)); | 708 CreateReceiver(BrowserThread::UI, done, result)); |
| 611 } | 709 } |
| 612 | 710 |
| 711 void StoreOnIOThread(const base::Closure& done, |
| 712 ServiceWorkerStatusCode* result, |
| 713 int64 version_id) { |
| 714 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 715 ServiceWorkerVersion* version = |
| 716 wrapper()->context()->GetLiveVersion(version_id); |
| 717 wrapper()->context()->storage()->StoreRegistration( |
| 718 registration_.get(), version, |
| 719 CreateReceiver(BrowserThread::UI, done, result)); |
| 720 } |
| 721 |
| 613 void ActivateOnIOThread(const base::Closure& done, | 722 void ActivateOnIOThread(const base::Closure& done, |
| 614 ServiceWorkerStatusCode* result) { | 723 ServiceWorkerStatusCode* result) { |
| 615 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 724 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 616 version_->SetStatus(ServiceWorkerVersion::ACTIVATING); | 725 version_->SetStatus(ServiceWorkerVersion::ACTIVATING); |
| 726 registration_->SetActiveVersion(version_.get()); |
| 617 version_->DispatchActivateEvent( | 727 version_->DispatchActivateEvent( |
| 618 CreateReceiver(BrowserThread::UI, done, result)); | 728 CreateReceiver(BrowserThread::UI, done, result)); |
| 619 } | 729 } |
| 620 | 730 |
| 621 void FetchOnIOThread(const base::Closure& done, | 731 void FetchOnIOThread(const base::Closure& done, |
| 622 bool* prepare_result, | 732 bool* prepare_result, |
| 623 FetchResult* result) { | 733 FetchResult* result) { |
| 624 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 734 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 625 ServiceWorkerFetchRequest request( | 735 ServiceWorkerFetchRequest request( |
| 626 embedded_test_server()->GetURL("/service_worker/empty.html"), | 736 embedded_test_server()->GetURL("/service_worker/empty.html"), |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 723 } | 833 } |
| 724 | 834 |
| 725 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, StartNotFound) { | 835 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, StartNotFound) { |
| 726 RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, this, | 836 RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, this, |
| 727 "/service_worker/nonexistent.js")); | 837 "/service_worker/nonexistent.js")); |
| 728 | 838 |
| 729 // Start a worker for nonexistent URL. | 839 // Start a worker for nonexistent URL. |
| 730 StartWorker(SERVICE_WORKER_ERROR_NETWORK); | 840 StartWorker(SERVICE_WORKER_ERROR_NETWORK); |
| 731 } | 841 } |
| 732 | 842 |
| 843 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, ReadResourceFailure) { |
| 844 // Create and store a registration. |
| 845 RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, this, |
| 846 "/service_worker/worker.js")); |
| 847 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
| 848 StoreRegistration(version_->version_id(), SERVICE_WORKER_OK); |
| 849 |
| 850 // Add a non-existent resource to the version. |
| 851 std::vector<ServiceWorkerDatabase::ResourceRecord> records; |
| 852 records.push_back( |
| 853 ServiceWorkerDatabase::ResourceRecord(30, version_->script_url(), 100)); |
| 854 version_->script_cache_map()->SetResources(records); |
| 855 |
| 856 // Start the worker. We'll fail to read the resource. |
| 857 StartWorker(SERVICE_WORKER_ERROR_DISK_CACHE); |
| 858 EXPECT_EQ(ServiceWorkerVersion::REDUNDANT, version_->status()); |
| 859 |
| 860 // The registration should be deleted from storage since the broken worker was |
| 861 // the stored one. |
| 862 RunOnIOThread(base::Bind(&self::RemoveLiveRegistrationOnIOThread, this, |
| 863 registration_->id())); |
| 864 FindRegistrationForId(registration_->id(), |
| 865 registration_->pattern().GetOrigin(), |
| 866 SERVICE_WORKER_ERROR_NOT_FOUND); |
| 867 } |
| 868 |
| 869 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, |
| 870 ReadResourceFailure_WaitingWorker) { |
| 871 // Create a registration and active version. |
| 872 RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, this, |
| 873 "/service_worker/worker.js")); |
| 874 base::RunLoop activate_run_loop; |
| 875 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
| 876 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 877 base::Bind(&self::ActivateOnIOThread, this, |
| 878 activate_run_loop.QuitClosure(), &status)); |
| 879 activate_run_loop.Run(); |
| 880 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 881 ASSERT_TRUE(registration_->active_version()); |
| 882 |
| 883 // Give the version a controllee. |
| 884 RunOnIOThread(base::Bind(&self::AddControlleeOnIOThread, this)); |
| 885 |
| 886 // Add a non-existent resource to the version. |
| 887 std::vector<ServiceWorkerDatabase::ResourceRecord> records; |
| 888 records.push_back( |
| 889 ServiceWorkerDatabase::ResourceRecord(30, version_->script_url(), 100)); |
| 890 version_->script_cache_map()->SetResources(records); |
| 891 |
| 892 // Make a waiting version and store it. |
| 893 RunOnIOThread(base::Bind(&self::AddWaitingWorkerOnIOThread, this, |
| 894 "/service_worker/worker.js")); |
| 895 StoreRegistration(registration_->waiting_version()->version_id(), |
| 896 SERVICE_WORKER_OK); |
| 897 |
| 898 // Start the broken worker. We'll fail to read from disk and the worker should |
| 899 // be doomed. |
| 900 StopWorker(SERVICE_WORKER_OK); // in case it's already running |
| 901 StartWorker(SERVICE_WORKER_ERROR_DISK_CACHE); |
| 902 EXPECT_EQ(ServiceWorkerVersion::REDUNDANT, version_->status()); |
| 903 |
| 904 // The registration should still be in storage since the waiting worker was |
| 905 // the stored one. |
| 906 RunOnIOThread(base::Bind(&self::RemoveLiveRegistrationOnIOThread, this, |
| 907 registration_->id())); |
| 908 FindRegistrationForId(registration_->id(), |
| 909 registration_->pattern().GetOrigin(), |
| 910 SERVICE_WORKER_OK); |
| 911 } |
| 912 |
| 733 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, Install) { | 913 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, Install) { |
| 734 InstallTestHelper("/service_worker/worker.js", SERVICE_WORKER_OK); | 914 InstallTestHelper("/service_worker/worker.js", SERVICE_WORKER_OK); |
| 735 } | 915 } |
| 736 | 916 |
| 737 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, | 917 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, |
| 738 InstallWithWaitUntil_Fulfilled) { | 918 InstallWithWaitUntil_Fulfilled) { |
| 739 InstallTestHelper("/service_worker/worker_install_fulfilled.js", | 919 InstallTestHelper("/service_worker/worker_install_fulfilled.js", |
| 740 SERVICE_WORKER_OK); | 920 SERVICE_WORKER_OK); |
| 741 } | 921 } |
| 742 | 922 |
| (...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1271 | 1451 |
| 1272 // Start a worker. | 1452 // Start a worker. |
| 1273 StartWorker(SERVICE_WORKER_OK); | 1453 StartWorker(SERVICE_WORKER_OK); |
| 1274 | 1454 |
| 1275 // Wait for the matadata is stored. This run loop should finish when | 1455 // Wait for the matadata is stored. This run loop should finish when |
| 1276 // OnCachedMetadataUpdated() is called. | 1456 // OnCachedMetadataUpdated() is called. |
| 1277 cached_metadata_run_loop.Run(); | 1457 cached_metadata_run_loop.Run(); |
| 1278 | 1458 |
| 1279 // Activate the worker. | 1459 // Activate the worker. |
| 1280 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 1460 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
| 1281 base::RunLoop acrivate_run_loop; | 1461 base::RunLoop activate_run_loop; |
| 1282 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 1462 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 1283 base::Bind(&self::ActivateOnIOThread, this, | 1463 base::Bind(&self::ActivateOnIOThread, this, |
| 1284 acrivate_run_loop.QuitClosure(), &status)); | 1464 activate_run_loop.QuitClosure(), &status)); |
| 1285 acrivate_run_loop.Run(); | 1465 activate_run_loop.Run(); |
| 1286 ASSERT_EQ(SERVICE_WORKER_OK, status); | 1466 ASSERT_EQ(SERVICE_WORKER_OK, status); |
| 1287 // Stop the worker. | 1467 // Stop the worker. |
| 1288 StopWorker(SERVICE_WORKER_OK); | 1468 StopWorker(SERVICE_WORKER_OK); |
| 1289 // Restart the worker. | 1469 // Restart the worker. |
| 1290 StartWorker(SERVICE_WORKER_OK); | 1470 StartWorker(SERVICE_WORKER_OK); |
| 1291 // Stop the worker. | 1471 // Stop the worker. |
| 1292 StopWorker(SERVICE_WORKER_OK); | 1472 StopWorker(SERVICE_WORKER_OK); |
| 1293 } | 1473 } |
| 1294 | 1474 |
| 1295 } // namespace content | 1475 } // namespace content |
| OLD | NEW |