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

Unified Diff: extensions/browser/service_worker_task_queue.cc

Issue 2943583002: [extension SW] Support lazy events from extension service workers. (Closed)
Patch Set: sync @tott Created 3 years, 6 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: extensions/browser/service_worker_task_queue.cc
diff --git a/extensions/browser/service_worker_task_queue.cc b/extensions/browser/service_worker_task_queue.cc
new file mode 100644
index 0000000000000000000000000000000000000000..35eea0f02824e21ae2f3cd7ef01de3b31a61ca9d
--- /dev/null
+++ b/extensions/browser/service_worker_task_queue.cc
@@ -0,0 +1,98 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "extensions/browser/service_worker_task_queue.h"
+
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/service_worker_context.h"
+#include "content/public/browser/storage_partition.h"
+#include "extensions/browser/event_router.h"
+#include "extensions/browser/lazy_context_id.h"
+#include "extensions/browser/service_worker_task_queue_factory.h"
+#include "extensions/common/constants.h"
+
+using content::BrowserContext;
+using content::BrowserThread;
+
+namespace extensions {
+
+namespace {
+
+void FinishTask(const LazyContextTaskQueue::PendingTask& task,
+ const ExtensionId& extension_id,
+ int process_id,
+ int thread_id) {
+ auto params = base::MakeUnique<LazyContextTaskQueue::ContextInfo>(
+ extension_id, content::RenderProcessHost::FromID(process_id), thread_id,
+ GURL());
+ task.Run(std::move(params));
+}
+
+void DidStartActiveWorkerForPattern(
+ const LazyContextTaskQueue::PendingTask& task,
+ const ExtensionId& extension_id,
+ int process_id,
+ int thread_id) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+ content::BrowserThread::PostTask(
+ content::BrowserThread::UI, FROM_HERE,
+ base::Bind(FinishTask, task, extension_id, process_id, thread_id));
+}
+
+void DidStartActiveWorkerFail() {
+ DCHECK(false) << "DidStartActiveWorkerFail";
+ // TODO(lazyboy): Handle failure case.
+}
+
+void GetServiceWorkerInfoOnIO(
+ const GURL& pattern,
+ const ExtensionId& extension_id,
+ content::ServiceWorkerContext* service_worker_context,
+ const LazyContextTaskQueue::PendingTask& task) {
+ service_worker_context->StartActiveWorkerForPattern(
+ pattern,
+ base::BindOnce(&DidStartActiveWorkerForPattern, task, extension_id),
+ base::BindOnce(&DidStartActiveWorkerFail));
+}
+
+} // namespace
+
+ServiceWorkerTaskQueue::ServiceWorkerTaskQueue(
+ content::BrowserContext* browser_context) {}
+
+ServiceWorkerTaskQueue::~ServiceWorkerTaskQueue() {}
+
+// static
+ServiceWorkerTaskQueue* ServiceWorkerTaskQueue::Get(
+ content::BrowserContext* context) {
+ return ServiceWorkerTaskQueueFactory::GetForBrowserContext(context);
+}
+
+bool ServiceWorkerTaskQueue::ShouldEnqueueTask(content::BrowserContext* context,
+ const Extension* extension) {
+ // We call StartWorker every time we want to dispatch an event to an extension
+ // Service worker.
+ // TODO(lazyboy): Is that a problem?
+ return true;
+}
+
+void ServiceWorkerTaskQueue::AddPendingTaskToDispatchEvent(
+ LazyContextId* context_id,
+ const LazyContextTaskQueue::PendingTask& task) {
+ DCHECK(context_id->is_for_service_worker());
+ content::StoragePartition* partition =
+ BrowserContext::GetStoragePartitionForSite(
+ context_id->browser_context(), context_id->service_worker_scope());
+ content::ServiceWorkerContext* service_worker_context =
+ partition->GetServiceWorkerContext();
+
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE,
+ base::Bind(&GetServiceWorkerInfoOnIO, context_id->service_worker_scope(),
+ context_id->extension_id(), service_worker_context, task));
+}
+
+} // namespace extensions
« no previous file with comments | « extensions/browser/service_worker_task_queue.h ('k') | extensions/browser/service_worker_task_queue_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698