Index: content/browser/service_worker/service_worker_dispatcher_host_unittest.cc |
diff --git a/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc b/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc |
index e5f0d75f5f0a460f50ae418d579d01557091c6f1..e2debc26b2ec9973ca0b7dc5c83d157bcc7c40c4 100644 |
--- a/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc |
+++ b/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc |
@@ -123,16 +123,14 @@ class FailToStartWorkerTestHelper : public EmbeddedWorkerTestHelper { |
public: |
FailToStartWorkerTestHelper() : EmbeddedWorkerTestHelper(base::FilePath()) {} |
- void OnStartWorker( |
- int embedded_worker_id, |
- int64_t service_worker_version_id, |
- const GURL& scope, |
- const GURL& script_url, |
- bool pause_after_download, |
- mojom::ServiceWorkerEventDispatcherRequest request, |
- mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host, |
- mojom::ServiceWorkerProviderInfoForStartWorkerPtr provider_info) |
- override { |
+ void OnStartWorker(int embedded_worker_id, |
+ int64_t service_worker_version_id, |
+ const GURL& scope, |
+ const GURL& script_url, |
+ bool pause_after_download, |
+ mojom::ServiceWorkerEventDispatcherRequest request, |
+ mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo |
+ instance_host) override { |
mojom::EmbeddedWorkerInstanceHostAssociatedPtr instance_host_ptr; |
instance_host_ptr.Bind(std::move(instance_host)); |
instance_host_ptr->OnStopped(); |
@@ -198,6 +196,13 @@ class ServiceWorkerDispatcherHostTest : public testing::Test { |
EXPECT_EQ(SERVICE_WORKER_OK, status); |
} |
+ void SendSetHostedVersionId(int provider_id, |
+ int64_t version_id, |
+ int embedded_worker_id) { |
+ dispatcher_host_->OnSetHostedVersionId(provider_id, version_id, |
+ embedded_worker_id); |
+ } |
+ |
void SendProviderCreated(ServiceWorkerProviderType type, |
const GURL& pattern) { |
const int64_t kProviderId = 99; |
@@ -212,19 +217,6 @@ class ServiceWorkerDispatcherHostTest : public testing::Test { |
helper_->mock_render_process_id(), kProviderId); |
} |
- void PrepareProviderForServiceWorkerContext(ServiceWorkerVersion* version, |
- const GURL& pattern) { |
- std::unique_ptr<ServiceWorkerProviderHost> host = |
- CreateProviderHostForServiceWorkerContext( |
- helper_->mock_render_process_id(), |
- true /* is_parent_frame_secure */, version, |
- helper_->context()->AsWeakPtr(), &remote_endpoint_); |
- provider_host_ = host.get(); |
- helper_->SimulateAddProcessToPattern(pattern, |
- helper_->mock_render_process_id()); |
- context()->AddProviderHost(std::move(host)); |
- } |
- |
void SendRegister(int64_t provider_id, GURL pattern, GURL worker_url) { |
dispatcher_host_->OnMessageReceived( |
ServiceWorkerHostMsg_RegisterServiceWorker( |
@@ -768,8 +760,8 @@ TEST_F(ServiceWorkerDispatcherHostTest, DispatchExtendableMessageEvent) { |
GURL pattern = GURL("http://www.example.com/"); |
GURL script_url = GURL("http://www.example.com/service_worker.js"); |
+ SendProviderCreated(SERVICE_WORKER_PROVIDER_FOR_CONTROLLER, pattern); |
SetUpRegistration(pattern, script_url); |
- PrepareProviderForServiceWorkerContext(version_.get(), pattern); |
// Set the running hosted version so that we can retrieve a valid service |
// worker object information for the source attribute of the message event. |
@@ -846,6 +838,62 @@ TEST_F(ServiceWorkerDispatcherHostTest, DispatchExtendableMessageEvent_Fail) { |
EXPECT_EQ(SERVICE_WORKER_ERROR_START_WORKER_FAILED, status); |
} |
+TEST_F(ServiceWorkerDispatcherHostTest, OnSetHostedVersionId) { |
+ GURL pattern = GURL("http://www.example.com/"); |
+ GURL script_url = GURL("http://www.example.com/service_worker.js"); |
+ |
+ Initialize(base::WrapUnique(new FailToStartWorkerTestHelper)); |
+ SendProviderCreated(SERVICE_WORKER_PROVIDER_FOR_CONTROLLER, pattern); |
+ SetUpRegistration(pattern, script_url); |
+ |
+ const int64_t kProviderId = 99; // Dummy value |
+ bool called; |
+ ServiceWorkerStatusCode status; |
+ // StartWorker puts the worker in STARTING state but it will have no |
+ // process id yet. |
+ version_->StartWorker(ServiceWorkerMetrics::EventType::UNKNOWN, |
+ base::Bind(&SaveStatusCallback, &called, &status)); |
+ EXPECT_NE(version_->embedded_worker()->process_id(), |
+ provider_host_->process_id()); |
+ // SendSetHostedVersionId should reject because the provider host process id |
+ // is different. It should call BadMessageReceived because it's not an |
+ // expected error state. |
+ SendSetHostedVersionId(kProviderId, version_->version_id(), |
+ version_->embedded_worker()->embedded_worker_id()); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_FALSE(dispatcher_host_->ipc_sink()->GetUniqueMessageMatching( |
+ ServiceWorkerMsg_AssociateRegistration::ID)); |
+ EXPECT_EQ(1, dispatcher_host_->bad_messages_received_count_); |
+} |
+ |
+TEST_F(ServiceWorkerDispatcherHostTest, OnSetHostedVersionId_DetachedWorker) { |
+ GURL pattern = GURL("http://www.example.com/"); |
+ GURL script_url = GURL("http://www.example.com/service_worker.js"); |
+ |
+ Initialize(base::WrapUnique(new FailToStartWorkerTestHelper)); |
+ SendProviderCreated(SERVICE_WORKER_PROVIDER_FOR_CONTROLLER, pattern); |
+ SetUpRegistration(pattern, script_url); |
+ |
+ const int64_t kProviderId = 99; // Dummy value |
+ bool called; |
+ ServiceWorkerStatusCode status; |
+ // StartWorker puts the worker in STARTING state. |
+ version_->StartWorker(ServiceWorkerMetrics::EventType::UNKNOWN, |
+ base::Bind(&SaveStatusCallback, &called, &status)); |
+ |
+ // SendSetHostedVersionId should bail because the embedded worker is |
+ // different. It shouldn't call BadMessageReceived because receiving a message |
+ // for a detached worker is a legitimite possibility. |
+ int bad_embedded_worker_id = |
+ version_->embedded_worker()->embedded_worker_id() + 1; |
+ SendSetHostedVersionId(kProviderId, version_->version_id(), |
+ bad_embedded_worker_id); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_FALSE(dispatcher_host_->ipc_sink()->GetUniqueMessageMatching( |
+ ServiceWorkerMsg_AssociateRegistration::ID)); |
+ EXPECT_EQ(0, dispatcher_host_->bad_messages_received_count_); |
+} |
+ |
TEST_F(ServiceWorkerDispatcherHostTest, ReceivedTimedOutRequestResponse) { |
GURL pattern = GURL("https://www.example.com/"); |
GURL script_url = GURL("https://www.example.com/service_worker.js"); |