Home | History | Annotate | Download | only in messaging
      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/extensions/extension_host.h"
      8 #include "chrome/browser/extensions/extension_process_manager.h"
      9 #include "chrome/browser/extensions/extension_system.h"
     10 #include "chrome/browser/profiles/profile.h"
     11 #include "chrome/common/extensions/background_info.h"
     12 #include "chrome/common/extensions/extension_messages.h"
     13 #include "content/public/browser/render_process_host.h"
     14 
     15 namespace extensions {
     16 
     17 ExtensionMessagePort::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 
     26 void 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   ExtensionMsg_ExternalConnectionInfo info;
     34   info.target_id = target_extension_id;
     35   info.source_id = source_extension_id;
     36   info.source_url = source_url;
     37   process_->Send(new ExtensionMsg_DispatchOnConnect(
     38       routing_id_, dest_port_id, channel_name, source_tab, info));
     39 }
     40 
     41 void ExtensionMessagePort::DispatchOnDisconnect(
     42     int source_port_id,
     43     const std::string& error_message) {
     44   process_->Send(new ExtensionMsg_DispatchOnDisconnect(
     45       routing_id_, source_port_id, error_message));
     46 }
     47 
     48 void ExtensionMessagePort::DispatchOnMessage(const std::string& message,
     49                                              int target_port_id) {
     50     process_->Send(new ExtensionMsg_DeliverMessage(
     51         routing_id_, target_port_id, message));
     52 }
     53 
     54 void ExtensionMessagePort::IncrementLazyKeepaliveCount() {
     55   Profile* profile =
     56       Profile::FromBrowserContext(process_->GetBrowserContext());
     57   ExtensionProcessManager* pm =
     58       ExtensionSystem::Get(profile)->process_manager();
     59   ExtensionHost* host = pm->GetBackgroundHostForExtension(extension_id_);
     60   if (host && BackgroundInfo::HasLazyBackgroundPage(host->extension()))
     61     pm->IncrementLazyKeepaliveCount(host->extension());
     62 
     63   // Keep track of the background host, so when we decrement, we only do so if
     64   // the host hasn't reloaded.
     65   background_host_ptr_ = host;
     66 }
     67 
     68 void ExtensionMessagePort::DecrementLazyKeepaliveCount() {
     69   Profile* profile =
     70       Profile::FromBrowserContext(process_->GetBrowserContext());
     71   ExtensionProcessManager* pm =
     72       ExtensionSystem::Get(profile)->process_manager();
     73   ExtensionHost* host = pm->GetBackgroundHostForExtension(extension_id_);
     74   if (host && host == background_host_ptr_)
     75     pm->DecrementLazyKeepaliveCount(host->extension());
     76 }
     77 
     78 content::RenderProcessHost* ExtensionMessagePort::GetRenderProcessHost() {
     79   return process_;
     80 }
     81 
     82 }  // namespace extensions
     83