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 60991352a81c79f3d039f3139918820416aadf0a..d4d02cf62c5673cc89fc387d42287cc48767c512 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,12 @@ void SuccessReportingCallback( |
callback.Run(result ? ServiceWorkerStatusCode::SERVICE_WORKER_OK |
: ServiceWorkerStatusCode::SERVICE_WORKER_ERROR_FAILED); |
} |
+ |
+bool IsSameOriginProviderHost(const GURL& origin, |
+ ServiceWorkerProviderHost* host) { |
+ return host->document_url().GetOrigin() == origin; |
+} |
+ |
} // namespace |
const base::FilePath::CharType |
@@ -66,7 +73,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 +83,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 +94,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 +107,23 @@ 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(provider_host_iterator_->GetCurrentValue())) |
nhiroki
2015/03/16 06:37:58
nit: Calling ProviderHostIterator::GetProviderHost
kinuko
2015/03/20 08:19:39
Done.
|
+ 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::GetProviderHostIteratorForOrigin(const GURL& origin) { |
+ return make_scoped_ptr(new ProviderHostIterator( |
+ providers_.get(), base::Bind(IsSameOriginProviderHost, 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, |