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

Unified Diff: chrome/browser/extensions/extension_service.cc

Issue 10911300: Move ExtensionAction from common/ to browser/. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: proof of concept Created 8 years, 3 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: chrome/browser/extensions/extension_service.cc
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index 03c05633a45b6a9f565be199a828a759791e86de..ba4e3612f6eceba245a44520ad58876fb557481f 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -350,6 +350,10 @@ ExtensionService::ExtensionService(Profile* profile,
registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_PROCESS_TERMINATED,
content::NotificationService::AllBrowserContextsAndSources());
+ registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED,
+ content::NotificationService::AllBrowserContextsAndSources());
+ registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
+ content::NotificationService::AllBrowserContextsAndSources());
registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CREATED,
content::NotificationService::AllBrowserContextsAndSources());
registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
@@ -1858,6 +1862,10 @@ void ExtensionService::UnloadAllExtensions() {
terminated_extensions_.Clear();
extension_runtime_data_.clear();
+ STLDeleteValues(&page_actions_);
Jeffrey Yasskin 2012/09/14 19:18:33 Need to double-check if there are other places tha
+ STLDeleteValues(&browser_actions_);
+ STLDeleteValues(&script_badges_);
+
// TODO(erikkay) should there be a notification for this? We can't use
// EXTENSION_UNLOADED since that implies that the extension has been disabled
// or uninstalled, and UnloadAll is just part of shutdown.
@@ -2292,6 +2300,22 @@ gfx::Image ExtensionService::GetOmniboxPopupIcon(
return gfx::Image(omnibox_popup_icon_manager_.GetIcon(extension_id));
}
+ExtensionAction* ExtensionService::GetPageAction(
+ const Extension& extension) const {
+ return ContainsKey(page_actions_, extension.id()) ?
+ page_actions_.find(extension.id())->second : NULL;
+}
+ExtensionAction* ExtensionService::GetBrowserAction(
+ const Extension& extension) const {
+ return ContainsKey(browser_actions_, extension.id()) ?
+ browser_actions_.find(extension.id())->second : NULL;
+}
+ExtensionAction* ExtensionService::GetScriptBadge(
+ const Extension& extension) const {
+ return ContainsKey(script_badges_, extension.id()) ?
+ script_badges_.find(extension.id())->second : NULL;
+}
+
bool ExtensionService::OnExternalExtensionFileFound(
const std::string& id,
const Version* version,
@@ -2395,6 +2419,52 @@ void ExtensionService::Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) {
switch (type) {
+ case chrome::NOTIFICATION_EXTENSION_LOADED: {
Aaron Boodman 2012/09/16 01:42:50 This is the kind of code I'm trying to keep out of
not at google - send to devlin 2012/09/27 00:46:10 Not that this solves the LOADED/UNLOADED problem,
+ if (profile_ !=
+ content::Source<Profile>(source).ptr()->GetOriginalProfile()) {
+ break;
+ }
+
+ const Extension* extension =
+ content::Details<const Extension>(details).ptr();
+ if (extension->page_action() &&
+ !ContainsKey(page_actions_, extension->id())) {
+ page_actions_[extension->id()] =
+ new ExtensionAction(extension->id(), *extension->page_action());
+ }
+ if (extension->browser_action() &&
+ !ContainsKey(browser_actions_, extension->id())) {
+ browser_actions_[extension->id()] =
+ new ExtensionAction(extension->id(), *extension->browser_action());
+ }
+ DCHECK(extension->script_badge());
+ if (!ContainsKey(script_badges_, extension->id())) {
+ script_badges_[extension->id()] =
+ new ExtensionAction(extension->id(), *extension->script_badge());
+ }
+ break;
+ }
+ case chrome::NOTIFICATION_EXTENSION_UNLOADED: {
+ if (profile_ !=
+ content::Source<Profile>(source).ptr()->GetOriginalProfile()) {
+ break;
+ }
+
+ const Extension* extension =
+ content::Details<UnloadedExtensionInfo>(details)->extension;
+ if (ContainsKey(page_actions_, extension->id())) {
+ delete page_actions_[extension->id()];
+ page_actions_.erase(extension->id());
+ }
+ if (ContainsKey(browser_actions_, extension->id())) {
+ delete browser_actions_[extension->id()];
+ browser_actions_.erase(extension->id());
+ }
+ if (ContainsKey(script_badges_, extension->id())) {
+ script_badges_.erase(extension->id());
+ }
+ break;
+ }
case chrome::NOTIFICATION_EXTENSION_PROCESS_TERMINATED: {
if (profile_ !=
content::Source<Profile>(source).ptr()->GetOriginalProfile()) {

Powered by Google App Engine
This is Rietveld 408576698