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 3// found in the LICENSE file. 4 5#include "chrome/browser/extensions/api/messaging/extension_message_port.h" 6 7#include "chrome/browser/profiles/profile.h" 8#include "content/public/browser/render_process_host.h" 9#include "extensions/browser/extension_host.h" 10#include "extensions/browser/extension_system.h" 11#include "extensions/browser/process_manager.h" 12#include "extensions/common/extension_messages.h" 13#include "extensions/common/manifest_handlers/background_info.h" 14 15namespace extensions { 16 17ExtensionMessagePort::ExtensionMessagePort(content::RenderProcessHost* process, 18 int routing_id, 19 const std::string& extension_id) 20 : process_(process), 21 routing_id_(routing_id), 22 extension_id_(extension_id), 23 background_host_ptr_(NULL) { 24} 25 26void ExtensionMessagePort::DispatchOnConnect( 27 int dest_port_id, 28 const std::string& channel_name, 29 const base::DictionaryValue& source_tab, 30 const std::string& source_extension_id, 31 const std::string& target_extension_id, 32 const GURL& source_url, 33 const std::string& tls_channel_id) { 34 ExtensionMsg_ExternalConnectionInfo info; 35 info.target_id = target_extension_id; 36 info.source_id = source_extension_id; 37 info.source_url = source_url; 38 process_->Send(new ExtensionMsg_DispatchOnConnect( 39 routing_id_, dest_port_id, channel_name, source_tab, info, 40 tls_channel_id)); 41} 42 43void ExtensionMessagePort::DispatchOnDisconnect( 44 int source_port_id, 45 const std::string& error_message) { 46 process_->Send(new ExtensionMsg_DispatchOnDisconnect( 47 routing_id_, source_port_id, error_message)); 48} 49 50void ExtensionMessagePort::DispatchOnMessage(const Message& message, 51 int target_port_id) { 52 process_->Send(new ExtensionMsg_DeliverMessage( 53 routing_id_, target_port_id, message)); 54} 55 56void ExtensionMessagePort::IncrementLazyKeepaliveCount() { 57 Profile* profile = 58 Profile::FromBrowserContext(process_->GetBrowserContext()); 59 extensions::ProcessManager* pm = 60 ExtensionSystem::Get(profile)->process_manager(); 61 ExtensionHost* host = pm->GetBackgroundHostForExtension(extension_id_); 62 if (host && BackgroundInfo::HasLazyBackgroundPage(host->extension())) 63 pm->IncrementLazyKeepaliveCount(host->extension()); 64 65 // Keep track of the background host, so when we decrement, we only do so if 66 // the host hasn't reloaded. 67 background_host_ptr_ = host; 68} 69 70void ExtensionMessagePort::DecrementLazyKeepaliveCount() { 71 Profile* profile = 72 Profile::FromBrowserContext(process_->GetBrowserContext()); 73 extensions::ProcessManager* pm = 74 ExtensionSystem::Get(profile)->process_manager(); 75 ExtensionHost* host = pm->GetBackgroundHostForExtension(extension_id_); 76 if (host && host == background_host_ptr_) 77 pm->DecrementLazyKeepaliveCount(host->extension()); 78} 79 80content::RenderProcessHost* ExtensionMessagePort::GetRenderProcessHost() { 81 return process_; 82} 83 84} // namespace extensions 85