Index: content/browser/service_worker/service_worker_context_core.cc |
diff --git a/content/browser/service_worker/service_worker_context_core.cc b/content/browser/service_worker/service_worker_context_core.cc |
index 06e1fbb055be99c108f89e1736ae45e859478684..4243c764530b076f9a876f50c83110a25873ab68 100644 |
--- a/content/browser/service_worker/service_worker_context_core.cc |
+++ b/content/browser/service_worker/service_worker_context_core.cc |
@@ -28,6 +28,7 @@ |
namespace content { |
namespace { |
+ |
void SuccessCollectorCallback(const base::Closure& done_closure, |
bool* overall_success, |
ServiceWorkerStatusCode status) { |
@@ -45,6 +46,13 @@ void SuccessReportingCallback( |
callback.Run(result ? ServiceWorkerStatusCode::SERVICE_WORKER_OK |
: ServiceWorkerStatusCode::SERVICE_WORKER_ERROR_FAILED); |
} |
+ |
+bool IsSameOriginClientProviderHost(const GURL& origin, |
+ ServiceWorkerProviderHost* host) { |
+ return host->provider_type() == SERVICE_WORKER_PROVIDER_FOR_CONTROLLEE && |
+ host->document_url().GetOrigin() == origin; |
+} |
+ |
} // namespace |
const base::FilePath::CharType |
@@ -66,7 +74,7 @@ void ServiceWorkerContextCore::ProviderHostIterator::Advance() { |
// Advance the inner iterator. If an element is reached, we're done. |
provider_host_iterator_->Advance(); |
- if (!provider_host_iterator_->IsAtEnd()) |
+ if (ForwardUntilMatchingProviderHost()) |
return; |
// Advance the outer iterator until an element is reached, or end is hit. |
@@ -76,7 +84,7 @@ void ServiceWorkerContextCore::ProviderHostIterator::Advance() { |
return; |
ProviderMap* provider_map = process_iterator_->GetCurrentValue(); |
provider_host_iterator_.reset(new ProviderMap::iterator(provider_map)); |
- if (!provider_host_iterator_->IsAtEnd()) |
+ if (ForwardUntilMatchingProviderHost()) |
return; |
} |
} |
@@ -87,8 +95,9 @@ bool ServiceWorkerContextCore::ProviderHostIterator::IsAtEnd() { |
} |
ServiceWorkerContextCore::ProviderHostIterator::ProviderHostIterator( |
- ProcessToProviderMap* map) |
- : map_(map) { |
+ ProcessToProviderMap* map, |
+ const ProviderHostPredicate& predicate) |
+ : map_(map), predicate_(predicate) { |
DCHECK(map); |
Initialize(); |
} |
@@ -99,12 +108,22 @@ void ServiceWorkerContextCore::ProviderHostIterator::Initialize() { |
while (!process_iterator_->IsAtEnd()) { |
ProviderMap* provider_map = process_iterator_->GetCurrentValue(); |
provider_host_iterator_.reset(new ProviderMap::iterator(provider_map)); |
- if (!provider_host_iterator_->IsAtEnd()) |
+ if (ForwardUntilMatchingProviderHost()) |
return; |
process_iterator_->Advance(); |
} |
} |
+bool ServiceWorkerContextCore::ProviderHostIterator:: |
+ ForwardUntilMatchingProviderHost() { |
+ while (!provider_host_iterator_->IsAtEnd()) { |
+ if (predicate_.is_null() || predicate_.Run(GetProviderHost())) |
+ return true; |
+ provider_host_iterator_->Advance(); |
+ } |
+ return false; |
+} |
+ |
ServiceWorkerContextCore::ServiceWorkerContextCore( |
const base::FilePath& path, |
const scoped_refptr<base::SequencedTaskRunner>& cache_task_runner, |
@@ -201,22 +220,37 @@ void ServiceWorkerContextCore::RemoveAllProviderHostsForProcess( |
scoped_ptr<ServiceWorkerContextCore::ProviderHostIterator> |
ServiceWorkerContextCore::GetProviderHostIterator() { |
- return make_scoped_ptr(new ProviderHostIterator(providers_.get())); |
+ return make_scoped_ptr(new ProviderHostIterator( |
+ providers_.get(), ProviderHostIterator::ProviderHostPredicate())); |
} |
-void ServiceWorkerContextCore::RegisterClientIDForProviderHost( |
+scoped_ptr<ServiceWorkerContextCore::ProviderHostIterator> |
+ServiceWorkerContextCore::GetClientProviderHostIterator(const GURL& origin) { |
+ return make_scoped_ptr(new ProviderHostIterator( |
+ providers_.get(), base::Bind(IsSameOriginClientProviderHost, origin))); |
+} |
+ |
+void ServiceWorkerContextCore::RegisterProviderHostByClientID( |
const std::string& client_uuid, |
ServiceWorkerProviderHost* provider_host) { |
DCHECK(!ContainsKey(*provider_by_uuid_, client_uuid)); |
(*provider_by_uuid_)[client_uuid] = provider_host; |
} |
-void ServiceWorkerContextCore::UnregisterClientIDForProviderHost( |
+void ServiceWorkerContextCore::UnregisterProviderHostByClientID( |
const std::string& client_uuid) { |
DCHECK(ContainsKey(*provider_by_uuid_, client_uuid)); |
provider_by_uuid_->erase(client_uuid); |
} |
+ServiceWorkerProviderHost* ServiceWorkerContextCore::GetProviderHostByClientID( |
+ const std::string& client_uuid) { |
+ auto found = provider_by_uuid_->find(client_uuid); |
+ if (found == provider_by_uuid_->end()) |
+ return nullptr; |
+ return found->second; |
+} |
+ |
void ServiceWorkerContextCore::RegisterServiceWorker( |
const GURL& pattern, |
const GURL& script_url, |