Index: chrome/renderer/extensions/dispatcher.cc |
=================================================================== |
--- chrome/renderer/extensions/dispatcher.cc (revision 248111) |
+++ chrome/renderer/extensions/dispatcher.cc (working copy) |
@@ -587,6 +587,12 @@ |
const base::DictionaryValue& source_tab, |
const ExtensionMsg_ExternalConnectionInfo& info, |
const std::string& tls_channel_id) { |
+ DCHECK(!ContainsKey(port_to_tab_id_map_, target_port_id)); |
+ DCHECK_EQ(1, target_port_id % 2); // target renderer ports have odd IDs. |
+ int sender_tab_id = -1; |
+ source_tab.GetInteger("id", &sender_tab_id); |
+ port_to_tab_id_map_[target_port_id] = sender_tab_id; |
+ |
MessagingBindings::DispatchOnConnect( |
v8_context_set_.GetAll(), |
target_port_id, channel_name, source_tab, |
@@ -597,6 +603,14 @@ |
void Dispatcher::OnDeliverMessage(int target_port_id, |
const Message& message) { |
+ scoped_ptr<RequestSender::ScopedTabID> scoped_tab_id; |
+ std::map<int, int>::const_iterator it = |
+ port_to_tab_id_map_.find(target_port_id); |
+ if (it != port_to_tab_id_map_.end()) { |
+ scoped_tab_id.reset(new RequestSender::ScopedTabID(request_sender(), |
+ it->second)); |
+ } |
+ |
MessagingBindings::DeliverMessage( |
v8_context_set_.GetAll(), |
target_port_id, |
@@ -1672,4 +1686,11 @@ |
} |
} |
+void Dispatcher::ClearPortData(int port_id) { |
+ // Only the target port side has entries in |port_to_tab_id_map_|. If |
+ // |port_id| is a source port, std::map::erase() will just silently fail |
+ // here as a no-op. |
+ port_to_tab_id_map_.erase(port_id); |
+} |
+ |
} // namespace extensions |