diff options
-rw-r--r-- | chrome/renderer/chrome_content_renderer_client.cc | 4 | ||||
-rw-r--r-- | chrome/renderer/chrome_content_renderer_client.h | 4 | ||||
-rw-r--r-- | content/public/renderer/content_renderer_client.h | 4 | ||||
-rw-r--r-- | content/renderer/service_worker/service_worker_context_client.cc | 11 | ||||
-rw-r--r-- | content/renderer/service_worker/service_worker_context_client.h | 2 | ||||
-rw-r--r-- | extensions/renderer/dispatcher.cc | 67 | ||||
-rw-r--r-- | extensions/renderer/dispatcher.h | 4 |
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); |