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