Index: chrome/renderer/extensions/chrome_v8_context_set.cc |
diff --git a/chrome/renderer/extensions/chrome_v8_context_set.cc b/chrome/renderer/extensions/chrome_v8_context_set.cc |
index 4d8a222f6834fb8f839decc5167667c605bd70ed..3ec45261ce9c8642b46f0fa157c7eeabdc60026b 100644 |
--- a/chrome/renderer/extensions/chrome_v8_context_set.cc |
+++ b/chrome/renderer/extensions/chrome_v8_context_set.cc |
@@ -80,8 +80,7 @@ void ChromeV8ContextSet::Remove(ChromeV8Context* context) { |
} |
} |
-ChromeV8ContextSet::ContextSet ChromeV8ContextSet::GetAll() |
- const { |
+ChromeV8ContextSet::ContextSet ChromeV8ContextSet::GetAll() const { |
return contexts_; |
} |
@@ -151,4 +150,19 @@ void ChromeV8ContextSet::DispatchChromeHiddenMethod( |
} |
} |
+void ChromeV8ContextSet::OnExtensionUnloaded(const std::string& extension_id) { |
+ ContextSet contexts = GetAll(); |
+ |
+ // Clean up contexts belonging to the unloaded extension. This is done so |
+ // that content scripts (which remain injected into the page) don't continue |
+ // receiving events and sending messages. |
+ for (ContextSet::iterator it = contexts.begin(); it != contexts.end(); |
+ ++it) { |
+ if ((*it)->extension() && (*it)->extension()->id() == extension_id) { |
+ (*it)->DispatchOnUnloadEvent(); |
+ Remove(*it); |
+ } |
+ } |
+} |
+ |
} // namespace extensions |