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

Unified Diff: chrome/browser/extensions/api/messaging/message_service.cc

Issue 145463002: Extensions: Send the tab id to platform apps. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 6 years, 11 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/api/messaging/message_service.cc
===================================================================
--- chrome/browser/extensions/api/messaging/message_service.cc (revision 246091)
+++ chrome/browser/extensions/api/messaging/message_service.cc (working copy)
@@ -119,14 +119,9 @@
static content::RenderProcessHost* GetExtensionProcess(
Profile* profile, const std::string& extension_id) {
SiteInstance* site_instance =
- ExtensionSystem::Get(profile)->process_manager()->
- GetSiteInstanceForURL(
- Extension::GetBaseURLFromExtensionId(extension_id));
-
- if (!site_instance->HasProcess())
- return NULL;
-
- return site_instance->GetProcess();
+ ExtensionSystem::Get(profile)->process_manager()->GetSiteInstanceForURL(
+ Extension::GetBaseURLFromExtensionId(extension_id));
+ return site_instance->HasProcess() ? site_instance->GetProcess() : NULL;
}
} // namespace
@@ -152,12 +147,12 @@
// Sanity checks to make sure our channel<->port converters are correct.
DCHECK(IS_OPENER_PORT_ID(port1_id));
- DCHECK(GET_OPPOSITE_PORT_ID(port1_id) == port2_id);
- DCHECK(GET_OPPOSITE_PORT_ID(port2_id) == port1_id);
- DCHECK(GET_CHANNEL_ID(port1_id) == GET_CHANNEL_ID(port2_id));
- DCHECK(GET_CHANNEL_ID(port1_id) == channel_id);
- DCHECK(GET_CHANNEL_OPENER_ID(channel_id) == port1_id);
- DCHECK(GET_CHANNEL_RECEIVERS_ID(channel_id) == port2_id);
+ DCHECK_EQ(GET_OPPOSITE_PORT_ID(port1_id), port2_id);
+ DCHECK_EQ(GET_OPPOSITE_PORT_ID(port2_id), port1_id);
+ DCHECK_EQ(GET_CHANNEL_ID(port1_id), GET_CHANNEL_ID(port2_id));
+ DCHECK_EQ(GET_CHANNEL_ID(port1_id), channel_id);
+ DCHECK_EQ(GET_CHANNEL_OPENER_ID(channel_id), port1_id);
+ DCHECK_EQ(GET_CHANNEL_RECEIVERS_ID(channel_id), port2_id);
*port1 = port1_id;
*port2 = port2_id;
@@ -301,10 +296,26 @@
scoped_ptr<base::DictionaryValue> source_tab;
GURL source_url_for_tab;
- if (source_contents && ExtensionTabUtil::GetTabId(source_contents) >= 0) {
- // Platform apps can be sent messages, but don't have a Tab concept.
- if (!target_extension->is_platform_app())
- source_tab.reset(ExtensionTabUtil::CreateTabValue(source_contents));
+ if (source_contents) {
not at google - send to devlin 2014/01/23 16:41:59 Maybe we should just always send the tab data and
Lei Zhang 2014/01/23 20:53:12 Again, I'm doing the filter on the browser side be
not at google - send to devlin 2014/01/23 21:07:43 I don't think accidentally giving the tab info to
+ int tab_id = ExtensionTabUtil::GetTabId(source_contents);
+ if (tab_id >= 0) {
+ if (target_extension->is_platform_app()) {
+ // Platform apps can be sent messages, but don't have a Tab concept.
+ // Send this only so that mediaGalleries.addUserSelectedFolder() can
+ // figure out the context for the call when there is no app window open.
+ source_tab.reset(
+ ExtensionTabUtil::CreateTabValueForPlatformApp(source_contents));
+
+ // Record this so it is possible to verify |target_extension_id| has
+ // access to the tab with |tab_id|.
+ int channel_id = GET_CHANNEL_ID(receiver_port_id);
+ DCHECK(!ContainsKey(pending_dispatches_to_platform_apps_, channel_id));
+ pending_dispatches_to_platform_apps_[channel_id] =
+ std::make_pair(target_extension_id, tab_id);
+ } else {
+ source_tab.reset(ExtensionTabUtil::CreateTabValue(source_contents));
+ }
+ }
source_url_for_tab = source_url;
}
@@ -511,6 +522,8 @@
const std::string& error_message) {
// Note: The channel might be gone already, if the other side closed first.
int channel_id = GET_CHANNEL_ID(port_id);
+ pending_dispatches_to_platform_apps_.erase(channel_id);
+
MessageChannelMap::iterator it = channels_.find(channel_id);
if (it == channels_.end()) {
PendingLazyBackgroundPageChannelMap::iterator pending =
@@ -549,8 +562,7 @@
channels_.erase(channel_iter);
}
-void MessageService::PostMessage(
- int source_port_id, const Message& message) {
+void MessageService::PostMessage(int source_port_id, const Message& message) {
int channel_id = GET_CHANNEL_ID(source_port_id);
MessageChannelMap::iterator iter = channels_.find(channel_id);
if (iter == channels_.end()) {
@@ -568,6 +580,18 @@
PostMessage(port_id, Message(message, false /* user_gesture */));
}
+bool MessageService::CanPlatformAppAccessTab(const std::string app_id,
+ int tab_id) const {
+ for (PendingDispatchesToPlatformAppsMap::const_iterator it =
+ pending_dispatches_to_platform_apps_.begin();
+ it != pending_dispatches_to_platform_apps_.end(); ++it) {
+ const std::pair<std::string, int>& entry = it->second;
+ if (entry.first == app_id && entry.second == tab_id)
+ return true;
+ }
+ return false;
+}
+
void MessageService::Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) {

Powered by Google App Engine
This is Rietveld 408576698