diff options
author | finnur@chromium.org <finnur@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-15 03:24:36 +0000 |
---|---|---|
committer | finnur@chromium.org <finnur@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-15 03:24:36 +0000 |
commit | cf9a246cf386c7af0fb6524ac5d025c0d4e8563a (patch) | |
tree | 914b55375eee47f6d21f2fc3f106c4ba506637ec /chrome/browser | |
parent | 0c48c17f7ebcc0c8f79eba1aeae56d32b3c2f03f (diff) | |
download | chromium_src-cf9a246cf386c7af0fb6524ac5d025c0d4e8563a.zip chromium_src-cf9a246cf386c7af0fb6524ac5d025c0d4e8563a.tar.gz chromium_src-cf9a246cf386c7af0fb6524ac5d025c0d4e8563a.tar.bz2 |
EFD now notifies EPM of renderviews created, which in turn notifies the renderer of page actions that it knows about.
Remove generic event "page-action-executed" in favor of page action specific event (sent as extension_id/page_action_id).
In the bindings, we now setup events for each page action we know about so we can register for specific events, and not receive broadcast events from all page actions. To setup these events I added a GetCurrentPageActions() to extension_process_bindings.cc and a helper function GetCurrentExtensionId().
And, finally, I simplified the page action background page by removing the check to see if we are already subscribed to the feed (since we now support multiple feed readers, it doesn't make sense anymore to always check Google Reader). This check might make a comeback later in a different form.
BUG=13936
TEST=The RSS sample extension should work as before.
Review URL: http://codereview.chromium.org/155514
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@20714 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
8 files changed, 71 insertions, 4 deletions
diff --git a/chrome/browser/extensions/extension_browser_event_router.cc b/chrome/browser/extensions/extension_browser_event_router.cc index 3bd807a..c7a5b33 100644 --- a/chrome/browser/extensions/extension_browser_event_router.cc +++ b/chrome/browser/extensions/extension_browser_event_router.cc @@ -329,6 +329,7 @@ void ExtensionBrowserEventRouter::TabChangedAt(TabContents* contents, void ExtensionBrowserEventRouter::TabStripEmpty() { } void ExtensionBrowserEventRouter::PageActionExecuted(Profile* profile, + std::string extension_id, std::string page_action_id, int tab_id, std::string url) { @@ -346,5 +347,6 @@ void ExtensionBrowserEventRouter::PageActionExecuted(Profile* profile, std::string json_args; JSONWriter::Write(&args, false, &json_args); - DispatchEvent(profile, events::kOnPageActionExecuted, json_args); + std::string event_name = extension_id + std::string("/") + page_action_id; + DispatchEvent(profile, event_name.c_str(), json_args); } diff --git a/chrome/browser/extensions/extension_browser_event_router.h b/chrome/browser/extensions/extension_browser_event_router.h index 0cfd075..d2f7613 100644 --- a/chrome/browser/extensions/extension_browser_event_router.h +++ b/chrome/browser/extensions/extension_browser_event_router.h @@ -50,6 +50,7 @@ class ExtensionBrowserEventRouter : public TabStripModelObserver, // PageActions. void PageActionExecuted(Profile* profile, + std::string extension_id, std::string page_action_id, int tab_id, std::string url); diff --git a/chrome/browser/extensions/extension_event_names.cc b/chrome/browser/extensions/extension_event_names.cc index f4fd6e7..214d37b 100644 --- a/chrome/browser/extensions/extension_event_names.cc +++ b/chrome/browser/extensions/extension_event_names.cc @@ -6,7 +6,6 @@ namespace extension_event_names { -const char kOnPageActionExecuted[] = "page-action-executed"; const char kOnTabAttached[] = "tab-attached"; const char kOnTabCreated[] = "tab-created"; const char kOnTabDetached[] = "tab-detached"; diff --git a/chrome/browser/extensions/extension_event_names.h b/chrome/browser/extensions/extension_event_names.h index 9b9e3f2..3e3673a 100644 --- a/chrome/browser/extensions/extension_event_names.h +++ b/chrome/browser/extensions/extension_event_names.h @@ -9,7 +9,6 @@ namespace extension_event_names { -extern const char kOnPageActionExecuted[]; extern const char kOnTabAttached[]; extern const char kOnTabCreated[]; extern const char kOnTabDetached[]; diff --git a/chrome/browser/extensions/extension_function_dispatcher.cc b/chrome/browser/extensions/extension_function_dispatcher.cc index 8238595..43aca30 100644 --- a/chrome/browser/extensions/extension_function_dispatcher.cc +++ b/chrome/browser/extensions/extension_function_dispatcher.cc @@ -13,6 +13,7 @@ #include "chrome/browser/extensions/extension_message_service.h" #include "chrome/browser/extensions/extension_page_actions_module.h" #include "chrome/browser/extensions/extension_page_actions_module_constants.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_tabs_module.h" #include "chrome/browser/extensions/extension_tabs_module_constants.h" #include "chrome/browser/profile.h" @@ -188,6 +189,11 @@ ExtensionFunctionDispatcher::ExtensionFunctionDispatcher( // Ensure the message service is initialized. ExtensionMessageService::GetInstance(profile()->GetRequestContext())->Init(); + + // Notify the ExtensionProcessManager that the view was created. + ExtensionProcessManager* epm = profile()->GetExtensionProcessManager(); + epm->RegisterExtensionProcess(extension_id(), + render_view_host->process()->pid()); } ExtensionFunctionDispatcher::~ExtensionFunctionDispatcher() { diff --git a/chrome/browser/extensions/extension_process_manager.cc b/chrome/browser/extensions/extension_process_manager.cc index 4c2047b..3018ea8 100644 --- a/chrome/browser/extensions/extension_process_manager.cc +++ b/chrome/browser/extensions/extension_process_manager.cc @@ -9,9 +9,11 @@ #include "chrome/browser/extensions/extensions_service.h" #include "chrome/browser/profile.h" #include "chrome/browser/renderer_host/site_instance.h" +#include "chrome/browser/renderer_host/render_view_host.h" #include "chrome/common/extensions/extension.h" #include "chrome/common/notification_service.h" #include "chrome/common/notification_type.h" +#include "chrome/common/render_messages.h" static void CreateBackgroundHosts( ExtensionProcessManager* manager, const ExtensionList* extensions) { @@ -33,6 +35,10 @@ ExtensionProcessManager::ExtensionProcessManager(Profile* profile) NotificationService::AllSources()); registrar_.Add(this, NotificationType::EXTENSION_HOST_DESTROYED, Source<Profile>(profile)); + registrar_.Add(this, NotificationType::RENDERER_PROCESS_TERMINATED, + NotificationService::AllSources()); + registrar_.Add(this, NotificationType::RENDERER_PROCESS_CLOSED, + NotificationService::AllSources()); } ExtensionProcessManager::~ExtensionProcessManager() { @@ -78,6 +84,39 @@ ExtensionHost* ExtensionProcessManager::CreateBackgroundHost( return host; } +void ExtensionProcessManager::RegisterExtensionProcess( + std::string extension_id, int process_id) { + ProcessIDMap::const_iterator it = process_ids_.find(extension_id); + if (it != process_ids_.end() && (*it).second == process_id) + return; + + process_ids_[extension_id] = process_id; + + ExtensionsService* extension_service = + browsing_instance_->profile()->GetExtensionsService(); + + std::vector<std::string> page_action_ids; + Extension* extension = extension_service->GetExtensionById(extension_id); + for (PageActionMap::const_iterator i = extension->page_actions().begin(); + i != extension->page_actions().end(); ++i) { + page_action_ids.push_back(i->first); + } + + RenderProcessHost* rph = RenderProcessHost::FromID(process_id); + rph->Send(new ViewMsg_Extension_UpdatePageActions(extension_id, + page_action_ids)); +} + +void ExtensionProcessManager::UnregisterExtensionProcess(int process_id) { + ProcessIDMap::iterator it = process_ids_.begin(); + while (it != process_ids_.end()) { + if (it->second == process_id) + process_ids_.erase(it++); + else + ++it; + } +} + SiteInstance* ExtensionProcessManager::GetSiteInstanceForURL(const GURL& url) { return browsing_instance_->GetSiteInstanceForURL(url); } @@ -122,6 +161,13 @@ void ExtensionProcessManager::Observe(NotificationType type, break; } + case NotificationType::RENDERER_PROCESS_TERMINATED: + case NotificationType::RENDERER_PROCESS_CLOSED: { + RenderProcessHost* host = Source<RenderProcessHost>(source).ptr(); + UnregisterExtensionProcess(host->pid()); + break; + } + default: NOTREACHED(); } diff --git a/chrome/browser/extensions/extension_process_manager.h b/chrome/browser/extensions/extension_process_manager.h index 58f6639..e3d6b76 100644 --- a/chrome/browser/extensions/extension_process_manager.h +++ b/chrome/browser/extensions/extension_process_manager.h @@ -5,7 +5,9 @@ #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_PROCESS_MANAGER_H_ #define CHROME_BROWSER_EXTENSIONS_EXTENSION_PROCESS_MANAGER_H_ +#include <map> #include <set> +#include <string> #include "base/ref_counted.h" #include "chrome/common/notification_registrar.h" @@ -43,6 +45,13 @@ class ExtensionProcessManager : public NotificationObserver { // Returns the SiteInstance that the given URL belongs to. SiteInstance* GetSiteInstanceForURL(const GURL& url); + // Register an extension process by |extension_id| and specifying which + // |process_id| it belongs to. + void RegisterExtensionProcess(std::string extension_id, int process_id); + + // Unregister an extension process with specified |process_id|. + void UnregisterExtensionProcess(int process_id); + // NotificationObserver: virtual void Observe(NotificationType type, const NotificationSource& source, @@ -69,6 +78,10 @@ class ExtensionProcessManager : public NotificationObserver { // controls process grouping. scoped_refptr<BrowsingInstance> browsing_instance_; + // A map of extension ID to the render_process_id that the extension lives in. + typedef std::map<std::string, int> ProcessIDMap; + ProcessIDMap process_ids_; + DISALLOW_COPY_AND_ASSIGN(ExtensionProcessManager); }; diff --git a/chrome/browser/views/location_bar_view.cc b/chrome/browser/views/location_bar_view.cc index eb6d629..d92b5b4 100644 --- a/chrome/browser/views/location_bar_view.cc +++ b/chrome/browser/views/location_bar_view.cc @@ -1277,7 +1277,8 @@ bool LocationBarView::PageActionImageView::OnMousePressed( const views::MouseEvent& event) { // Our PageAction icon was clicked on, notify proper authorities. ExtensionBrowserEventRouter::GetInstance()->PageActionExecuted( - profile_, page_action_->id(), current_tab_id_, current_url_.spec()); + profile_, page_action_->extension_id(), page_action_->id(), + current_tab_id_, current_url_.spec()); return true; } |