1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2009 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_devtools_manager.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/task.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_devtools_bridge.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_devtools_events.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochExtensionDevToolsManager::ExtensionDevToolsManager(Profile* profile) 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : profile_(profile), 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_loop_(NULL) { 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI); 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_loop_ = MessageLoop::current(); 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochExtensionDevToolsManager::~ExtensionDevToolsManager() { 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExtensionDevToolsManager::AddEventListener(const std::string& event_name, 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int render_process_id) { 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int tab_id; 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (ExtensionDevToolsEvents::IsDevToolsEventName(event_name, &tab_id)) { 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Add the renderer process ID to the set of processes interested 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // in this tab. 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_id_to_render_process_ids_[tab_id].insert(render_process_id); 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (tab_id_to_bridge_.count(tab_id) == 0) { 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create a new bridge for this tab if there isn't one already. 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch linked_ptr<ExtensionDevToolsBridge> bridge( 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new ExtensionDevToolsBridge(tab_id, profile_)); 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (bridge->RegisterAsDevToolsClientHost()) { 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_id_to_bridge_[tab_id] = bridge; 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExtensionDevToolsManager::RemoveEventListener( 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& event_name, 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int render_process_id) { 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int tab_id; 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (ExtensionDevToolsEvents::IsDevToolsEventName(event_name, &tab_id)) { 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::map<int, std::set<int> >::iterator it = 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_id_to_render_process_ids_.find(tab_id); 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (it != tab_id_to_render_process_ids_.end()) { 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Remove the process from the set of processes interested in this tab. 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch it->second.erase(render_process_id); 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (it->second.empty()) { 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // No renderers have registered listeners for this tab, so kill the 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // bridge if there is one. 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (tab_id_to_bridge_.count(tab_id) != 0) { 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch linked_ptr<ExtensionDevToolsBridge> bridge(tab_id_to_bridge_[tab_id]); 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bridge->UnregisterAsDevToolsClientHost(); 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_id_to_bridge_.erase(tab_id); 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExtensionDevToolsManager::BridgeClosingForTab(int tab_id) { 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (tab_id_to_bridge_.count(tab_id) != 0) { 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch linked_ptr<ExtensionDevToolsBridge> bridge(tab_id_to_bridge_[tab_id]); 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bridge->UnregisterAsDevToolsClientHost(); 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_id_to_bridge_.erase(tab_id); 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_id_to_render_process_ids_.erase(tab_id); 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 73