15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/messaging/extension_message_port.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_host.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_process_manager.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/background_info.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_messages.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionMessagePort::ExtensionMessagePort(content::RenderProcessHost* process, 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int routing_id, 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extension_id) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : process_(process), 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_(routing_id), 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_id_(extension_id), 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) background_host_ptr_(NULL) { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionMessagePort::DispatchOnConnect( 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int dest_port_id, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& channel_name, 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::DictionaryValue& source_tab, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& source_extension_id, 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& target_extension_id, 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL& source_url) { 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionMsg_ExternalConnectionInfo info; 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) info.target_id = target_extension_id; 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) info.source_id = source_extension_id; 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) info.source_url = source_url; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_->Send(new ExtensionMsg_DispatchOnConnect( 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) routing_id_, dest_port_id, channel_name, source_tab, info)); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ExtensionMessagePort::DispatchOnDisconnect( 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int source_port_id, 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& error_message) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_->Send(new ExtensionMsg_DispatchOnDisconnect( 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) routing_id_, source_port_id, error_message)); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ExtensionMessagePort::DispatchOnMessage(const std::string& message, 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int target_port_id) { 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch process_->Send(new ExtensionMsg_DeliverMessage( 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch routing_id_, target_port_id, message)); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionMessagePort::IncrementLazyKeepaliveCount() { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(process_->GetBrowserContext()); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionProcessManager* pm = 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionSystem::Get(profile)->process_manager(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionHost* host = pm->GetBackgroundHostForExtension(extension_id_); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host && BackgroundInfo::HasLazyBackgroundPage(host->extension())) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pm->IncrementLazyKeepaliveCount(host->extension()); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep track of the background host, so when we decrement, we only do so if 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the host hasn't reloaded. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) background_host_ptr_ = host; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionMessagePort::DecrementLazyKeepaliveCount() { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(process_->GetBrowserContext()); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionProcessManager* pm = 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionSystem::Get(profile)->process_manager(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionHost* host = pm->GetBackgroundHostForExtension(extension_id_); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host && host == background_host_ptr_) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pm->DecrementLazyKeepaliveCount(host->extension()); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::RenderProcessHost* ExtensionMessagePort::GetRenderProcessHost() { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return process_; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 83