summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/renderer/chrome_content_renderer_client.cc4
-rw-r--r--chrome/renderer/chrome_content_renderer_client.h4
-rw-r--r--content/public/renderer/content_renderer_client.h4
-rw-r--r--content/renderer/service_worker/service_worker_context_client.cc11
-rw-r--r--content/renderer/service_worker/service_worker_context_client.h2
-rw-r--r--extensions/renderer/dispatcher.cc67
-rw-r--r--extensions/renderer/dispatcher.h4
7 files changed, 23 insertions, 73 deletions
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc
index 96f9baa..9991e3b 100644
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -1644,10 +1644,8 @@ ChromeContentRendererClient::DidInitializeServiceWorkerContextOnWorkerThread(
}
void ChromeContentRendererClient::WillDestroyServiceWorkerContextOnWorkerThread(
- v8::Local<v8::Context> context,
const GURL& url) {
#if defined(ENABLE_EXTENSIONS)
- extensions::Dispatcher::WillDestroyServiceWorkerContextOnWorkerThread(context,
- url);
+ extensions::Dispatcher::WillDestroyServiceWorkerContextOnWorkerThread(url);
#endif
}
diff --git a/chrome/renderer/chrome_content_renderer_client.h b/chrome/renderer/chrome_content_renderer_client.h
index 6900854..63d8f19 100644
--- a/chrome/renderer/chrome_content_renderer_client.h
+++ b/chrome/renderer/chrome_content_renderer_client.h
@@ -154,9 +154,7 @@ class ChromeContentRendererClient : public content::ContentRendererClient {
void DidInitializeServiceWorkerContextOnWorkerThread(
v8::Local<v8::Context> context,
const GURL& url) override;
- void WillDestroyServiceWorkerContextOnWorkerThread(
- v8::Local<v8::Context> context,
- const GURL& url) override;
+ void WillDestroyServiceWorkerContextOnWorkerThread(const GURL& url) override;
#if defined(ENABLE_EXTENSIONS)
// Takes ownership.
void SetExtensionDispatcherForTest(
diff --git a/content/public/renderer/content_renderer_client.h b/content/public/renderer/content_renderer_client.h
index 39de3aa..8d840e9 100644
--- a/content/public/renderer/content_renderer_client.h
+++ b/content/public/renderer/content_renderer_client.h
@@ -299,9 +299,7 @@ class CONTENT_EXPORT ContentRendererClient {
// Notifies that a service worker context will be destroyed. This function
// is called from the worker thread.
- virtual void WillDestroyServiceWorkerContextOnWorkerThread(
- v8::Local<v8::Context> context,
- const GURL& url) {}
+ virtual void WillDestroyServiceWorkerContextOnWorkerThread(const GURL& url) {}
};
} // namespace content
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc
index 8295e7e..de57d4c 100644
--- a/content/renderer/service_worker/service_worker_context_client.cc
+++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -389,16 +389,15 @@ void ServiceWorkerContextClient::didEvaluateWorkerScript(bool success) {
void ServiceWorkerContextClient::didInitializeWorkerContext(
v8::Local<v8::Context> context,
const blink::WebURL& url) {
- // TODO(annekao): Remove WebURL parameter from Blink, it's at best redundant
- // given |script_url_|, and may be empty in the future.
- // Also remove m_documentURL from ServiceWorkerGlobalScopeProxy.
+ // TODO(annekao): Remove WebURL parameter from Blink (since url and script_url
+ // are equal). Also remove m_documentURL from ServiceWorkerGlobalScopeProxy.
+ DCHECK_EQ(script_url_, GURL(url));
GetContentClient()
->renderer()
->DidInitializeServiceWorkerContextOnWorkerThread(context, script_url_);
}
-void ServiceWorkerContextClient::willDestroyWorkerContext(
- v8::Local<v8::Context> context) {
+void ServiceWorkerContextClient::willDestroyWorkerContext() {
// At this point OnWorkerRunLoopStopped is already called, so
// worker_task_runner_->RunsTasksOnCurrentThread() returns false
// (while we're still on the worker thread).
@@ -413,7 +412,7 @@ void ServiceWorkerContextClient::willDestroyWorkerContext(
g_worker_client_tls.Pointer()->Set(NULL);
GetContentClient()->renderer()->WillDestroyServiceWorkerContextOnWorkerThread(
- context, script_url_);
+ script_url_);
}
void ServiceWorkerContextClient::workerContextDestroyed() {
diff --git a/content/renderer/service_worker/service_worker_context_client.h b/content/renderer/service_worker/service_worker_context_client.h
index 339d3b0..54fd780b 100644
--- a/content/renderer/service_worker/service_worker_context_client.h
+++ b/content/renderer/service_worker/service_worker_context_client.h
@@ -103,7 +103,7 @@ class ServiceWorkerContextClient
virtual void didEvaluateWorkerScript(bool success);
virtual void didInitializeWorkerContext(v8::Local<v8::Context> context,
const blink::WebURL& url);
- virtual void willDestroyWorkerContext(v8::Local<v8::Context> context);
+ virtual void willDestroyWorkerContext();
virtual void workerContextDestroyed();
virtual void reportException(const blink::WebString& error_message,
int line_number,
diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc
index 1203e6f..34324e2 100644
--- a/extensions/renderer/dispatcher.cc
+++ b/extensions/renderer/dispatcher.cc
@@ -197,41 +197,21 @@ class ServiceWorkerScriptContextSet {
ServiceWorkerScriptContextSet() {}
~ServiceWorkerScriptContextSet() {}
- void Insert(scoped_ptr<ScriptContext> context) {
+ void Insert(const GURL& url, scoped_ptr<ScriptContext> context) {
base::AutoLock lock(lock_);
- CHECK(FindScriptContext(context->v8_context()) == contexts_.end());
- contexts_.push_back(context.Pass());
+ CHECK(script_contexts_.find(url) == script_contexts_.end());
+ script_contexts_.set(url, context.Pass());
}
- void Remove(v8::Local<v8::Context> v8_context) {
+ void Remove(const GURL& url) {
base::AutoLock lock(lock_);
- ScriptContextList::iterator context_it = FindScriptContext(v8_context);
- // TODO(kalman): It would be good to CHECK(context_it != contexts_.end())
- // here, but service workers can be started before the extension has been
- // installed. See the length comment explaining why this happens, and
- // how to solve it, in DidInitializeServiceWorkerContextOnWorkerThread.
- // This does need to be fixed eventually, but for now, at least don't crash.
- if (context_it == contexts_.end())
- return;
- (*context_it)->Invalidate();
- contexts_.erase(context_it);
+ scoped_ptr<ScriptContext> context = script_contexts_.take_and_erase(url);
+ CHECK(context);
+ context->Invalidate();
}
private:
- using ScriptContextList = ScopedVector<ScriptContext>;
-
- // Returns an iterator to the ScriptContext associated with |v8_context|, or
- // contexts_.end() if not found.
- ScriptContextList::iterator FindScriptContext(
- v8::Local<v8::Context> v8_context) {
- for (auto it = contexts_.begin(); it != contexts_.end(); ++it) {
- if ((*it)->v8_context() == v8_context)
- return it;
- }
- return contexts_.end();
- }
-
- ScriptContextList contexts_;
+ base::ScopedPtrMap<GURL, scoped_ptr<ScriptContext>> script_contexts_;
mutable base::Lock lock_;
@@ -403,35 +383,15 @@ void Dispatcher::DidInitializeServiceWorkerContextOnWorkerThread(
const Extension* extension =
RendererExtensionRegistry::Get()->GetExtensionOrAppByURL(url);
- if (!extension) {
- // TODO(kalman): This is no good. Instead we need to either:
- //
- // - Hold onto the v8::Context and create the ScriptContext and install
- // our bindings when this extension is loaded.
- // - Deal with there being an extension ID (url.host()) but no
- // extension associated with it, then document that getBackgroundClient
- // may fail if the extension hasn't loaded yet.
- //
- // The former is safer, but is unfriendly to caching (e.g. session restore).
- // It seems to contradict the service worker idiom.
- //
- // The latter is friendly to caching, but running extension code without an
- // installed extension makes me nervous, and means that we won't be able to
- // expose arbitrary (i.e. capability-checked) extension APIs to service
- // workers. We will probably need to relax some assertions - we just need
- // to find them.
- //
- // Perhaps this could be solved with our own event on the service worker
- // saying that an extension is ready, and documenting that extension APIs
- // won't work before that event has fired?
+ if (!extension)
return;
- }
ScriptContext* context = new ScriptContext(
v8_context, nullptr, extension, Feature::SERVICE_WORKER_CONTEXT,
extension, Feature::SERVICE_WORKER_CONTEXT);
- g_service_worker_script_context_set.Get().Insert(make_scoped_ptr(context));
+ g_service_worker_script_context_set.Get().Insert(url,
+ make_scoped_ptr(context));
v8::Isolate* isolate = context->isolate();
@@ -478,10 +438,9 @@ void Dispatcher::WillReleaseScriptContext(
// static
void Dispatcher::WillDestroyServiceWorkerContextOnWorkerThread(
- v8::Local<v8::Context> v8_context,
const GURL& url) {
- if (url.SchemeIs(kExtensionScheme))
- g_service_worker_script_context_set.Get().Remove(v8_context);
+ if (RendererExtensionRegistry::Get()->GetExtensionOrAppByURL(url))
+ g_service_worker_script_context_set.Get().Remove(url);
}
void Dispatcher::DidCreateDocumentElement(blink::WebLocalFrame* frame) {
diff --git a/extensions/renderer/dispatcher.h b/extensions/renderer/dispatcher.h
index fb1714d..428efd7 100644
--- a/extensions/renderer/dispatcher.h
+++ b/extensions/renderer/dispatcher.h
@@ -102,9 +102,7 @@ class Dispatcher : public content::RenderProcessObserver,
int world_id);
// Runs on a different thread and should not use any member variables.
- static void WillDestroyServiceWorkerContextOnWorkerThread(
- v8::Local<v8::Context> v8_context,
- const GURL& url);
+ static void WillDestroyServiceWorkerContextOnWorkerThread(const GURL& url);
void DidCreateDocumentElement(blink::WebLocalFrame* frame);