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

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

Issue 10114015: Fix bug where transient pages would miss events dispatched while it was (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 8 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_message_service.cc
diff --git a/chrome/browser/extensions/extension_message_service.cc b/chrome/browser/extensions/extension_message_service.cc
index ccb555e958f3f27a2915397a4b5acd945f0aa62a..2fe1656e12c8edebe4f126631fccd2fd43bfc487 100644
--- a/chrome/browser/extensions/extension_message_service.cc
+++ b/chrome/browser/extensions/extension_message_service.cc
@@ -13,6 +13,7 @@
#include "chrome/browser/extensions/extension_host.h"
#include "chrome/browser/extensions/extension_process_manager.h"
#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_system.h"
#include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/extensions/lazy_background_task_queue.h"
#include "chrome/browser/extensions/process_map.h"
@@ -47,16 +48,25 @@ using content::WebContents;
struct ExtensionMessageService::MessagePort {
content::RenderProcessHost* process;
int routing_id;
- explicit MessagePort(content::RenderProcessHost* process = NULL,
- int routing_id = MSG_ROUTING_CONTROL)
- : process(process), routing_id(routing_id) {}
+ std::string extension_id;
+ void* background_host_ptr; // used in IncrementLazyKeepaliveCount
+
+ MessagePort()
+ : process(NULL),
+ routing_id(MSG_ROUTING_CONTROL),
+ background_host_ptr(NULL) {}
+ MessagePort(content::RenderProcessHost* process,
+ int routing_id,
+ const std::string& extension_id)
+ : process(process),
+ routing_id(routing_id),
+ extension_id(extension_id),
+ background_host_ptr(NULL) {}
};
struct ExtensionMessageService::MessageChannel {
ExtensionMessageService::MessagePort opener;
ExtensionMessageService::MessagePort receiver;
- std::string source_extension_id;
- std::string target_extension_id;
};
struct ExtensionMessageService::OpenChannelParams {
@@ -89,8 +99,7 @@ namespace {
static base::StaticAtomicSequenceNumber g_next_channel_id;
static void DispatchOnConnect(const ExtensionMessageService::MessagePort& port,
- int dest_port_id,
- const std::string& channel_name,
+ int dest_port_id, const std::string& channel_name,
Yoyo Zhou 2012/04/19 21:47:13 nit: why this change?
Matt Perry 2012/04/19 22:21:53 Just bringing it up to style code: http://dev.chro
Yoyo Zhou 2012/04/19 22:32:55 It doesn't look particularly recommended for funct
Matt Perry 2012/04/19 22:35:00 See bullet point that starts "For function declara
const std::string& tab_json,
const std::string& source_extension_id,
const std::string& target_extension_id) {
@@ -124,24 +133,30 @@ static content::RenderProcessHost* GetExtensionProcess(
return site_instance->GetProcess();
}
-static void IncrementLazyKeepaliveCount(content::RenderProcessHost* process,
- const std::string& extension_id) {
- Profile* profile = Profile::FromBrowserContext(process->GetBrowserContext());
- const Extension* extension = profile->GetExtensionService()->extensions()->
- GetByID(extension_id);
- if (extension)
- profile->GetExtensionProcessManager()->IncrementLazyKeepaliveCount(
- extension);
+static void IncrementLazyKeepaliveCount(
+ ExtensionMessageService::MessagePort* port) {
+ Profile* profile =
+ Profile::FromBrowserContext(port->process->GetBrowserContext());
+ ExtensionProcessManager* pm =
+ ExtensionSystem::Get(profile)->process_manager();
+ ExtensionHost* host = pm->GetBackgroundHostForExtension(port->extension_id);
+ if (host && host->extension()->has_lazy_background_page())
+ pm->IncrementLazyKeepaliveCount(host->extension());
+
+ // Keep track of the background host, so when we decrement, we only do so if
+ // the host hasn't reloaded.
+ port->background_host_ptr = host;
}
-static void DecrementLazyKeepaliveCount(content::RenderProcessHost* process,
- const std::string& extension_id) {
- Profile* profile = Profile::FromBrowserContext(process->GetBrowserContext());
- const Extension* extension = profile->GetExtensionService()->extensions()->
- GetByID(extension_id);
- if (extension)
- profile->GetExtensionProcessManager()->DecrementLazyKeepaliveCount(
- extension);
+static void DecrementLazyKeepaliveCount(
+ ExtensionMessageService::MessagePort* port) {
+ Profile* profile =
+ Profile::FromBrowserContext(port->process->GetBrowserContext());
+ ExtensionProcessManager* pm =
+ ExtensionSystem::Get(profile)->process_manager();
+ ExtensionHost* host = pm->GetBackgroundHostForExtension(port->extension_id);
+ if (host && host == port->background_host_ptr)
+ pm->DecrementLazyKeepaliveCount(host->extension());
}
} // namespace
@@ -195,7 +210,8 @@ void ExtensionMessageService::OpenChannelToExtension(
// which depends on whether the extension uses spanning or split mode.
MessagePort receiver(
GetExtensionProcess(profile, target_extension_id),
- MSG_ROUTING_CONTROL);
+ MSG_ROUTING_CONTROL,
+ target_extension_id);
WebContents* source_contents = tab_util::GetWebContentsByID(
source_process_id, source_routing_id);
@@ -237,12 +253,13 @@ void ExtensionMessageService::OpenChannelToTab(
receiver.process = contents->web_contents()->GetRenderProcessHost();
receiver.routing_id =
contents->web_contents()->GetRenderViewHost()->GetRoutingID();
+ receiver.extension_id = extension_id;
}
if (contents && contents->web_contents()->GetController().NeedsReload()) {
// The tab isn't loaded yet. Don't attempt to connect. Treat this as a
// disconnect.
- DispatchOnDisconnect(MessagePort(source, MSG_ROUTING_CONTROL),
+ DispatchOnDisconnect(MessagePort(source, MSG_ROUTING_CONTROL, extension_id),
GET_OPPOSITE_PORT_ID(receiver_port_id), true);
return;
}
@@ -269,7 +286,7 @@ bool ExtensionMessageService::OpenChannelImpl(const OpenChannelParams& params) {
if (!params.receiver.process) {
// Treat it as a disconnect.
- DispatchOnDisconnect(MessagePort(params.source, MSG_ROUTING_CONTROL),
+ DispatchOnDisconnect(MessagePort(params.source, MSG_ROUTING_CONTROL, ""),
GET_OPPOSITE_PORT_ID(params.receiver_port_id), true);
return false;
}
@@ -279,10 +296,9 @@ bool ExtensionMessageService::OpenChannelImpl(const OpenChannelParams& params) {
CHECK(params.receiver.process);
MessageChannel* channel(new MessageChannel);
- channel->opener = MessagePort(params.source, MSG_ROUTING_CONTROL);
+ channel->opener = MessagePort(params.source, MSG_ROUTING_CONTROL,
+ params.source_extension_id);
channel->receiver = params.receiver;
- channel->source_extension_id = params.source_extension_id;
- channel->target_extension_id = params.target_extension_id;
CHECK(params.receiver.process);
@@ -300,10 +316,8 @@ bool ExtensionMessageService::OpenChannelImpl(const OpenChannelParams& params) {
params.source_extension_id, params.target_extension_id);
// Keep both ends of the channel alive until the channel is closed.
- IncrementLazyKeepaliveCount(channel->opener.process,
- channel->source_extension_id);
- IncrementLazyKeepaliveCount(channel->receiver.process,
- channel->target_extension_id);
+ IncrementLazyKeepaliveCount(&channel->opener);
+ IncrementLazyKeepaliveCount(&channel->receiver);
return true;
}
@@ -338,10 +352,8 @@ void ExtensionMessageService::CloseChannelImpl(
}
// Balance the addrefs in OpenChannelImpl.
- DecrementLazyKeepaliveCount(channel->opener.process,
- channel->source_extension_id);
- DecrementLazyKeepaliveCount(channel->receiver.process,
- channel->target_extension_id);
+ DecrementLazyKeepaliveCount(&channel->opener);
+ DecrementLazyKeepaliveCount(&channel->receiver);
delete channel_iter->second;
channels_.erase(channel_iter);
@@ -452,6 +464,7 @@ void ExtensionMessageService::PendingOpenChannel(
return;
params.receiver = MessagePort(host->render_process_host(),
- MSG_ROUTING_CONTROL);
+ MSG_ROUTING_CONTROL,
+ params.target_extension_id);
OpenChannelImpl(params);
}

Powered by Google App Engine
This is Rietveld 408576698