| Index: content/browser/service_worker/service_worker_provider_host_unittest.cc
 | 
| diff --git a/content/browser/service_worker/service_worker_provider_host_unittest.cc b/content/browser/service_worker/service_worker_provider_host_unittest.cc
 | 
| index 76b418eb8699ba46deba41eb14ca564251655ad5..0da684174c2383da017907fe95f81ad8ad305d36 100644
 | 
| --- a/content/browser/service_worker/service_worker_provider_host_unittest.cc
 | 
| +++ b/content/browser/service_worker/service_worker_provider_host_unittest.cc
 | 
| @@ -27,22 +27,23 @@ class ServiceWorkerProviderHostTest : public testing::Test {
 | 
|    void SetUp() override {
 | 
|      helper_.reset(new EmbeddedWorkerTestHelper(kRenderProcessId));
 | 
|      context_ = helper_->context();
 | 
| -    pattern_ = GURL("http://www.example.com/");
 | 
|      script_url_ = GURL("http://www.example.com/service_worker.js");
 | 
| -    registration_ = new ServiceWorkerRegistration(
 | 
| -        pattern_, 1L, context_->AsWeakPtr());
 | 
| -    version_ = new ServiceWorkerVersion(
 | 
| -        registration_.get(), script_url_, 1L, context_->AsWeakPtr());
 | 
| +    registration1_ = new ServiceWorkerRegistration(
 | 
| +        GURL("http://www.example.com/"), 1L, context_->AsWeakPtr());
 | 
| +    registration2_ = new ServiceWorkerRegistration(
 | 
| +        GURL("http://www.example.com/example"), 2L, context_->AsWeakPtr());
 | 
|  
 | 
|      // Prepare provider hosts (for the same process).
 | 
|      scoped_ptr<ServiceWorkerProviderHost> host1(new ServiceWorkerProviderHost(
 | 
|          kRenderProcessId, MSG_ROUTING_NONE, 1 /* provider_id */,
 | 
|          SERVICE_WORKER_PROVIDER_FOR_CONTROLLEE,
 | 
|          context_->AsWeakPtr(), NULL));
 | 
| +    host1->SetDocumentUrl(GURL("http://www.example.com/example1.html"));
 | 
|      scoped_ptr<ServiceWorkerProviderHost> host2(new ServiceWorkerProviderHost(
 | 
|          kRenderProcessId, MSG_ROUTING_NONE, 2 /* provider_id */,
 | 
|          SERVICE_WORKER_PROVIDER_FOR_CONTROLLEE,
 | 
|          context_->AsWeakPtr(), NULL));
 | 
| +    host2->SetDocumentUrl(GURL("http://www.example.com/example2.html"));
 | 
|      provider_host1_ = host1->AsWeakPtr();
 | 
|      provider_host2_ = host2->AsWeakPtr();
 | 
|      context_->AddProviderHost(make_scoped_ptr(host1.release()));
 | 
| @@ -50,105 +51,78 @@ class ServiceWorkerProviderHostTest : public testing::Test {
 | 
|    }
 | 
|  
 | 
|    void TearDown() override {
 | 
| -    version_ = 0;
 | 
| -    registration_ = 0;
 | 
| +    registration1_ = 0;
 | 
| +    registration2_ = 0;
 | 
|      helper_.reset();
 | 
|    }
 | 
|  
 | 
| -  bool HasProcessToRun() const {
 | 
| -    return context_->process_manager()->PatternHasProcessToRun(pattern_);
 | 
| +  bool PatternHasProcessToRun(const GURL& pattern) const {
 | 
| +    return context_->process_manager()->PatternHasProcessToRun(pattern);
 | 
|    }
 | 
|  
 | 
|    content::TestBrowserThreadBundle thread_bundle_;
 | 
|    scoped_ptr<EmbeddedWorkerTestHelper> helper_;
 | 
|    ServiceWorkerContextCore* context_;
 | 
| -  scoped_refptr<ServiceWorkerRegistration> registration_;
 | 
| -  scoped_refptr<ServiceWorkerVersion> version_;
 | 
| +  scoped_refptr<ServiceWorkerRegistration> registration1_;
 | 
| +  scoped_refptr<ServiceWorkerRegistration> registration2_;
 | 
|    base::WeakPtr<ServiceWorkerProviderHost> provider_host1_;
 | 
|    base::WeakPtr<ServiceWorkerProviderHost> provider_host2_;
 | 
| -  GURL pattern_;
 | 
|    GURL script_url_;
 | 
|  
 | 
|   private:
 | 
|    DISALLOW_COPY_AND_ASSIGN(ServiceWorkerProviderHostTest);
 | 
|  };
 | 
|  
 | 
| -TEST_F(ServiceWorkerProviderHostTest, SetActiveVersion_ProcessStatus) {
 | 
| -  provider_host1_->AssociateRegistration(registration_.get());
 | 
| -  ASSERT_TRUE(HasProcessToRun());
 | 
| -
 | 
| -  // Associating version_ to a provider_host's active version will internally
 | 
| -  // add the provider_host's process ref to the version.
 | 
| -  registration_->SetActiveVersion(version_.get());
 | 
| -  ASSERT_TRUE(HasProcessToRun());
 | 
| -
 | 
| -  // Re-associating the same version and provider_host should just work too.
 | 
| -  registration_->SetActiveVersion(version_.get());
 | 
| -  ASSERT_TRUE(HasProcessToRun());
 | 
| -
 | 
| -  // Resetting the provider_host's active version should remove process refs
 | 
| -  // from the version.
 | 
| -  provider_host1_->DisassociateRegistration();
 | 
| -  ASSERT_FALSE(HasProcessToRun());
 | 
| -}
 | 
| -
 | 
| -TEST_F(ServiceWorkerProviderHostTest,
 | 
| -       SetActiveVersion_MultipleHostsForSameProcess) {
 | 
| -  provider_host1_->AssociateRegistration(registration_.get());
 | 
| -  provider_host2_->AssociateRegistration(registration_.get());
 | 
| -  ASSERT_TRUE(HasProcessToRun());
 | 
| -
 | 
| -  // Associating version_ to two providers as active version.
 | 
| -  registration_->SetActiveVersion(version_.get());
 | 
| -  ASSERT_TRUE(HasProcessToRun());
 | 
| -
 | 
| -  // Disassociating one provider_host shouldn't remove all process refs
 | 
| -  // from the version yet.
 | 
| -  provider_host1_->DisassociateRegistration();
 | 
| -  ASSERT_TRUE(HasProcessToRun());
 | 
| -
 | 
| -  // Disassociating the other provider_host will remove all process refs.
 | 
| -  provider_host2_->DisassociateRegistration();
 | 
| -  ASSERT_FALSE(HasProcessToRun());
 | 
| +TEST_F(ServiceWorkerProviderHostTest, PotentialRegistration_ProcessStatus) {
 | 
| +  provider_host1_->AddMatchingRegistration(registration1_.get());
 | 
| +  ASSERT_TRUE(PatternHasProcessToRun(registration1_->pattern()));
 | 
| +
 | 
| +  // Adding the same registration twice has no effect.
 | 
| +  provider_host1_->AddMatchingRegistration(registration1_.get());
 | 
| +  ASSERT_TRUE(PatternHasProcessToRun(registration1_->pattern()));
 | 
| +
 | 
| +  // Different matching registrations can be added.
 | 
| +  provider_host1_->AddMatchingRegistration(registration2_.get());
 | 
| +  ASSERT_TRUE(PatternHasProcessToRun(registration2_->pattern()));
 | 
| +
 | 
| +  // Removing a matching registration will decrease the process refs for its
 | 
| +  // pattern.
 | 
| +  provider_host1_->RemoveMatchingRegistration(registration1_.get());
 | 
| +  ASSERT_FALSE(PatternHasProcessToRun(registration1_->pattern()));
 | 
| +
 | 
| +  // Multiple provider hosts could add the same matching registration.
 | 
| +  // The process refs will become 0 after all provider hosts removed them.
 | 
| +  provider_host2_->AddMatchingRegistration(registration2_.get());
 | 
| +  provider_host1_->RemoveMatchingRegistration(registration2_.get());
 | 
| +  ASSERT_TRUE(PatternHasProcessToRun(registration2_->pattern()));
 | 
| +  provider_host2_->RemoveMatchingRegistration(registration2_.get());
 | 
| +  ASSERT_FALSE(PatternHasProcessToRun(registration2_->pattern()));
 | 
|  }
 | 
|  
 | 
| -TEST_F(ServiceWorkerProviderHostTest, SetWaitingVersion_ProcessStatus) {
 | 
| -  provider_host1_->AssociateRegistration(registration_.get());
 | 
| -  ASSERT_TRUE(HasProcessToRun());
 | 
| -
 | 
| -  // Associating version_ to a provider_host's waiting version will internally
 | 
| -  // add the provider_host's process ref to the version.
 | 
| -  registration_->SetWaitingVersion(version_.get());
 | 
| -  ASSERT_TRUE(HasProcessToRun());
 | 
| +TEST_F(ServiceWorkerProviderHostTest, AssociatedRegistration_ProcessStatus) {
 | 
| +  // Associating the registration will also increase the process refs for
 | 
| +  // the registration's pattern.
 | 
| +  provider_host1_->AssociateRegistration(registration1_.get());
 | 
| +  ASSERT_TRUE(PatternHasProcessToRun(registration1_->pattern()));
 | 
|  
 | 
| -  // Re-associating the same version and provider_host should just work too.
 | 
| -  registration_->SetWaitingVersion(version_.get());
 | 
| -  ASSERT_TRUE(HasProcessToRun());
 | 
| -
 | 
| -  // Resetting the provider_host's waiting version should remove process refs
 | 
| -  // from the version.
 | 
| +  // Disassociating the registration shouldn't affect the process refs for
 | 
| +  // the registration's pattern.
 | 
|    provider_host1_->DisassociateRegistration();
 | 
| -  ASSERT_FALSE(HasProcessToRun());
 | 
| +  ASSERT_TRUE(PatternHasProcessToRun(registration1_->pattern()));
 | 
|  }
 | 
|  
 | 
| -TEST_F(ServiceWorkerProviderHostTest,
 | 
| -       SetWaitingVersion_MultipleHostsForSameProcess) {
 | 
| -  provider_host1_->AssociateRegistration(registration_.get());
 | 
| -  provider_host2_->AssociateRegistration(registration_.get());
 | 
| -  ASSERT_TRUE(HasProcessToRun());
 | 
| -
 | 
| -  // Associating version_ to two providers as waiting version.
 | 
| -  registration_->SetWaitingVersion(version_.get());
 | 
| -  ASSERT_TRUE(HasProcessToRun());
 | 
| +TEST_F(ServiceWorkerProviderHostTest, MatchRegistration) {
 | 
| +  provider_host1_->AddMatchingRegistration(registration1_.get());
 | 
| +  provider_host1_->AddMatchingRegistration(registration2_.get());
 | 
|  
 | 
| -  // Disassociating one provider_host shouldn't remove all process refs
 | 
| -  // from the version yet.
 | 
| -  provider_host1_->DisassociateRegistration();
 | 
| -  ASSERT_TRUE(HasProcessToRun());
 | 
| +  // Match registration should return the longest matching one.
 | 
| +  ASSERT_EQ(provider_host1_->MatchRegistration(), registration2_);
 | 
| +  provider_host1_->RemoveMatchingRegistration(registration2_.get());
 | 
| +  ASSERT_EQ(provider_host1_->MatchRegistration(), registration1_);
 | 
|  
 | 
| -  // Disassociating the other provider_host will remove all process refs.
 | 
| -  provider_host2_->DisassociateRegistration();
 | 
| -  ASSERT_FALSE(HasProcessToRun());
 | 
| +  // Should return nullptr after removing all matching registrations.
 | 
| +  provider_host1_->RemoveMatchingRegistration(registration1_.get());
 | 
| +  ASSERT_EQ(provider_host1_->MatchRegistration(), nullptr);
 | 
|  }
 | 
|  
 | 
|  }  // namespace content
 | 
| 
 |