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