| 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/message_service.h" | 5 #include "chrome/browser/extensions/api/messaging/message_service.h" |
| 6 | 6 |
| 7 #include "base/atomic_sequence_num.h" | 7 #include "base/atomic_sequence_num.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "base/json/json_writer.h" | 10 #include "base/json/json_writer.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 #include "chrome/common/extensions/extension_messages.h" | 26 #include "chrome/common/extensions/extension_messages.h" |
| 27 #include "chrome/common/extensions/manifest_handlers/externally_connectable.h" | 27 #include "chrome/common/extensions/manifest_handlers/externally_connectable.h" |
| 28 #include "content/public/browser/notification_service.h" | 28 #include "content/public/browser/notification_service.h" |
| 29 #include "content/public/browser/render_process_host.h" | 29 #include "content/public/browser/render_process_host.h" |
| 30 #include "content/public/browser/render_view_host.h" | 30 #include "content/public/browser/render_view_host.h" |
| 31 #include "content/public/browser/render_widget_host.h" | 31 #include "content/public/browser/render_widget_host.h" |
| 32 #include "content/public/browser/render_widget_host_view.h" | 32 #include "content/public/browser/render_widget_host_view.h" |
| 33 #include "content/public/browser/site_instance.h" | 33 #include "content/public/browser/site_instance.h" |
| 34 #include "content/public/browser/web_contents.h" | 34 #include "content/public/browser/web_contents.h" |
| 35 #include "extensions/browser/extension_system.h" | 35 #include "extensions/browser/extension_system.h" |
| 36 #include "extensions/browser/extensions_browser_client.h" |
| 36 #include "extensions/browser/lazy_background_task_queue.h" | 37 #include "extensions/browser/lazy_background_task_queue.h" |
| 37 #include "extensions/browser/process_manager.h" | 38 #include "extensions/browser/process_manager.h" |
| 38 #include "extensions/common/extension.h" | 39 #include "extensions/common/extension.h" |
| 39 #include "extensions/common/manifest_constants.h" | 40 #include "extensions/common/manifest_constants.h" |
| 40 #include "extensions/common/manifest_handlers/background_info.h" | 41 #include "extensions/common/manifest_handlers/background_info.h" |
| 41 #include "extensions/common/manifest_handlers/incognito_info.h" | 42 #include "extensions/common/manifest_handlers/incognito_info.h" |
| 42 #include "net/base/completion_callback.h" | 43 #include "net/base/completion_callback.h" |
| 43 #include "url/gurl.h" | 44 #include "url/gurl.h" |
| 44 | 45 |
| 46 using content::BrowserContext; |
| 45 using content::SiteInstance; | 47 using content::SiteInstance; |
| 46 using content::WebContents; | 48 using content::WebContents; |
| 47 | 49 |
| 48 // Since we have 2 ports for every channel, we just index channels by half the | 50 // Since we have 2 ports for every channel, we just index channels by half the |
| 49 // port ID. | 51 // port ID. |
| 50 #define GET_CHANNEL_ID(port_id) ((port_id) / 2) | 52 #define GET_CHANNEL_ID(port_id) ((port_id) / 2) |
| 51 #define GET_CHANNEL_OPENER_ID(channel_id) ((channel_id) * 2) | 53 #define GET_CHANNEL_OPENER_ID(channel_id) ((channel_id) * 2) |
| 52 #define GET_CHANNEL_RECEIVERS_ID(channel_id) ((channel_id) * 2 + 1) | 54 #define GET_CHANNEL_RECEIVERS_ID(channel_id) ((channel_id) * 2 + 1) |
| 53 | 55 |
| 54 // Port1 is always even, port2 is always odd. | 56 // Port1 is always even, port2 is always odd. |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 111 private: | 113 private: |
| 112 DISALLOW_COPY_AND_ASSIGN(OpenChannelParams); | 114 DISALLOW_COPY_AND_ASSIGN(OpenChannelParams); |
| 113 }; | 115 }; |
| 114 | 116 |
| 115 namespace { | 117 namespace { |
| 116 | 118 |
| 117 static base::StaticAtomicSequenceNumber g_next_channel_id; | 119 static base::StaticAtomicSequenceNumber g_next_channel_id; |
| 118 static base::StaticAtomicSequenceNumber g_channel_id_overflow_count; | 120 static base::StaticAtomicSequenceNumber g_channel_id_overflow_count; |
| 119 | 121 |
| 120 static content::RenderProcessHost* GetExtensionProcess( | 122 static content::RenderProcessHost* GetExtensionProcess( |
| 121 Profile* profile, const std::string& extension_id) { | 123 BrowserContext* context, |
| 124 const std::string& extension_id) { |
| 122 SiteInstance* site_instance = | 125 SiteInstance* site_instance = |
| 123 ExtensionSystem::Get(profile)->process_manager()->GetSiteInstanceForURL( | 126 ExtensionSystem::Get(context)->process_manager()->GetSiteInstanceForURL( |
| 124 Extension::GetBaseURLFromExtensionId(extension_id)); | 127 Extension::GetBaseURLFromExtensionId(extension_id)); |
| 125 return site_instance->HasProcess() ? site_instance->GetProcess() : NULL; | 128 return site_instance->HasProcess() ? site_instance->GetProcess() : NULL; |
| 126 } | 129 } |
| 127 | 130 |
| 128 } // namespace | 131 } // namespace |
| 129 | 132 |
| 130 content::RenderProcessHost* | 133 content::RenderProcessHost* |
| 131 MessageService::MessagePort::GetRenderProcessHost() { | 134 MessageService::MessagePort::GetRenderProcessHost() { |
| 132 return NULL; | 135 return NULL; |
| 133 } | 136 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 152 DCHECK_EQ(GET_OPPOSITE_PORT_ID(port2_id), port1_id); | 155 DCHECK_EQ(GET_OPPOSITE_PORT_ID(port2_id), port1_id); |
| 153 DCHECK_EQ(GET_CHANNEL_ID(port1_id), GET_CHANNEL_ID(port2_id)); | 156 DCHECK_EQ(GET_CHANNEL_ID(port1_id), GET_CHANNEL_ID(port2_id)); |
| 154 DCHECK_EQ(GET_CHANNEL_ID(port1_id), channel_id); | 157 DCHECK_EQ(GET_CHANNEL_ID(port1_id), channel_id); |
| 155 DCHECK_EQ(GET_CHANNEL_OPENER_ID(channel_id), port1_id); | 158 DCHECK_EQ(GET_CHANNEL_OPENER_ID(channel_id), port1_id); |
| 156 DCHECK_EQ(GET_CHANNEL_RECEIVERS_ID(channel_id), port2_id); | 159 DCHECK_EQ(GET_CHANNEL_RECEIVERS_ID(channel_id), port2_id); |
| 157 | 160 |
| 158 *port1 = port1_id; | 161 *port1 = port1_id; |
| 159 *port2 = port2_id; | 162 *port2 = port2_id; |
| 160 } | 163 } |
| 161 | 164 |
| 162 MessageService::MessageService(Profile* profile) | 165 MessageService::MessageService(BrowserContext* context) |
| 163 : lazy_background_task_queue_( | 166 : lazy_background_task_queue_( |
| 164 ExtensionSystem::Get(profile)->lazy_background_task_queue()), | 167 ExtensionSystem::Get(context)->lazy_background_task_queue()), |
| 165 weak_factory_(this) { | 168 weak_factory_(this) { |
| 166 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED, | 169 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED, |
| 167 content::NotificationService::AllBrowserContextsAndSources()); | 170 content::NotificationService::AllBrowserContextsAndSources()); |
| 168 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED, | 171 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED, |
| 169 content::NotificationService::AllBrowserContextsAndSources()); | 172 content::NotificationService::AllBrowserContextsAndSources()); |
| 170 } | 173 } |
| 171 | 174 |
| 172 MessageService::~MessageService() { | 175 MessageService::~MessageService() { |
| 173 STLDeleteContainerPairSecondPointers(channels_.begin(), channels_.end()); | 176 STLDeleteContainerPairSecondPointers(channels_.begin(), channels_.end()); |
| 174 channels_.clear(); | 177 channels_.clear(); |
| 175 } | 178 } |
| 176 | 179 |
| 177 static base::LazyInstance<ProfileKeyedAPIFactory<MessageService> > | 180 static base::LazyInstance<ProfileKeyedAPIFactory<MessageService> > |
| 178 g_factory = LAZY_INSTANCE_INITIALIZER; | 181 g_factory = LAZY_INSTANCE_INITIALIZER; |
| 179 | 182 |
| 180 // static | 183 // static |
| 181 ProfileKeyedAPIFactory<MessageService>* MessageService::GetFactoryInstance() { | 184 ProfileKeyedAPIFactory<MessageService>* MessageService::GetFactoryInstance() { |
| 182 return g_factory.Pointer(); | 185 return g_factory.Pointer(); |
| 183 } | 186 } |
| 184 | 187 |
| 185 // static | 188 // static |
| 186 MessageService* MessageService::Get(content::BrowserContext* context) { | 189 MessageService* MessageService::Get(BrowserContext* context) { |
| 187 Profile* profile = Profile::FromBrowserContext(context); | 190 return ProfileKeyedAPIFactory<MessageService>::GetForProfile(context); |
| 188 return ProfileKeyedAPIFactory<MessageService>::GetForProfile(profile); | |
| 189 } | 191 } |
| 190 | 192 |
| 191 void MessageService::OpenChannelToExtension( | 193 void MessageService::OpenChannelToExtension( |
| 192 int source_process_id, int source_routing_id, int receiver_port_id, | 194 int source_process_id, int source_routing_id, int receiver_port_id, |
| 193 const std::string& source_extension_id, | 195 const std::string& source_extension_id, |
| 194 const std::string& target_extension_id, | 196 const std::string& target_extension_id, |
| 195 const GURL& source_url, | 197 const GURL& source_url, |
| 196 const std::string& channel_name, | 198 const std::string& channel_name, |
| 197 bool include_tls_channel_id) { | 199 bool include_tls_channel_id) { |
| 198 content::RenderProcessHost* source = | 200 content::RenderProcessHost* source = |
| 199 content::RenderProcessHost::FromID(source_process_id); | 201 content::RenderProcessHost::FromID(source_process_id); |
| 200 if (!source) | 202 if (!source) |
| 201 return; | 203 return; |
| 202 Profile* profile = Profile::FromBrowserContext(source->GetBrowserContext()); | 204 BrowserContext* context = source->GetBrowserContext(); |
| 203 | 205 |
| 204 ExtensionSystem* extension_system = ExtensionSystem::Get(profile); | 206 ExtensionSystem* extension_system = ExtensionSystem::Get(context); |
| 205 DCHECK(extension_system); | 207 DCHECK(extension_system); |
| 206 const Extension* target_extension = extension_system->extension_service()-> | 208 const Extension* target_extension = extension_system->extension_service()-> |
| 207 extensions()->GetByID(target_extension_id); | 209 extensions()->GetByID(target_extension_id); |
| 208 if (!target_extension) { | 210 if (!target_extension) { |
| 209 DispatchOnDisconnect( | 211 DispatchOnDisconnect( |
| 210 source, receiver_port_id, kReceivingEndDoesntExistError); | 212 source, receiver_port_id, kReceivingEndDoesntExistError); |
| 211 return; | 213 return; |
| 212 } | 214 } |
| 213 | 215 |
| 214 // Only running ephemeral apps can receive messages. Idle cached ephemeral | 216 // Only running ephemeral apps can receive messages. Idle cached ephemeral |
| 215 // apps are invisible and should not be connectable. | 217 // apps are invisible and should not be connectable. |
| 216 if (target_extension->is_ephemeral() && | 218 if (target_extension->is_ephemeral() && |
| 217 util::IsExtensionIdle(target_extension_id, profile)) { | 219 util::IsExtensionIdle(target_extension_id, context)) { |
| 218 DispatchOnDisconnect( | 220 DispatchOnDisconnect( |
| 219 source, receiver_port_id, kReceivingEndDoesntExistError); | 221 source, receiver_port_id, kReceivingEndDoesntExistError); |
| 220 return; | 222 return; |
| 221 } | 223 } |
| 222 | 224 |
| 223 bool is_web_connection = false; | 225 bool is_web_connection = false; |
| 224 | 226 |
| 225 if (source_extension_id != target_extension_id) { | 227 if (source_extension_id != target_extension_id) { |
| 226 // It's an external connection. Check the externally_connectable manifest | 228 // It's an external connection. Check the externally_connectable manifest |
| 227 // key if it's present. If it's not, we allow connection from any extension | 229 // key if it's present. If it's not, we allow connection from any extension |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 // indistinguishable from the extension just not existing. | 262 // indistinguishable from the extension just not existing. |
| 261 DispatchOnDisconnect( | 263 DispatchOnDisconnect( |
| 262 source, receiver_port_id, kReceivingEndDoesntExistError); | 264 source, receiver_port_id, kReceivingEndDoesntExistError); |
| 263 return; | 265 return; |
| 264 } | 266 } |
| 265 } | 267 } |
| 266 | 268 |
| 267 WebContents* source_contents = tab_util::GetWebContentsByID( | 269 WebContents* source_contents = tab_util::GetWebContentsByID( |
| 268 source_process_id, source_routing_id); | 270 source_process_id, source_routing_id); |
| 269 | 271 |
| 270 if (profile->IsOffTheRecord() && | 272 if (context->IsOffTheRecord() && |
| 271 !util::IsIncognitoEnabled(target_extension_id, profile)) { | 273 !util::IsIncognitoEnabled(target_extension_id, context)) { |
| 272 // Give the user a chance to accept an incognito connection if they haven't | 274 // Give the user a chance to accept an incognito connection if they haven't |
| 273 // already - but only for spanning-mode incognito. We don't want the | 275 // already - but only for spanning-mode incognito. We don't want the |
| 274 // complication of spinning up an additional process here which might need | 276 // complication of spinning up an additional process here which might need |
| 275 // to do some setup that we're not expecting. | 277 // to do some setup that we're not expecting. |
| 276 if (!is_web_connection || | 278 if (!is_web_connection || IncognitoInfo::IsSplitMode(target_extension) || |
| 277 IncognitoInfo::IsSplitMode(target_extension) || | 279 !IncognitoConnectability::Get(context) |
| 278 !IncognitoConnectability::Get(profile)->Query(target_extension, | 280 ->Query(target_extension, source_contents, source_url)) { |
| 279 source_contents, | |
| 280 source_url)) { | |
| 281 DispatchOnDisconnect( | 281 DispatchOnDisconnect( |
| 282 source, receiver_port_id, kReceivingEndDoesntExistError); | 282 source, receiver_port_id, kReceivingEndDoesntExistError); |
| 283 return; | 283 return; |
| 284 } | 284 } |
| 285 } | 285 } |
| 286 | 286 |
| 287 // Note: we use the source's profile here. If the source is an incognito | 287 // Note: we use the source's profile here. If the source is an incognito |
| 288 // process, we will use the incognito EPM to find the right extension process, | 288 // process, we will use the incognito EPM to find the right extension process, |
| 289 // which depends on whether the extension uses spanning or split mode. | 289 // which depends on whether the extension uses spanning or split mode. |
| 290 MessagePort* receiver = new ExtensionMessagePort( | 290 MessagePort* receiver = new ExtensionMessagePort( |
| 291 GetExtensionProcess(profile, target_extension_id), MSG_ROUTING_CONTROL, | 291 GetExtensionProcess(context, target_extension_id), |
| 292 MSG_ROUTING_CONTROL, |
| 292 target_extension_id); | 293 target_extension_id); |
| 293 | 294 |
| 294 // Include info about the opener's tab (if it was a tab). | 295 // Include info about the opener's tab (if it was a tab). |
| 295 scoped_ptr<base::DictionaryValue> source_tab; | 296 scoped_ptr<base::DictionaryValue> source_tab; |
| 296 GURL source_url_for_tab; | 297 GURL source_url_for_tab; |
| 297 | 298 |
| 298 if (source_contents && ExtensionTabUtil::GetTabId(source_contents) >= 0) { | 299 if (source_contents && ExtensionTabUtil::GetTabId(source_contents) >= 0) { |
| 299 // Only the tab id is useful to platform apps for internal use. The | 300 // Only the tab id is useful to platform apps for internal use. The |
| 300 // unnecessary bits will be stripped out in | 301 // unnecessary bits will be stripped out in |
| 301 // MessagingBindings::DispatchOnConnect(). | 302 // MessagingBindings::DispatchOnConnect(). |
| (...skipping 12 matching lines...) Expand all Loading... |
| 314 include_tls_channel_id); | 315 include_tls_channel_id); |
| 315 | 316 |
| 316 // If the target requests the TLS channel id, begin the lookup for it. | 317 // If the target requests the TLS channel id, begin the lookup for it. |
| 317 // The target might also be a lazy background page, checked next, but the | 318 // The target might also be a lazy background page, checked next, but the |
| 318 // loading of lazy background pages continues asynchronously, so enqueue | 319 // loading of lazy background pages continues asynchronously, so enqueue |
| 319 // messages awaiting TLS channel ID first. | 320 // messages awaiting TLS channel ID first. |
| 320 if (include_tls_channel_id) { | 321 if (include_tls_channel_id) { |
| 321 pending_tls_channel_id_channels_[GET_CHANNEL_ID(params->receiver_port_id)] | 322 pending_tls_channel_id_channels_[GET_CHANNEL_ID(params->receiver_port_id)] |
| 322 = PendingMessagesQueue(); | 323 = PendingMessagesQueue(); |
| 323 property_provider_.GetDomainBoundCert( | 324 property_provider_.GetDomainBoundCert( |
| 324 profile, | 325 Profile::FromBrowserContext(context), |
| 325 source_url, | 326 source_url, |
| 326 base::Bind(&MessageService::GotDomainBoundCert, | 327 base::Bind(&MessageService::GotDomainBoundCert, |
| 327 weak_factory_.GetWeakPtr(), | 328 weak_factory_.GetWeakPtr(), |
| 328 base::Passed(make_scoped_ptr(params)))); | 329 base::Passed(make_scoped_ptr(params)))); |
| 329 return; | 330 return; |
| 330 } | 331 } |
| 331 | 332 |
| 332 // The target might be a lazy background page. In that case, we have to check | 333 // The target might be a lazy background page. In that case, we have to check |
| 333 // if it is loaded and ready, and if not, queue up the task and load the | 334 // if it is loaded and ready, and if not, queue up the task and load the |
| 334 // page. | 335 // page. |
| 335 if (MaybeAddPendingLazyBackgroundPageOpenChannelTask(profile, | 336 if (MaybeAddPendingLazyBackgroundPageOpenChannelTask( |
| 336 target_extension, | 337 context, target_extension, params)) { |
| 337 params)) { | |
| 338 return; | 338 return; |
| 339 } | 339 } |
| 340 | 340 |
| 341 OpenChannelImpl(make_scoped_ptr(params)); | 341 OpenChannelImpl(make_scoped_ptr(params)); |
| 342 } | 342 } |
| 343 | 343 |
| 344 void MessageService::OpenChannelToNativeApp( | 344 void MessageService::OpenChannelToNativeApp( |
| 345 int source_process_id, | 345 int source_process_id, |
| 346 int source_routing_id, | 346 int source_routing_id, |
| 347 int receiver_port_id, | 347 int receiver_port_id, |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 647 const Message& message) { | 647 const Message& message) { |
| 648 // Figure out which port the ID corresponds to. | 648 // Figure out which port the ID corresponds to. |
| 649 int dest_port_id = GET_OPPOSITE_PORT_ID(source_port_id); | 649 int dest_port_id = GET_OPPOSITE_PORT_ID(source_port_id); |
| 650 MessagePort* port = IS_OPENER_PORT_ID(dest_port_id) ? | 650 MessagePort* port = IS_OPENER_PORT_ID(dest_port_id) ? |
| 651 channel->opener.get() : channel->receiver.get(); | 651 channel->opener.get() : channel->receiver.get(); |
| 652 | 652 |
| 653 port->DispatchOnMessage(message, dest_port_id); | 653 port->DispatchOnMessage(message, dest_port_id); |
| 654 } | 654 } |
| 655 | 655 |
| 656 bool MessageService::MaybeAddPendingLazyBackgroundPageOpenChannelTask( | 656 bool MessageService::MaybeAddPendingLazyBackgroundPageOpenChannelTask( |
| 657 Profile* profile, | 657 BrowserContext* context, |
| 658 const Extension* extension, | 658 const Extension* extension, |
| 659 OpenChannelParams* params) { | 659 OpenChannelParams* params) { |
| 660 if (!BackgroundInfo::HasLazyBackgroundPage(extension)) | 660 if (!BackgroundInfo::HasLazyBackgroundPage(extension)) |
| 661 return false; | 661 return false; |
| 662 | 662 |
| 663 // If the extension uses spanning incognito mode, make sure we're always | 663 // If the extension uses spanning incognito mode, make sure we're always |
| 664 // using the original profile since that is what the extension process | 664 // using the original profile since that is what the extension process |
| 665 // will use. | 665 // will use. |
| 666 if (!IncognitoInfo::IsSplitMode(extension)) | 666 if (!IncognitoInfo::IsSplitMode(extension)) |
| 667 profile = profile->GetOriginalProfile(); | 667 context = ExtensionsBrowserClient::Get()->GetOriginalContext(context); |
| 668 | 668 |
| 669 if (!lazy_background_task_queue_->ShouldEnqueueTask(profile, extension)) | 669 if (!lazy_background_task_queue_->ShouldEnqueueTask(context, extension)) |
| 670 return false; | 670 return false; |
| 671 | 671 |
| 672 pending_lazy_background_page_channels_[ | 672 pending_lazy_background_page_channels_ |
| 673 GET_CHANNEL_ID(params->receiver_port_id)] = | 673 [GET_CHANNEL_ID(params->receiver_port_id)] = |
| 674 PendingLazyBackgroundPageChannel(profile, extension->id()); | 674 PendingLazyBackgroundPageChannel(context, extension->id()); |
| 675 scoped_ptr<OpenChannelParams> scoped_params(params); | 675 scoped_ptr<OpenChannelParams> scoped_params(params); |
| 676 lazy_background_task_queue_->AddPendingTask(profile, extension->id(), | 676 lazy_background_task_queue_->AddPendingTask( |
| 677 context, |
| 678 extension->id(), |
| 677 base::Bind(&MessageService::PendingLazyBackgroundPageOpenChannel, | 679 base::Bind(&MessageService::PendingLazyBackgroundPageOpenChannel, |
| 678 weak_factory_.GetWeakPtr(), base::Passed(&scoped_params), | 680 weak_factory_.GetWeakPtr(), |
| 681 base::Passed(&scoped_params), |
| 679 params->source->GetID())); | 682 params->source->GetID())); |
| 680 return true; | 683 return true; |
| 681 } | 684 } |
| 682 | 685 |
| 683 void MessageService::GotDomainBoundCert(scoped_ptr<OpenChannelParams> params, | 686 void MessageService::GotDomainBoundCert(scoped_ptr<OpenChannelParams> params, |
| 684 const std::string& tls_channel_id) { | 687 const std::string& tls_channel_id) { |
| 685 params->tls_channel_id.assign(tls_channel_id); | 688 params->tls_channel_id.assign(tls_channel_id); |
| 686 int channel_id = GET_CHANNEL_ID(params->receiver_port_id); | 689 int channel_id = GET_CHANNEL_ID(params->receiver_port_id); |
| 687 | 690 |
| 688 PendingTlsChannelIdMap::iterator pending_for_tls_channel_id = | 691 PendingTlsChannelIdMap::iterator pending_for_tls_channel_id = |
| 689 pending_tls_channel_id_channels_.find(channel_id); | 692 pending_tls_channel_id_channels_.find(channel_id); |
| 690 if (pending_for_tls_channel_id == pending_tls_channel_id_channels_.end()) { | 693 if (pending_for_tls_channel_id == pending_tls_channel_id_channels_.end()) { |
| 691 NOTREACHED(); | 694 NOTREACHED(); |
| 692 return; | 695 return; |
| 693 } | 696 } |
| 694 | 697 |
| 695 Profile* profile = Profile::FromBrowserContext( | 698 BrowserContext* context = params->source->GetBrowserContext(); |
| 696 params->source->GetBrowserContext()); | |
| 697 | 699 |
| 698 const Extension* target_extension = ExtensionSystem::Get(profile)-> | 700 const Extension* target_extension = |
| 699 extension_service()->extensions()->GetByID(params->target_extension_id); | 701 ExtensionSystem::Get(context)->extension_service()->extensions()->GetByID( |
| 702 params->target_extension_id); |
| 700 if (!target_extension) { | 703 if (!target_extension) { |
| 701 pending_tls_channel_id_channels_.erase(channel_id); | 704 pending_tls_channel_id_channels_.erase(channel_id); |
| 702 DispatchOnDisconnect( | 705 DispatchOnDisconnect( |
| 703 params->source, params->receiver_port_id, | 706 params->source, params->receiver_port_id, |
| 704 kReceivingEndDoesntExistError); | 707 kReceivingEndDoesntExistError); |
| 705 return; | 708 return; |
| 706 } | 709 } |
| 707 PendingMessagesQueue& pending_messages = pending_for_tls_channel_id->second; | 710 PendingMessagesQueue& pending_messages = pending_for_tls_channel_id->second; |
| 708 if (MaybeAddPendingLazyBackgroundPageOpenChannelTask(profile, | 711 if (MaybeAddPendingLazyBackgroundPageOpenChannelTask( |
| 709 target_extension, | 712 context, target_extension, params.get())) { |
| 710 params.get())) { | |
| 711 // Lazy background queue took ownership. Release ours. | 713 // Lazy background queue took ownership. Release ours. |
| 712 ignore_result(params.release()); | 714 ignore_result(params.release()); |
| 713 // Messages queued up waiting for the TLS channel ID now need to be queued | 715 // Messages queued up waiting for the TLS channel ID now need to be queued |
| 714 // up for the lazy background page to load. | 716 // up for the lazy background page to load. |
| 715 for (PendingMessagesQueue::iterator it = pending_messages.begin(); | 717 for (PendingMessagesQueue::iterator it = pending_messages.begin(); |
| 716 it != pending_messages.end(); | 718 it != pending_messages.end(); |
| 717 it++) { | 719 it++) { |
| 718 EnqueuePendingMessageForLazyBackgroundLoad(it->first, channel_id, | 720 EnqueuePendingMessageForLazyBackgroundLoad(it->first, channel_id, |
| 719 it->second); | 721 it->second); |
| 720 } | 722 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 754 } | 756 } |
| 755 | 757 |
| 756 void MessageService::DispatchOnDisconnect(content::RenderProcessHost* source, | 758 void MessageService::DispatchOnDisconnect(content::RenderProcessHost* source, |
| 757 int port_id, | 759 int port_id, |
| 758 const std::string& error_message) { | 760 const std::string& error_message) { |
| 759 ExtensionMessagePort port(source, MSG_ROUTING_CONTROL, ""); | 761 ExtensionMessagePort port(source, MSG_ROUTING_CONTROL, ""); |
| 760 port.DispatchOnDisconnect(GET_OPPOSITE_PORT_ID(port_id), error_message); | 762 port.DispatchOnDisconnect(GET_OPPOSITE_PORT_ID(port_id), error_message); |
| 761 } | 763 } |
| 762 | 764 |
| 763 } // namespace extensions | 765 } // namespace extensions |
| OLD | NEW |