| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/api/messaging/extension_message_port.h" | 5 #include "chrome/browser/extensions/api/messaging/extension_message_port.h" |
| 6 | 6 |
| 7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
| 8 #include "base/scoped_observer.h" | 8 #include "base/scoped_observer.h" |
| 9 #include "chrome/browser/profiles/profile.h" | 9 #include "chrome/browser/profiles/profile.h" |
| 10 #include "content/public/browser/interstitial_page.h" | 10 #include "content/public/browser/interstitial_page.h" |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 ExtensionMessagePort::ExtensionMessagePort( | 92 ExtensionMessagePort::ExtensionMessagePort( |
| 93 base::WeakPtr<MessageService> message_service, | 93 base::WeakPtr<MessageService> message_service, |
| 94 int port_id, | 94 int port_id, |
| 95 const std::string& extension_id, | 95 const std::string& extension_id, |
| 96 content::RenderProcessHost* extension_process) | 96 content::RenderProcessHost* extension_process) |
| 97 : weak_message_service_(message_service), | 97 : weak_message_service_(message_service), |
| 98 port_id_(port_id), | 98 port_id_(port_id), |
| 99 extension_id_(extension_id), | 99 extension_id_(extension_id), |
| 100 browser_context_(extension_process->GetBrowserContext()), | 100 browser_context_(extension_process->GetBrowserContext()), |
| 101 extension_process_(extension_process), | 101 extension_process_(extension_process), |
| 102 opener_tab_id_(-1), |
| 102 did_create_port_(false), | 103 did_create_port_(false), |
| 103 background_host_ptr_(nullptr), | 104 background_host_ptr_(nullptr), |
| 104 frame_tracker_(new FrameTracker(this)) { | 105 frame_tracker_(new FrameTracker(this)) { |
| 105 auto all_hosts = ProcessManager::Get(browser_context_) | 106 auto all_hosts = ProcessManager::Get(browser_context_) |
| 106 ->GetRenderFrameHostsForExtension(extension_id); | 107 ->GetRenderFrameHostsForExtension(extension_id); |
| 107 for (content::RenderFrameHost* rfh : all_hosts) | 108 for (content::RenderFrameHost* rfh : all_hosts) |
| 108 RegisterFrame(rfh); | 109 RegisterFrame(rfh); |
| 109 | 110 |
| 110 frame_tracker_->TrackExtensionProcessFrames(); | 111 frame_tracker_->TrackExtensionProcessFrames(); |
| 111 } | 112 } |
| 112 | 113 |
| 113 ExtensionMessagePort::ExtensionMessagePort( | 114 ExtensionMessagePort::ExtensionMessagePort( |
| 114 base::WeakPtr<MessageService> message_service, | 115 base::WeakPtr<MessageService> message_service, |
| 115 int port_id, | 116 int port_id, |
| 116 const std::string& extension_id, | 117 const std::string& extension_id, |
| 117 content::RenderFrameHost* rfh, | 118 content::RenderFrameHost* rfh, |
| 118 bool include_child_frames) | 119 bool include_child_frames) |
| 119 : weak_message_service_(message_service), | 120 : weak_message_service_(message_service), |
| 120 port_id_(port_id), | 121 port_id_(port_id), |
| 121 extension_id_(extension_id), | 122 extension_id_(extension_id), |
| 122 browser_context_(rfh->GetProcess()->GetBrowserContext()), | 123 browser_context_(rfh->GetProcess()->GetBrowserContext()), |
| 123 extension_process_(nullptr), | 124 extension_process_(nullptr), |
| 125 opener_tab_id_(-1), |
| 124 did_create_port_(false), | 126 did_create_port_(false), |
| 125 background_host_ptr_(nullptr), | 127 background_host_ptr_(nullptr), |
| 126 frame_tracker_(new FrameTracker(this)) { | 128 frame_tracker_(new FrameTracker(this)) { |
| 127 content::WebContents* tab = content::WebContents::FromRenderFrameHost(rfh); | 129 content::WebContents* tab = content::WebContents::FromRenderFrameHost(rfh); |
| 128 if (!tab) { | 130 if (!tab) { |
| 129 content::InterstitialPage* interstitial = | 131 content::InterstitialPage* interstitial = |
| 130 content::InterstitialPage::FromRenderFrameHost(rfh); | 132 content::InterstitialPage::FromRenderFrameHost(rfh); |
| 131 // A RenderFrameHost must be hosted in a WebContents or InterstitialPage. | 133 // A RenderFrameHost must be hosted in a WebContents or InterstitialPage. |
| 132 CHECK(interstitial); | 134 CHECK(interstitial); |
| 133 | 135 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 151 if (include_child_frames) { | 153 if (include_child_frames) { |
| 152 tab->ForEachFrame(base::Bind(&ExtensionMessagePort::RegisterFrame, | 154 tab->ForEachFrame(base::Bind(&ExtensionMessagePort::RegisterFrame, |
| 153 base::Unretained(this))); | 155 base::Unretained(this))); |
| 154 } else { | 156 } else { |
| 155 RegisterFrame(rfh); | 157 RegisterFrame(rfh); |
| 156 } | 158 } |
| 157 } | 159 } |
| 158 | 160 |
| 159 ExtensionMessagePort::~ExtensionMessagePort() {} | 161 ExtensionMessagePort::~ExtensionMessagePort() {} |
| 160 | 162 |
| 163 void ExtensionMessagePort::RevalidatePort() { |
| 164 // Only opener ports need to be revalidated, because these are created in the |
| 165 // renderer before the browser knows about them. |
| 166 DCHECK(!extension_process_); |
| 167 DCHECK_LE(frames_.size(), 1U); |
| 168 |
| 169 SendToPort(base::WrapUnique( |
| 170 new ExtensionMsg_CheckHasMessagePort(MSG_ROUTING_NONE, port_id_))); |
| 171 } |
| 172 |
| 161 void ExtensionMessagePort::RemoveCommonFrames(const MessagePort& port) { | 173 void ExtensionMessagePort::RemoveCommonFrames(const MessagePort& port) { |
| 162 // Avoid overlap in the set of frames to make sure that it does not matter | 174 // Avoid overlap in the set of frames to make sure that it does not matter |
| 163 // when UnregisterFrame is called. | 175 // when UnregisterFrame is called. |
| 164 for (std::set<content::RenderFrameHost*>::iterator it = frames_.begin(); | 176 for (std::set<content::RenderFrameHost*>::iterator it = frames_.begin(); |
| 165 it != frames_.end(); ) { | 177 it != frames_.end(); ) { |
| 166 if (port.HasFrame(*it)) { | 178 if (port.HasFrame(*it)) { |
| 167 frames_.erase(it++); | 179 frames_.erase(it++); |
| 168 } else { | 180 } else { |
| 169 ++it; | 181 ++it; |
| 170 } | 182 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 183 const std::string& channel_name, | 195 const std::string& channel_name, |
| 184 std::unique_ptr<base::DictionaryValue> source_tab, | 196 std::unique_ptr<base::DictionaryValue> source_tab, |
| 185 int source_frame_id, | 197 int source_frame_id, |
| 186 int guest_process_id, | 198 int guest_process_id, |
| 187 int guest_render_frame_routing_id, | 199 int guest_render_frame_routing_id, |
| 188 const std::string& source_extension_id, | 200 const std::string& source_extension_id, |
| 189 const std::string& target_extension_id, | 201 const std::string& target_extension_id, |
| 190 const GURL& source_url, | 202 const GURL& source_url, |
| 191 const std::string& tls_channel_id) { | 203 const std::string& tls_channel_id) { |
| 192 ExtensionMsg_TabConnectionInfo source; | 204 ExtensionMsg_TabConnectionInfo source; |
| 193 if (source_tab) | 205 if (source_tab) { |
| 194 source.tab.Swap(source_tab.get()); | 206 source.tab.Swap(source_tab.get()); |
| 207 source.tab.GetInteger("id", &opener_tab_id_); |
| 208 } |
| 195 source.frame_id = source_frame_id; | 209 source.frame_id = source_frame_id; |
| 196 | 210 |
| 197 ExtensionMsg_ExternalConnectionInfo info; | 211 ExtensionMsg_ExternalConnectionInfo info; |
| 198 info.target_id = target_extension_id; | 212 info.target_id = target_extension_id; |
| 199 info.source_id = source_extension_id; | 213 info.source_id = source_extension_id; |
| 200 info.source_url = source_url; | 214 info.source_url = source_url; |
| 201 info.guest_process_id = guest_process_id; | 215 info.guest_process_id = guest_process_id; |
| 202 info.guest_render_frame_routing_id = guest_render_frame_routing_id; | 216 info.guest_render_frame_routing_id = guest_render_frame_routing_id; |
| 203 | 217 |
| 204 SendToPort(base::WrapUnique(new ExtensionMsg_DispatchOnConnect( | 218 SendToPort(base::WrapUnique(new ExtensionMsg_DispatchOnConnect( |
| 205 MSG_ROUTING_NONE, port_id_, channel_name, source, info, tls_channel_id))); | 219 MSG_ROUTING_NONE, port_id_, channel_name, source, info, tls_channel_id))); |
| 206 } | 220 } |
| 207 | 221 |
| 208 void ExtensionMessagePort::DispatchOnDisconnect( | 222 void ExtensionMessagePort::DispatchOnDisconnect( |
| 209 const std::string& error_message) { | 223 const std::string& error_message) { |
| 210 SendToPort(base::WrapUnique(new ExtensionMsg_DispatchOnDisconnect( | 224 SendToPort(base::WrapUnique(new ExtensionMsg_DispatchOnDisconnect( |
| 211 MSG_ROUTING_NONE, port_id_, error_message))); | 225 MSG_ROUTING_NONE, port_id_, error_message))); |
| 212 } | 226 } |
| 213 | 227 |
| 214 void ExtensionMessagePort::DispatchOnMessage(const Message& message) { | 228 void ExtensionMessagePort::DispatchOnMessage(const Message& message) { |
| 215 SendToPort(base::WrapUnique( | 229 SendToPort(base::WrapUnique(new ExtensionMsg_DeliverMessage( |
| 216 new ExtensionMsg_DeliverMessage(MSG_ROUTING_NONE, port_id_, message))); | 230 MSG_ROUTING_NONE, port_id_, opener_tab_id_, message))); |
| 217 } | 231 } |
| 218 | 232 |
| 219 void ExtensionMessagePort::IncrementLazyKeepaliveCount() { | 233 void ExtensionMessagePort::IncrementLazyKeepaliveCount() { |
| 220 ProcessManager* pm = ProcessManager::Get(browser_context_); | 234 ProcessManager* pm = ProcessManager::Get(browser_context_); |
| 221 ExtensionHost* host = pm->GetBackgroundHostForExtension(extension_id_); | 235 ExtensionHost* host = pm->GetBackgroundHostForExtension(extension_id_); |
| 222 if (host && BackgroundInfo::HasLazyBackgroundPage(host->extension())) | 236 if (host && BackgroundInfo::HasLazyBackgroundPage(host->extension())) |
| 223 pm->IncrementLazyKeepaliveCount(host->extension()); | 237 pm->IncrementLazyKeepaliveCount(host->extension()); |
| 224 | 238 |
| 225 // Keep track of the background host, so when we decrement, we only do so if | 239 // Keep track of the background host, so when we decrement, we only do so if |
| 226 // the host hasn't reloaded. | 240 // the host hasn't reloaded. |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 289 return; | 303 return; |
| 290 } | 304 } |
| 291 for (content::RenderFrameHost* rfh : frames_) { | 305 for (content::RenderFrameHost* rfh : frames_) { |
| 292 IPC::Message* msg_copy = new IPC::Message(*msg.get()); | 306 IPC::Message* msg_copy = new IPC::Message(*msg.get()); |
| 293 msg_copy->set_routing_id(rfh->GetRoutingID()); | 307 msg_copy->set_routing_id(rfh->GetRoutingID()); |
| 294 rfh->Send(msg_copy); | 308 rfh->Send(msg_copy); |
| 295 } | 309 } |
| 296 } | 310 } |
| 297 | 311 |
| 298 } // namespace extensions | 312 } // namespace extensions |
| OLD | NEW |