Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(130)

Unified Diff: content/browser/service_worker/service_worker_context_core.cc

Issue 1007133002: ServiceWorker: Support includeUncontrolled option in clients.matchAll() (1/2, chromium) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add EXPORT Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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,

Powered by Google App Engine
This is Rietveld 408576698