inspect_ui.cc revision 116680a4aac90f2aa7413d9095a592090648e557
14ee2ad04344446e610172a0e73949212923014dfSebastian Redl// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor// Use of this source code is governed by a BSD-style license that can be 32cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor// found in the LICENSE file. 42cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 52cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/browser/ui/webui/inspect_ui.h" 62cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 72cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "base/prefs/pref_service.h" 82cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "base/stl_util.h" 92cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/browser/devtools/devtools_target_impl.h" 10a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl#include "chrome/browser/devtools/devtools_targets_ui.h" 112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/browser/devtools/devtools_ui_bindings.h" 122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/browser/profiles/profile.h" 132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/browser/ui/browser_navigator.h" 147faa2ec03a7ef120ac165bb45b6c70a8b20c9f1cSebastian Redl#include "chrome/browser/ui/singleton_tabs.h" 150eca89e9890db4d8336ce762a5b359a1d58ca02bArgyrios Kyrtzidis#include "chrome/browser/ui/webui/theme_source.h" 16e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "chrome/common/pref_names.h" 17e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "chrome/common/url_constants.h" 182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "content/public/browser/devtools_agent_host.h" 192cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "content/public/browser/devtools_manager.h" 202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "content/public/browser/notification_service.h" 212a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall#include "content/public/browser/notification_source.h" 2289eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis#include "content/public/browser/notification_types.h" 230b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor#include "content/public/browser/user_metrics.h" 247a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall#include "content/public/browser/web_contents.h" 252cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "content/public/browser/web_contents_delegate.h" 26a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall#include "content/public/browser/web_ui.h" 276ab7cd853e9c15cf986a8a7c3db1f8d20e275409Sebastian Redl#include "content/public/browser/web_ui_data_source.h" 287c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner#include "content/public/browser/web_ui_message_handler.h" 296a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#include "grit/browser_resources.h" 307c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner 3183d63c78810556d26b62ac4cbae2eda6cdd2570cSteve Naroffusing content::WebContents; 3214f79002e58556798e86168c63e48d533287eda5Douglas Gregorusing content::WebUIMessageHandler; 3310e286aa8d39fb51a21412850265d9dae74613eeChris Lattner 343251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregornamespace { 3514f79002e58556798e86168c63e48d533287eda5Douglas Gregor 36bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregorconst char kInitUICommand[] = "init-ui"; 372bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregorconst char kInspectCommand[] = "inspect"; 38ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregorconst char kActivateCommand[] = "activate"; 390a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregorconst char kCloseCommand[] = "close"; 4017fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregorconst char kReloadCommand[] = "reload"; 4117fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregorconst char kOpenCommand[] = "open"; 422596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbarconst char kInspectBrowser[] = "inspect-browser"; 432cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorconst char kLocalHost[] = "localhost"; 44fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer 4514f79002e58556798e86168c63e48d533287eda5Douglas Gregorconst char kDiscoverUsbDevicesEnabledCommand[] = 4603013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer "set-discover-usb-devices-enabled"; 47f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregorconst char kPortForwardingEnabledCommand[] = 483c304bd9ec2b4611572d4cbae9e1727bbecb5dc9Chris Lattner "set-port-forwarding-enabled"; 49cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregorconst char kPortForwardingConfigCommand[] = "set-port-forwarding-config"; 50f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor 512cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorconst char kPortForwardingDefaultPort[] = "8080"; 528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlconst char kPortForwardingDefaultLocation[] = "localhost:8080"; 532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 54ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redlclass InspectMessageHandler : public WebUIMessageHandler { 555f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner public: 565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner explicit InspectMessageHandler(InspectUI* inspect_ui) 575f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner : inspect_ui_(inspect_ui) {} 586e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer virtual ~InspectMessageHandler() {} 59ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl 606e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer private: 616e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer // WebUIMessageHandler implementation. 625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner virtual void RegisterMessages() OVERRIDE; 635f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner 646e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer void HandleInitUICommand(const base::ListValue* args); 65ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl void HandleInspectCommand(const base::ListValue* args); 66ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl void HandleActivateCommand(const base::ListValue* args); 672cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor void HandleCloseCommand(const base::ListValue* args); 682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor void HandleReloadCommand(const base::ListValue* args); 692cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor void HandleOpenCommand(const base::ListValue* args); 7012b1c7615d4f9a2edc544be499f895f16ac100edChris Lattner void HandleInspectBrowserCommand(const base::ListValue* args); 712cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor void HandleBooleanPrefChanged(const char* pref_name, 723397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl const base::ListValue* args); 73a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl void HandlePortForwardingConfigCommand(const base::ListValue* args); 7489eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis 752cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor InspectUI* inspect_ui_; 762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 772cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor DISALLOW_COPY_AND_ASSIGN(InspectMessageHandler); 788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl}; 792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 8089eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidisvoid InspectMessageHandler::RegisterMessages() { 818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl web_ui()->RegisterMessageCallback(kInitUICommand, 822cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor base::Bind(&InspectMessageHandler::HandleInitUICommand, 832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor base::Unretained(this))); 842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor web_ui()->RegisterMessageCallback(kInspectCommand, 852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor base::Bind(&InspectMessageHandler::HandleInspectCommand, 862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor base::Unretained(this))); 872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor web_ui()->RegisterMessageCallback(kActivateCommand, 882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor base::Bind(&InspectMessageHandler::HandleActivateCommand, 892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor base::Unretained(this))); 902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor web_ui()->RegisterMessageCallback(kCloseCommand, 912cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor base::Bind(&InspectMessageHandler::HandleCloseCommand, 922cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor base::Unretained(this))); 933397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl web_ui()->RegisterMessageCallback(kDiscoverUsbDevicesEnabledCommand, 94b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie base::Bind(&InspectMessageHandler::HandleBooleanPrefChanged, 952cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor base::Unretained(this), 962cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor &prefs::kDevToolsDiscoverUsbDevicesEnabled[0])); 973397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl web_ui()->RegisterMessageCallback(kPortForwardingEnabledCommand, 982cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor base::Bind(&InspectMessageHandler::HandleBooleanPrefChanged, 998538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl base::Unretained(this), 1002cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor &prefs::kDevToolsPortForwardingEnabled[0])); 1012cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor web_ui()->RegisterMessageCallback(kPortForwardingConfigCommand, 1023397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl base::Bind(&InspectMessageHandler::HandlePortForwardingConfigCommand, 1032cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor base::Unretained(this))); 1048538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl web_ui()->RegisterMessageCallback(kReloadCommand, 1052cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor base::Bind(&InspectMessageHandler::HandleReloadCommand, 1062cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor base::Unretained(this))); 1073397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl web_ui()->RegisterMessageCallback(kOpenCommand, 1081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump base::Bind(&InspectMessageHandler::HandleOpenCommand, 1098538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl base::Unretained(this))); 1102cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor web_ui()->RegisterMessageCallback(kInspectBrowser, 1112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor base::Bind(&InspectMessageHandler::HandleInspectBrowserCommand, 1123397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl base::Unretained(this))); 113df1550fc59b51681d37225934fe4e3acac321621Richard Smith} 114df1550fc59b51681d37225934fe4e3acac321621Richard Smith 1158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlvoid InspectMessageHandler::HandleInitUICommand(const base::ListValue*) { 1162cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor inspect_ui_->InitUI(); 1172cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 1183397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 119df1550fc59b51681d37225934fe4e3acac321621Richard Smithstatic bool ParseStringArgs(const base::ListValue* args, 1208538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl std::string* arg0, 1212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor std::string* arg1, 1222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor std::string* arg2 = 0) { 1233397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl int arg_size = args->GetSize(); 1241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return (!arg0 || (arg_size > 0 && args->GetString(0, arg0))) && 1251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (!arg1 || (arg_size > 1 && args->GetString(1, arg1))) && 1268538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl (!arg2 || (arg_size > 2 && args->GetString(2, arg2))); 1272cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 1282cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1293397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid InspectMessageHandler::HandleInspectCommand(const base::ListValue* args) { 1302cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor std::string source; 1312cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor std::string id; 1320953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (ParseStringArgs(args, &source, &id)) 1332cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor inspect_ui_->Inspect(source, id); 1342cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 1353397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 1362cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorvoid InspectMessageHandler::HandleActivateCommand(const base::ListValue* args) { 1372cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor std::string source; 1388538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl std::string id; 1392cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (ParseStringArgs(args, &source, &id)) 1402cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor inspect_ui_->Activate(source, id); 1413397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl} 1422cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlvoid InspectMessageHandler::HandleCloseCommand(const base::ListValue* args) { 1442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor std::string source; 1452cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor std::string id; 1463397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl if (ParseStringArgs(args, &source, &id)) 1472cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor inspect_ui_->Close(source, id); 1487e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor} 1497e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor 150c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregorvoid InspectMessageHandler::HandleReloadCommand(const base::ListValue* args) { 1518538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl std::string source; 1522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor std::string id; 1532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (ParseStringArgs(args, &source, &id)) 1543397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl inspect_ui_->Reload(source, id); 1552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 1562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 157e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilsonvoid InspectMessageHandler::HandleOpenCommand(const base::ListValue* args) { 1588538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl std::string source_id; 1592cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor std::string browser_id; 1602cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor std::string url; 1613397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl if (ParseStringArgs(args, &source_id, &browser_id, &url)) 1622cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor inspect_ui_->Open(source_id, browser_id, url); 1638538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl} 1642cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorvoid InspectMessageHandler::HandleInspectBrowserCommand( 1663397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl const base::ListValue* args) { 1672cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor std::string source_id; 168264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola std::string browser_id; 169264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola std::string front_end; 170a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman if (ParseStringArgs(args, &source_id, &browser_id, &front_end)) { 171425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola inspect_ui_->InspectBrowserWithCustomFrontend( 172ab8bbf4ebd3e3e6eab913cb044772a62b7581941Douglas Gregor source_id, browser_id, GURL(front_end)); 173264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola } 174f85e193739c953358c865005855253af4f68a497John McCall} 1752cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorvoid InspectMessageHandler::HandleBooleanPrefChanged( 1773397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl const char* pref_name, 1782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor const base::ListValue* args) { 1798538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Profile* profile = Profile::FromWebUI(web_ui()); 1802cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (!profile) 1812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return; 1823397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 1832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor bool enabled; 1842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (args->GetSize() == 1 && args->GetBoolean(0, &enabled)) 1852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor profile->GetPrefs()->SetBoolean(pref_name, enabled); 1862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 1872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorvoid InspectMessageHandler::HandlePortForwardingConfigCommand( 189c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor const base::ListValue* args) { 19060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl Profile* profile = Profile::FromWebUI(web_ui()); 19160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (!profile) 19260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl return; 19360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl 19460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl const base::DictionaryValue* dict_src; 19560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (args->GetSize() == 1 && args->GetDictionary(0, &dict_src)) 19660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl profile->GetPrefs()->Set(prefs::kDevToolsPortForwardingConfig, *dict_src); 19760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl} 1988538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 1992cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} // namespace 2002cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2013397c5570369f19b2d6c52e898f708d75ceede1fSebastian RedlInspectUI::InspectUI(content::WebUI* web_ui) 202ed97649e9574b9d854fa4d6109c9333ae0993554John McCall : WebUIController(web_ui) { 2038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl web_ui->AddMessageHandler(new InspectMessageHandler(this)); 204ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Profile* profile = Profile::FromWebUI(web_ui); 205ed97649e9574b9d854fa4d6109c9333ae0993554John McCall content::WebUIDataSource::Add(profile, CreateInspectUIHTMLSource()); 2063397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 2072cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor // Set up the chrome://theme/ source. 2089763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis ThemeSource* theme = new ThemeSource(profile); 2099763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis content::URLDataSource::Add(profile, theme); 2108538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl} 2112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas GregorInspectUI::~InspectUI() { 2133397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl StopListeningNotifications(); 214c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor} 2158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 2162cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorvoid InspectUI::InitUI() { 2172cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor SetPortForwardingDefaults(); 2183397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl StartListeningNotifications(); 2192cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor UpdateDiscoverUsbDevicesEnabled(); 2208538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl UpdatePortForwardingEnabled(); 2212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor UpdatePortForwardingConfig(); 2222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 2233397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 224395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlssonvoid InspectUI::Inspect(const std::string& source_id, 2258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl const std::string& target_id) { 226395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson DevToolsTargetImpl* target = FindTarget(source_id, target_id); 227395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson if (target) 228ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt target->Inspect(Profile::FromWebUI(web_ui())); 229ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt} 230ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt 231ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Huntvoid InspectUI::Activate(const std::string& source_id, 232ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt const std::string& target_id) { 233ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt DevToolsTargetImpl* target = FindTarget(source_id, target_id); 234ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt if (target) 23534b41d939a1328f484511c6002ba2456db879a29Richard Smith target->Activate(); 23634b41d939a1328f484511c6002ba2456db879a29Richard Smith} 23734b41d939a1328f484511c6002ba2456db879a29Richard Smith 23834b41d939a1328f484511c6002ba2456db879a29Richard Smithvoid InspectUI::Close(const std::string& source_id, 23934b41d939a1328f484511c6002ba2456db879a29Richard Smith const std::string& target_id) { 2403397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl DevToolsTargetImpl* target = FindTarget(source_id, target_id); 241be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis if (target) 2422cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor target->Close(); 2431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 2442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2452cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorvoid InspectUI::Reload(const std::string& source_id, 2462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor const std::string& target_id) { 2473397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl DevToolsTargetImpl* target = FindTarget(source_id, target_id); 2482cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (target) 2498538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl target->Reload(); 2502cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 2512cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2523397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlstatic void NoOp(DevToolsTargetImpl*) {} 2532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2548538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlvoid InspectUI::Open(const std::string& source_id, 2552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor const std::string& browser_id, 2562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor const std::string& url) { 2579d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall DevToolsTargetsUIHandler* handler = FindTargetHandler(source_id); 2589d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (handler) 2599d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall handler->Open(browser_id, url, base::Bind(&NoOp)); 2609d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall} 2619d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 2629d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallvoid InspectUI::InspectBrowserWithCustomFrontend( 2639d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall const std::string& source_id, 2641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const std::string& browser_id, 2653397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl const GURL& frontend_url) { 26649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall if (!frontend_url.SchemeIs(content::kChromeUIScheme) && 26749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall !frontend_url.SchemeIs(content::kChromeDevToolsScheme) && 26849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall frontend_url.host() != kLocalHost) { 2698538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl return; 27049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall } 27149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 27249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall DevToolsTargetsUIHandler* handler = FindTargetHandler(source_id); 273c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor if (!handler) 274c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor return; 275c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 276c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor // Fetch agent host from remote browser. 277c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor scoped_refptr<content::DevToolsAgentHost> agent_host = 278c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor handler->GetBrowserAgentHost(browser_id); 279c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor if (agent_host->IsAttached()) 280c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor return; 2813397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 2822cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor // Create web contents for the front-end. 283be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis WebContents* inspect_ui = web_ui()->GetWebContents(); 28490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis WebContents* front_end = inspect_ui->GetDelegate()->OpenURLFromTab( 28590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis inspect_ui, 28690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis content::OpenURLParams(GURL(url::kAboutBlankURL), 28790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis content::Referrer(), 28890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis NEW_FOREGROUND_TAB, 2893e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith content::PAGE_TRANSITION_AUTO_TOPLEVEL, 2903e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith false)); 2919763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis 2929763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis // Install devtools bindings. 2938538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl DevToolsUIBindings* bindings = new DevToolsUIBindings(front_end, 29490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis frontend_url); 29590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 29690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis // Engage remote debugging between front-end and agent host. 2973397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl content::DevToolsManager::GetInstance()->RegisterDevToolsClientHostFor( 298ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis agent_host, bindings->frontend_host()); 299ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis} 300ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis 3018538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlvoid InspectUI::InspectDevices(Browser* browser) { 30290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis content::RecordAction(base::UserMetricsAction("InspectDevices")); 30390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis chrome::NavigateParams params(chrome::GetSingletonTabNavigateParams( 30490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis browser, GURL(chrome::kChromeUIInspectURL))); 3053397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl params.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE; 30690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis ShowSingletonTabOverwritingNTP(browser, params); 30790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis} 308b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie 30990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisvoid InspectUI::Observe(int type, 31090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis const content::NotificationSource& source, 31190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis const content::NotificationDetails& details) { 3123397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl if (source == content::Source<WebContents>(web_ui()->GetWebContents())) 31390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis StopListeningNotifications(); 31490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis} 31590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 3164fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruthvoid InspectUI::StartListeningNotifications() { 3178538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl if (!target_handlers_.empty()) // Possible when reloading the page. 31890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis StopListeningNotifications(); 31990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 32090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis Profile* profile = Profile::FromWebUI(web_ui()); 3213397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 3228dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis DevToolsTargetsUIHandler::Callback callback = 3238dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis base::Bind(&InspectUI::PopulateTargets, base::Unretained(this)); 3248dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis 325f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis AddTargetUIHandler( 326f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis DevToolsTargetsUIHandler::CreateForRenderers(callback)); 327f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis AddTargetUIHandler( 3288538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl DevToolsTargetsUIHandler::CreateForWorkers(callback)); 32990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis if (profile->IsOffTheRecord()) { 33090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis ShowIncognitoWarning(); 33190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis } else { 3323397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl AddTargetUIHandler( 33390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis DevToolsTargetsUIHandler::CreateForAdb(callback, profile)); 3343acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis } 3353acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis 3363acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis port_status_serializer_.reset( 3373acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis new PortForwardingStatusSerializer( 3383acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis base::Bind(&InspectUI::PopulatePortStatus, base::Unretained(this)), 3393acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis profile)); 3403acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis 3418538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl notification_registrar_.Add(this, 3422cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor content::NOTIFICATION_WEB_CONTENTS_DISCONNECTED, 3432cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor content::NotificationService::AllSources()); 3447536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 3457536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor pref_change_registrar_.Init(profile->GetPrefs()); 346cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor pref_change_registrar_.Add(prefs::kDevToolsDiscoverUsbDevicesEnabled, 347cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor base::Bind(&InspectUI::UpdateDiscoverUsbDevicesEnabled, 348cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor base::Unretained(this))); 349cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor pref_change_registrar_.Add(prefs::kDevToolsPortForwardingEnabled, 3507536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor base::Bind(&InspectUI::UpdatePortForwardingEnabled, 3517536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor base::Unretained(this))); 3527536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor pref_change_registrar_.Add(prefs::kDevToolsPortForwardingConfig, 353075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara base::Bind(&InspectUI::UpdatePortForwardingConfig, 354075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara base::Unretained(this))); 355075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara} 356075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 357075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnaravoid InspectUI::StopListeningNotifications() { 3583397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl if (target_handlers_.empty()) 359465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return; 3603acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis 3613acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis STLDeleteValues(&target_handlers_); 3628538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 3632cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor port_status_serializer_.reset(); 3642cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 3653397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl notification_registrar_.RemoveAll(); 3663cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall pref_change_registrar_.RemoveAll(); 36731f17ecbef57b5679c017c375db330546b7b5145John McCall} 3688538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 3693cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallcontent::WebUIDataSource* InspectUI::CreateInspectUIHTMLSource() { 3703cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall content::WebUIDataSource* source = 3713397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl content::WebUIDataSource::Create(chrome::kChromeUIInspectHost); 372deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor source->AddResourcePath("inspect.css", IDR_INSPECT_CSS); 3738538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl source->AddResourcePath("inspect.js", IDR_INSPECT_JS); 374c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall source->SetDefaultResource(IDR_INSPECT_HTML); 375c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall source->OverrideContentSecurityPolicyFrameSrc( 3763397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl "frame-src chrome://serviceworker-internals;"); 377c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall serviceworker_webui_.reset(web_ui()->GetWebContents()->CreateWebUI( 3782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor GURL(content::kChromeUIServiceWorkerInternalsURL))); 379c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall serviceworker_webui_->OverrideJavaScriptFrame( 380446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroff content::kChromeUIServiceWorkerInternalsHost); 381446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroff return source; 3828538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl} 3832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 3842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorvoid InspectUI::RenderViewCreated(content::RenderViewHost* render_view_host) { 385d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff serviceworker_webui_->GetController()->RenderViewCreated(render_view_host); 3863397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl} 3871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3888538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlvoid InspectUI::RenderViewReused(content::RenderViewHost* render_view_host) { 3892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor serviceworker_webui_->GetController()->RenderViewReused(render_view_host); 3902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 391b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 392b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedmanbool InspectUI::OverrideHandleWebUIMessage(const GURL& source_url, 393b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman const std::string& message, 394b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman const base::ListValue& args) { 395b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (source_url.SchemeIs(content::kChromeUIScheme) && 396b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman source_url.host() == content::kChromeUIServiceWorkerInternalsHost) { 397a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall serviceworker_webui_->ProcessWebUIMessage(source_url, message, args); 398a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall return true; 399a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall } 400a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl return false; 40189eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis} 402a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 403a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCallvoid InspectUI::UpdateDiscoverUsbDevicesEnabled() { 40489eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis web_ui()->CallJavascriptFunction( 405a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall "updateDiscoverUsbDevicesEnabled", 406a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall *GetPrefValue(prefs::kDevToolsDiscoverUsbDevicesEnabled)); 40751bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 408a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 40951bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid InspectUI::UpdatePortForwardingEnabled() { 410a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall web_ui()->CallJavascriptFunction( 411a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall "updatePortForwardingEnabled", 41251bd803fbdade51d674598ed45da3d54190a656cJohn McCall *GetPrefValue(prefs::kDevToolsPortForwardingEnabled)); 41351bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 414a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 415a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCallvoid InspectUI::UpdatePortForwardingConfig() { 416a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall web_ui()->CallJavascriptFunction( 417a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall "updatePortForwardingConfig", 41851bd803fbdade51d674598ed45da3d54190a656cJohn McCall *GetPrefValue(prefs::kDevToolsPortForwardingConfig)); 41951bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 42051bd803fbdade51d674598ed45da3d54190a656cJohn McCall 42151bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid InspectUI::SetPortForwardingDefaults() { 422ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor Profile* profile = Profile::FromWebUI(web_ui()); 423ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor PrefService* prefs = profile->GetPrefs(); 424ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor 425ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor bool default_set; 426ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor if (!GetPrefValue(prefs::kDevToolsPortForwardingDefaultSet)-> 427ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor GetAsBoolean(&default_set) || default_set) { 428ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor return; 42951bd803fbdade51d674598ed45da3d54190a656cJohn McCall } 43051bd803fbdade51d674598ed45da3d54190a656cJohn McCall 43151bd803fbdade51d674598ed45da3d54190a656cJohn McCall // This is the first chrome://inspect invocation on a fresh profile or after 43251bd803fbdade51d674598ed45da3d54190a656cJohn McCall // upgrade from a version that did not have kDevToolsPortForwardingDefaultSet. 43351bd803fbdade51d674598ed45da3d54190a656cJohn McCall prefs->SetBoolean(prefs::kDevToolsPortForwardingDefaultSet, true); 43451bd803fbdade51d674598ed45da3d54190a656cJohn McCall 43551bd803fbdade51d674598ed45da3d54190a656cJohn McCall bool enabled; 43651bd803fbdade51d674598ed45da3d54190a656cJohn McCall const base::DictionaryValue* config; 43751bd803fbdade51d674598ed45da3d54190a656cJohn McCall if (!GetPrefValue(prefs::kDevToolsPortForwardingEnabled)-> 43851bd803fbdade51d674598ed45da3d54190a656cJohn McCall GetAsBoolean(&enabled) || 43951bd803fbdade51d674598ed45da3d54190a656cJohn McCall !GetPrefValue(prefs::kDevToolsPortForwardingConfig)-> 44051bd803fbdade51d674598ed45da3d54190a656cJohn McCall GetAsDictionary(&config)) { 44151bd803fbdade51d674598ed45da3d54190a656cJohn McCall return; 44251bd803fbdade51d674598ed45da3d54190a656cJohn McCall } 44351bd803fbdade51d674598ed45da3d54190a656cJohn McCall 44451bd803fbdade51d674598ed45da3d54190a656cJohn McCall // Do nothing if user already took explicit action. 44551bd803fbdade51d674598ed45da3d54190a656cJohn McCall if (enabled || config->size() != 0) 44651bd803fbdade51d674598ed45da3d54190a656cJohn McCall return; 447b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara 44851bd803fbdade51d674598ed45da3d54190a656cJohn McCall base::DictionaryValue default_config; 44951bd803fbdade51d674598ed45da3d54190a656cJohn McCall default_config.SetString( 45051bd803fbdade51d674598ed45da3d54190a656cJohn McCall kPortForwardingDefaultPort, kPortForwardingDefaultLocation); 45151bd803fbdade51d674598ed45da3d54190a656cJohn McCall prefs->Set(prefs::kDevToolsPortForwardingConfig, default_config); 45251bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 45351bd803fbdade51d674598ed45da3d54190a656cJohn McCall 45451bd803fbdade51d674598ed45da3d54190a656cJohn McCallconst base::Value* InspectUI::GetPrefValue(const char* name) { 45551bd803fbdade51d674598ed45da3d54190a656cJohn McCall Profile* profile = Profile::FromWebUI(web_ui()); 45651bd803fbdade51d674598ed45da3d54190a656cJohn McCall return profile->GetPrefs()->FindPreference(name)->GetValue(); 45751bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 45851bd803fbdade51d674598ed45da3d54190a656cJohn McCall 45951bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid InspectUI::AddTargetUIHandler( 46051bd803fbdade51d674598ed45da3d54190a656cJohn McCall scoped_ptr<DevToolsTargetsUIHandler> handler) { 46151bd803fbdade51d674598ed45da3d54190a656cJohn McCall DevToolsTargetsUIHandler* handler_ptr = handler.release(); 46251bd803fbdade51d674598ed45da3d54190a656cJohn McCall target_handlers_[handler_ptr->source_id()] = handler_ptr; 46351bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 46451bd803fbdade51d674598ed45da3d54190a656cJohn McCall 46551bd803fbdade51d674598ed45da3d54190a656cJohn McCallDevToolsTargetsUIHandler* InspectUI::FindTargetHandler( 46651bd803fbdade51d674598ed45da3d54190a656cJohn McCall const std::string& source_id) { 46751bd803fbdade51d674598ed45da3d54190a656cJohn McCall TargetHandlerMap::iterator it = target_handlers_.find(source_id); 46851bd803fbdade51d674598ed45da3d54190a656cJohn McCall return it != target_handlers_.end() ? it->second : NULL; 46951bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 47051bd803fbdade51d674598ed45da3d54190a656cJohn McCall 47151bd803fbdade51d674598ed45da3d54190a656cJohn McCallDevToolsTargetImpl* InspectUI::FindTarget( 47251bd803fbdade51d674598ed45da3d54190a656cJohn McCall const std::string& source_id, const std::string& target_id) { 47351bd803fbdade51d674598ed45da3d54190a656cJohn McCall TargetHandlerMap::iterator it = target_handlers_.find(source_id); 47451bd803fbdade51d674598ed45da3d54190a656cJohn McCall return it != target_handlers_.end() ? 47551bd803fbdade51d674598ed45da3d54190a656cJohn McCall it->second->GetTarget(target_id) : NULL; 47651bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 47751bd803fbdade51d674598ed45da3d54190a656cJohn McCall 47851bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid InspectUI::PopulateTargets(const std::string& source, 47951bd803fbdade51d674598ed45da3d54190a656cJohn McCall const base::ListValue& targets) { 480796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara web_ui()->CallJavascriptFunction("populateTargets", 481796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara base::StringValue(source), 482dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor targets); 48351bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 48451bd803fbdade51d674598ed45da3d54190a656cJohn McCall 48551bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid InspectUI::PopulatePortStatus(const base::Value& status) { 48651bd803fbdade51d674598ed45da3d54190a656cJohn McCall web_ui()->CallJavascriptFunction("populatePortStatus", status); 48751bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 48851bd803fbdade51d674598ed45da3d54190a656cJohn McCall 48951bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid InspectUI::ShowIncognitoWarning() { 49051bd803fbdade51d674598ed45da3d54190a656cJohn McCall web_ui()->CallJavascriptFunction("showIncognitoWarning"); 49151bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 492ed97649e9574b9d854fa4d6109c9333ae0993554John McCall