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/ui/webui/inspect_ui.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/pref_service.h" 81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/stl_util.h" 95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/devtools/devtools_target_impl.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/devtools/devtools_targets_ui.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/devtools/devtools_ui_bindings.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h" 148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/ui/singleton_tabs.h" 153240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "chrome/browser/ui/webui/theme_source.h" 162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/common/pref_names.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/devtools_agent_host.h" 1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/browser/navigation_entry.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h" 238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/public/browser/user_metrics.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h" 2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_ui_data_source.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui_message_handler.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/browser_resources.h" 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebUIMessageHandler; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kInitUICommand[] = "init-ui"; 3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kInspectCommand[] = "inspect"; 3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kActivateCommand[] = "activate"; 401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)const char kCloseCommand[] = "close"; 4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kReloadCommand[] = "reload"; 4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kOpenCommand[] = "open"; 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kInspectBrowser[] = "inspect-browser"; 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kLocalHost[] = "localhost"; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kDiscoverUsbDevicesEnabledCommand[] = 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "set-discover-usb-devices-enabled"; 4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kPortForwardingEnabledCommand[] = 492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch "set-port-forwarding-enabled"; 5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kPortForwardingConfigCommand[] = "set-port-forwarding-config"; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kPortForwardingDefaultPort[] = "8080"; 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kPortForwardingDefaultLocation[] = "localhost:8080"; 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// InspectMessageHandler -------------------------------------------- 5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InspectMessageHandler : public WebUIMessageHandler { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 59bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch explicit InspectMessageHandler(InspectUI* inspect_ui) 60bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch : inspect_ui_(inspect_ui) {} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~InspectMessageHandler() {} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebUIMessageHandler implementation. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RegisterMessages() OVERRIDE; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void HandleInitUICommand(const base::ListValue* args); 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void HandleInspectCommand(const base::ListValue* args); 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void HandleActivateCommand(const base::ListValue* args); 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void HandleCloseCommand(const base::ListValue* args); 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void HandleReloadCommand(const base::ListValue* args); 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void HandleOpenCommand(const base::ListValue* args); 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void HandleInspectBrowserCommand(const base::ListValue* args); 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void HandleBooleanPrefChanged(const char* pref_name, 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* args); 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void HandlePortForwardingConfigCommand(const base::ListValue* args); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch InspectUI* inspect_ui_; 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(InspectMessageHandler); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InspectMessageHandler::RegisterMessages() { 84bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch web_ui()->RegisterMessageCallback(kInitUICommand, 85bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch base::Bind(&InspectMessageHandler::HandleInitUICommand, 86bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch base::Unretained(this))); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback(kInspectCommand, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&InspectMessageHandler::HandleInspectCommand, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 90424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) web_ui()->RegisterMessageCallback(kActivateCommand, 91424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::Bind(&InspectMessageHandler::HandleActivateCommand, 92424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::Unretained(this))); 931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) web_ui()->RegisterMessageCallback(kCloseCommand, 941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::Bind(&InspectMessageHandler::HandleCloseCommand, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) web_ui()->RegisterMessageCallback(kDiscoverUsbDevicesEnabledCommand, 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&InspectMessageHandler::HandleBooleanPrefChanged, 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Unretained(this), 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &prefs::kDevToolsDiscoverUsbDevicesEnabled[0])); 1002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch web_ui()->RegisterMessageCallback(kPortForwardingEnabledCommand, 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&InspectMessageHandler::HandleBooleanPrefChanged, 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Unretained(this), 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &prefs::kDevToolsPortForwardingEnabled[0])); 1042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch web_ui()->RegisterMessageCallback(kPortForwardingConfigCommand, 1052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::Bind(&InspectMessageHandler::HandlePortForwardingConfigCommand, 1062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::Unretained(this))); 107bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch web_ui()->RegisterMessageCallback(kReloadCommand, 108bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch base::Bind(&InspectMessageHandler::HandleReloadCommand, 109bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch base::Unretained(this))); 110bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch web_ui()->RegisterMessageCallback(kOpenCommand, 111bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch base::Bind(&InspectMessageHandler::HandleOpenCommand, 112bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch base::Unretained(this))); 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) web_ui()->RegisterMessageCallback(kInspectBrowser, 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&InspectMessageHandler::HandleInspectBrowserCommand, 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Unretained(this))); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InspectMessageHandler::HandleInitUICommand(const base::ListValue*) { 119bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch inspect_ui_->InitUI(); 120bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 121bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static bool ParseStringArgs(const base::ListValue* args, 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string* arg0, 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string* arg1, 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string* arg2 = 0) { 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int arg_size = args->GetSize(); 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return (!arg0 || (arg_size > 0 && args->GetString(0, arg0))) && 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) (!arg1 || (arg_size > 1 && args->GetString(1, arg1))) && 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) (!arg2 || (arg_size > 2 && args->GetString(2, arg2))); 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InspectMessageHandler::HandleInspectCommand(const base::ListValue* args) { 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string source; 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string id; 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ParseStringArgs(args, &source, &id)) 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) inspect_ui_->Inspect(source, id); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InspectMessageHandler::HandleActivateCommand(const base::ListValue* args) { 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string source; 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string id; 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ParseStringArgs(args, &source, &id)) 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) inspect_ui_->Activate(source, id); 144424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 145424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InspectMessageHandler::HandleCloseCommand(const base::ListValue* args) { 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string source; 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string id; 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ParseStringArgs(args, &source, &id)) 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) inspect_ui_->Close(source, id); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InspectMessageHandler::HandleReloadCommand(const base::ListValue* args) { 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string source; 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string id; 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ParseStringArgs(args, &source, &id)) 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) inspect_ui_->Reload(source, id); 158bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 159bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InspectMessageHandler::HandleOpenCommand(const base::ListValue* args) { 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string source_id; 162bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch std::string browser_id; 163bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch std::string url; 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ParseStringArgs(args, &source_id, &browser_id, &url)) 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) inspect_ui_->Open(source_id, browser_id, url); 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void InspectMessageHandler::HandleInspectBrowserCommand( 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::ListValue* args) { 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string source_id; 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string browser_id; 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string front_end; 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (ParseStringArgs(args, &source_id, &browser_id, &front_end)) { 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) inspect_ui_->InspectBrowserWithCustomFrontend( 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) source_id, browser_id, GURL(front_end)); 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void InspectMessageHandler::HandleBooleanPrefChanged( 1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const char* pref_name, 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* args) { 1822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch Profile* profile = Profile::FromWebUI(web_ui()); 1832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (!profile) 1842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return; 1852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch bool enabled; 1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (args->GetSize() == 1 && args->GetBoolean(0, &enabled)) 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) profile->GetPrefs()->SetBoolean(pref_name, enabled); 1892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 1902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochvoid InspectMessageHandler::HandlePortForwardingConfigCommand( 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* args) { 1932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch Profile* profile = Profile::FromWebUI(web_ui()); 1942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (!profile) 1952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return; 1962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* dict_src; 1982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (args->GetSize() == 1 && args->GetDictionary(0, &dict_src)) 1992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch profile->GetPrefs()->Set(prefs::kDevToolsPortForwardingConfig, *dict_src); 2002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 2012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 20203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// DevToolsUIBindingsEnabler ---------------------------------------- 20303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 20403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class DevToolsUIBindingsEnabler 20503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) : public content::WebContentsObserver { 20603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public: 20703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DevToolsUIBindingsEnabler(WebContents* web_contents, 20803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const GURL& url); 20903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual ~DevToolsUIBindingsEnabler() {} 21003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 21103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DevToolsUIBindings* GetBindings(); 21203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 21303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) private: 21403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // contents::WebContentsObserver overrides. 21503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void WebContentsDestroyed() OVERRIDE; 21603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void AboutToNavigateRenderView( 21703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) content::RenderViewHost* render_view_host) OVERRIDE; 21803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 21903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DevToolsUIBindings bindings_; 22003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GURL url_; 22103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DevToolsUIBindingsEnabler); 22203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}; 22303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 22403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)DevToolsUIBindingsEnabler::DevToolsUIBindingsEnabler( 22503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) WebContents* web_contents, 22603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const GURL& url) 22703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) : WebContentsObserver(web_contents), 22803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bindings_(web_contents), 22903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) url_(url) { 23003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 23103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 23203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)DevToolsUIBindings* DevToolsUIBindingsEnabler::GetBindings() { 23303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return &bindings_; 23403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 23503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 23603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void DevToolsUIBindingsEnabler::WebContentsDestroyed() { 23703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) delete this; 23803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 23903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 24003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void DevToolsUIBindingsEnabler::AboutToNavigateRenderView( 24103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) content::RenderViewHost* render_view_host) { 24203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) content::NavigationEntry* entry = 24303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) web_contents()->GetController().GetActiveEntry(); 24403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (url_ != entry->GetURL()) 24503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) delete this; 24603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 24703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// InspectUI -------------------------------------------------------- 25103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InspectUI::InspectUI(content::WebUI* web_ui) 253bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch : WebUIController(web_ui) { 254bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch web_ui->AddMessageHandler(new InspectMessageHandler(this)); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui); 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebUIDataSource::Add(profile, CreateInspectUIHTMLSource()); 2573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 2583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Set up the chrome://theme/ source. 2593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ThemeSource* theme = new ThemeSource(profile); 2603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch content::URLDataSource::Add(profile, theme); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InspectUI::~InspectUI() { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StopListeningNotifications(); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 267bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid InspectUI::InitUI() { 26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SetPortForwardingDefaults(); 269bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch StartListeningNotifications(); 2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateDiscoverUsbDevicesEnabled(); 2712385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch UpdatePortForwardingEnabled(); 2722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch UpdatePortForwardingConfig(); 273a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 274a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InspectUI::Inspect(const std::string& source_id, 276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& target_id) { 2775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DevToolsTargetImpl* target = FindTarget(source_id, target_id); 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (target) { 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string target_type = target->GetType(); 2805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu target->Inspect(Profile::FromWebUI(web_ui())); 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ForceUpdateIfNeeded(source_id, target_type); 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 283bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 284bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InspectUI::Activate(const std::string& source_id, 286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& target_id) { 2875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DevToolsTargetImpl* target = FindTarget(source_id, target_id); 2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (target) { 2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string target_type = target->GetType(); 2905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu target->Activate(); 2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ForceUpdateIfNeeded(source_id, target_type); 2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 2948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InspectUI::Close(const std::string& source_id, 296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& target_id) { 2975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DevToolsTargetImpl* target = FindTarget(source_id, target_id); 2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (target) { 2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string target_type = target->GetType(); 3005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu target->Close(); 3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ForceUpdateIfNeeded(source_id, target_type); 3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 3041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InspectUI::Reload(const std::string& source_id, 306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& target_id) { 3075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DevToolsTargetImpl* target = FindTarget(source_id, target_id); 3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (target) { 3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string target_type = target->GetType(); 3105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu target->Reload(); 3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ForceUpdateIfNeeded(source_id, target_type); 3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 3141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic void NoOp(DevToolsTargetImpl*) {} 3165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InspectUI::Open(const std::string& source_id, 318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& browser_id, 319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& url) { 3205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DevToolsTargetsUIHandler* handler = FindTargetHandler(source_id); 321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (handler) 3225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu handler->Open(browser_id, url, base::Bind(&NoOp)); 323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 3241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void InspectUI::InspectBrowserWithCustomFrontend( 326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& source_id, 327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& browser_id, 328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& frontend_url) { 329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!frontend_url.SchemeIs(content::kChromeUIScheme) && 330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) !frontend_url.SchemeIs(content::kChromeDevToolsScheme) && 331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) frontend_url.host() != kLocalHost) { 332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DevToolsTargetsUIHandler* handler = FindTargetHandler(source_id); 336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!handler) 337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Fetch agent host from remote browser. 340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<content::DevToolsAgentHost> agent_host = 341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) handler->GetBrowserAgentHost(browser_id); 342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (agent_host->IsAttached()) 343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Create web contents for the front-end. 346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WebContents* inspect_ui = web_ui()->GetWebContents(); 347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WebContents* front_end = inspect_ui->GetDelegate()->OpenURLFromTab( 348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) inspect_ui, 34903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) content::OpenURLParams(frontend_url, 350f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::Referrer(), 351f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NEW_FOREGROUND_TAB, 3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_AUTO_TOPLEVEL, 353f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) false)); 354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Install devtools bindings. 35603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DevToolsUIBindingsEnabler* bindings_enabler = 35703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) new DevToolsUIBindingsEnabler(front_end, frontend_url); 3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bindings_enabler->GetBindings()->AttachTo(agent_host); 359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InspectUI::InspectDevices(Browser* browser) { 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::RecordAction(base::UserMetricsAction("InspectDevices")); 363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::NavigateParams params(chrome::GetSingletonTabNavigateParams( 364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser, GURL(chrome::kChromeUIInspectURL))); 365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) params.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE; 366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ShowSingletonTabOverwritingNTP(browser, params); 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InspectUI::Observe(int type, 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (source == content::Source<WebContents>(web_ui()->GetWebContents())) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StopListeningNotifications(); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 376bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid InspectUI::StartListeningNotifications() { 377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!target_handlers_.empty()) // Possible when reloading the page. 378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) StopListeningNotifications(); 379558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 380bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch Profile* profile = Profile::FromWebUI(web_ui()); 381bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 382f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DevToolsTargetsUIHandler::Callback callback = 383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&InspectUI::PopulateTargets, base::Unretained(this)); 384f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 385f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AddTargetUIHandler( 3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DevToolsTargetsUIHandler::CreateForLocal(callback)); 387f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (profile->IsOffTheRecord()) { 388f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ShowIncognitoWarning(); 389f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else { 390f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AddTargetUIHandler( 391f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DevToolsTargetsUIHandler::CreateForAdb(callback, profile)); 392f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 394a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch port_status_serializer_.reset( 395a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch new PortForwardingStatusSerializer( 396a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::Bind(&InspectUI::PopulatePortStatus, base::Unretained(this)), 397a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch profile)); 398a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 3992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch notification_registrar_.Add(this, 4002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch content::NOTIFICATION_WEB_CONTENTS_DISCONNECTED, 4012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch content::NotificationService::AllSources()); 4022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 4032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch pref_change_registrar_.Init(profile->GetPrefs()); 4044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) pref_change_registrar_.Add(prefs::kDevToolsDiscoverUsbDevicesEnabled, 4054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&InspectUI::UpdateDiscoverUsbDevicesEnabled, 4064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Unretained(this))); 4072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch pref_change_registrar_.Add(prefs::kDevToolsPortForwardingEnabled, 4082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::Bind(&InspectUI::UpdatePortForwardingEnabled, 4092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::Unretained(this))); 4102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch pref_change_registrar_.Add(prefs::kDevToolsPortForwardingConfig, 4112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::Bind(&InspectUI::UpdatePortForwardingConfig, 4122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::Unretained(this))); 413bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 414bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InspectUI::StopListeningNotifications() { 416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (target_handlers_.empty()) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) STLDeleteValues(&target_handlers_); 420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 421a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch port_status_serializer_.reset(); 422a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 4232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch notification_registrar_.RemoveAll(); 4242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch pref_change_registrar_.RemoveAll(); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)content::WebUIDataSource* InspectUI::CreateInspectUIHTMLSource() { 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebUIDataSource* source = 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebUIDataSource::Create(chrome::kChromeUIInspectHost); 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddResourcePath("inspect.css", IDR_INSPECT_CSS); 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddResourcePath("inspect.js", IDR_INSPECT_JS); 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->SetDefaultResource(IDR_INSPECT_HTML); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return source; 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void InspectUI::UpdateDiscoverUsbDevicesEnabled() { 437c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch web_ui()->CallJavascriptFunction( 438c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "updateDiscoverUsbDevicesEnabled", 439c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *GetPrefValue(prefs::kDevToolsDiscoverUsbDevicesEnabled)); 4404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 4414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochvoid InspectUI::UpdatePortForwardingEnabled() { 443c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch web_ui()->CallJavascriptFunction( 444c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "updatePortForwardingEnabled", 44558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) *GetPrefValue(prefs::kDevToolsPortForwardingEnabled)); 4462385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 4472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 4482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochvoid InspectUI::UpdatePortForwardingConfig() { 449c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch web_ui()->CallJavascriptFunction( 450c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "updatePortForwardingConfig", 45158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) *GetPrefValue(prefs::kDevToolsPortForwardingConfig)); 45258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 45358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 45458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void InspectUI::SetPortForwardingDefaults() { 45558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui()); 45658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PrefService* prefs = profile->GetPrefs(); 45758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 45858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool default_set; 45958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!GetPrefValue(prefs::kDevToolsPortForwardingDefaultSet)-> 46058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetAsBoolean(&default_set) || default_set) { 46158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return; 46258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 46358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 46458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This is the first chrome://inspect invocation on a fresh profile or after 46558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // upgrade from a version that did not have kDevToolsPortForwardingDefaultSet. 46658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) prefs->SetBoolean(prefs::kDevToolsPortForwardingDefaultSet, true); 46758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 46858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool enabled; 46958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const base::DictionaryValue* config; 47058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!GetPrefValue(prefs::kDevToolsPortForwardingEnabled)-> 47158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetAsBoolean(&enabled) || 47258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) !GetPrefValue(prefs::kDevToolsPortForwardingConfig)-> 47358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetAsDictionary(&config)) { 47458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return; 47558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 47658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 47758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Do nothing if user already took explicit action. 47858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (enabled || config->size() != 0) 47958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return; 48058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 48158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::DictionaryValue default_config; 48258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) default_config.SetString( 48358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) kPortForwardingDefaultPort, kPortForwardingDefaultLocation); 48458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) prefs->Set(prefs::kDevToolsPortForwardingConfig, default_config); 48558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 48658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 48758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const base::Value* InspectUI::GetPrefValue(const char* name) { 4882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch Profile* profile = Profile::FromWebUI(web_ui()); 48958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return profile->GetPrefs()->FindPreference(name)->GetValue(); 4902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InspectUI::AddTargetUIHandler( 493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<DevToolsTargetsUIHandler> handler) { 494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DevToolsTargetsUIHandler* handler_ptr = handler.release(); 495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) target_handlers_[handler_ptr->source_id()] = handler_ptr; 496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)DevToolsTargetsUIHandler* InspectUI::FindTargetHandler( 499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& source_id) { 500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TargetHandlerMap::iterator it = target_handlers_.find(source_id); 5015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return it != target_handlers_.end() ? it->second : NULL; 502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuDevToolsTargetImpl* InspectUI::FindTarget( 5055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::string& source_id, const std::string& target_id) { 5065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu TargetHandlerMap::iterator it = target_handlers_.find(source_id); 5075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return it != target_handlers_.end() ? 5085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu it->second->GetTarget(target_id) : NULL; 509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 511f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InspectUI::PopulateTargets(const std::string& source, 512116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::ListValue& targets) { 513116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_ui()->CallJavascriptFunction("populateTargets", 514116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::StringValue(source), 515116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch targets); 516f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 517a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid InspectUI::ForceUpdateIfNeeded(const std::string& source_id, 5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& target_type) { 5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(dgozman): remove this after moving discovery to protocol. 5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // See crbug.com/398049. 5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (target_type != DevToolsTargetImpl::kTargetTypeServiceWorker) 5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DevToolsTargetsUIHandler* handler = FindTargetHandler(source_id); 5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (handler) 5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handler->ForceUpdate(); 5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 529a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid InspectUI::PopulatePortStatus(const base::Value& status) { 530a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch web_ui()->CallJavascriptFunction("populatePortStatus", status); 531a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 532f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 533f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void InspectUI::ShowIncognitoWarning() { 534f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_ui()->CallJavascriptFunction("showIncognitoWarning"); 535f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 536