| Index: extensions/renderer/dispatcher.cc
|
| diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc
|
| index 4fbc49b64f5334272b5f4d863064f61a5ece33a1..ad631e7dd18e1ce1bcc25e25ffcf685fe96e01a5 100644
|
| --- a/extensions/renderer/dispatcher.cc
|
| +++ b/extensions/renderer/dispatcher.cc
|
| @@ -199,7 +199,11 @@ class ServiceWorkerScriptContextSet {
|
|
|
| void Insert(const GURL& url, scoped_ptr<ScriptContext> context) {
|
| base::AutoLock lock(lock_);
|
| - CHECK(script_contexts_.find(url) == script_contexts_.end());
|
| + scoped_ptr<ScriptContext> existing = script_contexts_.take_and_erase(url);
|
| + // This should be CHECK(!existing), but can't until these ScriptContexts
|
| + // are keyed on v8::Contexts rather than URLs. See crbug.com/525965.
|
| + if (existing)
|
| + existing->Invalidate();
|
| script_contexts_.set(url, context.Pass());
|
| }
|
|
|
| @@ -358,6 +362,15 @@ void Dispatcher::DidInitializeServiceWorkerContextOnWorkerThread(
|
| const GURL& url) {
|
| const base::TimeTicks start_time = base::TimeTicks::Now();
|
|
|
| + if (!url.SchemeIs(kExtensionScheme) &&
|
| + !url.SchemeIs(kExtensionResourceScheme)) {
|
| + // Early-out if this isn't a chrome-extension:// or resource scheme,
|
| + // because looking up the extension registry is unnecessary if it's not.
|
| + // Checking this will also skip over hosted apps, which is the desired
|
| + // behavior - hosted app service workers are not our concern.
|
| + return;
|
| + }
|
| +
|
| const Extension* extension =
|
| RendererExtensionRegistry::Get()->GetExtensionOrAppByURL(url);
|
|
|
| @@ -417,8 +430,11 @@ void Dispatcher::WillReleaseScriptContext(
|
| // static
|
| void Dispatcher::WillDestroyServiceWorkerContextOnWorkerThread(
|
| const GURL& url) {
|
| - if (RendererExtensionRegistry::Get()->GetExtensionOrAppByURL(url))
|
| + if (url.SchemeIs(kExtensionScheme) ||
|
| + url.SchemeIs(kExtensionResourceScheme)) {
|
| + // See comment in DidInitializeServiceWorkerContextOnWorkerThread.
|
| g_service_worker_script_context_set.Get().Remove(url);
|
| + }
|
| }
|
|
|
| void Dispatcher::DidCreateDocumentElement(blink::WebLocalFrame* frame) {
|
|
|