Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / messaging / extension_message_port.cc
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/profiles/profile.h"
9 #include "chrome/common/extensions/extension_messages.h"
10 #include "content/public/browser/render_process_host.h"
11 #include "extensions/browser/extension_system.h"
12 #include "extensions/browser/process_manager.h"
13 #include "extensions/common/manifest_handlers/background_info.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     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
43 void 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
50 void 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
56 void 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
70 void 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
80 content::RenderProcessHost* ExtensionMessagePort::GetRenderProcessHost() {
81   return process_;
82 }
83
84 }  // namespace extensions