15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved.
25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be
35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file.
45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/devtools/devtools_ui_bindings.h"
65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/command_line.h"
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/json/json_reader.h"
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/json/json_writer.h"
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/strings/string_number_conversions.h"
115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/strings/string_util.h"
12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/strings/stringprintf.h"
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/strings/utf_string_conversions.h"
145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/values.h"
155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/chrome_notification_types.h"
165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/chrome_page_zoom.h"
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/devtools/devtools_target_impl.h"
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/extensions/chrome_extension_web_contents_observer.h"
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/extensions/extension_service.h"
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/infobars/infobar_service.h"
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/profiles/profile.h"
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/themes/theme_properties.h"
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/themes/theme_service.h"
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/themes/theme_service_factory.h"
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/ui/browser.h"
265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/ui/browser_iterator.h"
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/ui/browser_list.h"
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/ui/browser_window.h"
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/ui/tabs/tab_strip_model.h"
305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/common/chrome_switches.h"
315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/common/extensions/manifest_url_handler.h"
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/common/url_constants.h"
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/infobars/core/confirm_infobar_delegate.h"
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "components/infobars/core/infobar.h"
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/browser/favicon_status.h"
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/public/browser/invalidate_type.h"
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/browser/navigation_controller.h"
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/browser/navigation_entry.h"
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/browser/notification_source.h"
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/browser/render_frame_host.h"
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/browser/render_view_host.h"
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/browser/user_metrics.h"
445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/browser/web_contents.h"
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/browser/web_contents_observer.h"
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/common/renderer_preferences.h"
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/common/url_constants.h"
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "extensions/browser/extension_system.h"
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "extensions/common/extension_set.h"
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h"
515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/base/l10n/l10n_util.h"
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/page_transition_types.h"
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuusing base::DictionaryValue;
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuusing content::BrowserThread;
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace {
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kFrontendHostId[] = "id";
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kFrontendHostMethod[] = "method";
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kFrontendHostParams[] = "params";
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static const char kTitleFormat[] = "Developer Tools - %s";
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)typedef std::vector<DevToolsUIBindings*> DevToolsUIBindingsList;
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)base::LazyInstance<DevToolsUIBindingsList>::Leaky g_instances =
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    LAZY_INSTANCE_INITIALIZER;
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustd::string SkColorToRGBAString(SkColor color) {
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // We avoid StringPrintf because it will use locale specific formatters for
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // the double (e.g. ',' instead of '.' in German).
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return "rgba(" + base::IntToString(SkColorGetR(color)) + "," +
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      base::IntToString(SkColorGetG(color)) + "," +
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      base::IntToString(SkColorGetB(color)) + "," +
745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      base::DoubleToString(SkColorGetA(color) / 255.0) + ")";
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubase::DictionaryValue* CreateFileSystemValue(
785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    DevToolsFileHelper::FileSystem file_system) {
795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::DictionaryValue* file_system_value = new base::DictionaryValue();
805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file_system_value->SetString("fileSystemName", file_system.file_system_name);
815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file_system_value->SetString("rootURL", file_system.root_url);
825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file_system_value->SetString("fileSystemPath", file_system.file_system_path);
835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return file_system_value;
845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuBrowser* FindBrowser(content::WebContents* web_contents) {
875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  for (chrome::BrowserIterator it; !it.done(); it.Next()) {
885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    int tab_index = it->tab_strip_model()->GetIndexOfWebContents(
895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        web_contents);
905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (tab_index != TabStripModel::kNoTab)
915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return *it;
925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return NULL;
945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// DevToolsConfirmInfoBarDelegate ---------------------------------------------
975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liutypedef base::Callback<void(bool)> InfoBarCallback;
995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass DevToolsConfirmInfoBarDelegate : public ConfirmInfoBarDelegate {
1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public:
1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // If |infobar_service| is NULL, runs |callback| with a single argument with
1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // value "false".  Otherwise, creates a dev tools confirm infobar and delegate
1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // and adds the infobar to |infobar_service|.
1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static void Create(InfoBarService* infobar_service,
1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     const InfoBarCallback& callback,
1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     const base::string16& message);
1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private:
1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DevToolsConfirmInfoBarDelegate(
1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const InfoBarCallback& callback,
1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const base::string16& message);
1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual ~DevToolsConfirmInfoBarDelegate();
1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual base::string16 GetMessageText() const OVERRIDE;
1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual base::string16 GetButtonLabel(InfoBarButton button) const OVERRIDE;
1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual bool Accept() OVERRIDE;
1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual bool Cancel() OVERRIDE;
1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  InfoBarCallback callback_;
1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const base::string16 message_;
1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DISALLOW_COPY_AND_ASSIGN(DevToolsConfirmInfoBarDelegate);
1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu};
1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsConfirmInfoBarDelegate::Create(
1275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    InfoBarService* infobar_service,
1285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const InfoBarCallback& callback,
1295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const base::string16& message) {
1305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!infobar_service) {
1315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    callback.Run(false);
1325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return;
1335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  infobar_service->AddInfoBar(ConfirmInfoBarDelegate::CreateInfoBar(
1365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      scoped_ptr<ConfirmInfoBarDelegate>(
1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          new DevToolsConfirmInfoBarDelegate(callback, message))));
1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuDevToolsConfirmInfoBarDelegate::DevToolsConfirmInfoBarDelegate(
1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const InfoBarCallback& callback,
1425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const base::string16& message)
1435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    : ConfirmInfoBarDelegate(),
1445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      callback_(callback),
1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      message_(message) {
1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuDevToolsConfirmInfoBarDelegate::~DevToolsConfirmInfoBarDelegate() {
1495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!callback_.is_null())
1505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    callback_.Run(false);
1515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubase::string16 DevToolsConfirmInfoBarDelegate::GetMessageText() const {
1545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return message_;
1555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubase::string16 DevToolsConfirmInfoBarDelegate::GetButtonLabel(
1585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    InfoBarButton button) const {
1595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return l10n_util::GetStringUTF16((button == BUTTON_OK) ?
1605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      IDS_DEV_TOOLS_CONFIRM_ALLOW_BUTTON : IDS_DEV_TOOLS_CONFIRM_DENY_BUTTON);
1615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool DevToolsConfirmInfoBarDelegate::Accept() {
1645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  callback_.Run(true);
1655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  callback_.Reset();
1665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return true;
1675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool DevToolsConfirmInfoBarDelegate::Cancel() {
1705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  callback_.Run(false);
1715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  callback_.Reset();
1725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return true;
1735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// DevToolsUIDefaultDelegate --------------------------------------------------
1765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass DefaultBindingsDelegate : public DevToolsUIBindings::Delegate {
1785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public:
1795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  explicit DefaultBindingsDelegate(content::WebContents* web_contents)
1805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      : web_contents_(web_contents) {}
1815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private:
1835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual ~DefaultBindingsDelegate() {}
1845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void ActivateWindow() OVERRIDE;
1865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void CloseWindow() OVERRIDE {}
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void SetInspectedPageBounds(const gfx::Rect& rect) OVERRIDE {}
1885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void InspectElementCompleted() OVERRIDE {}
1895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void MoveWindow(int x, int y) OVERRIDE {}
1905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void SetIsDocked(bool is_docked) OVERRIDE {}
1915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void OpenInNewTab(const std::string& url) OVERRIDE;
1925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void SetWhitelistedShortcuts(const std::string& message) OVERRIDE {}
1935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void InspectedContentsClosing() OVERRIDE;
1955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void OnLoadCompleted() OVERRIDE {}
196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual InfoBarService* GetInfoBarService() OVERRIDE;
197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void RenderProcessGone() OVERRIDE {}
1985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  content::WebContents* web_contents_;
2005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DISALLOW_COPY_AND_ASSIGN(DefaultBindingsDelegate);
2015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu};
2025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DefaultBindingsDelegate::ActivateWindow() {
2045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  web_contents_->GetDelegate()->ActivateContents(web_contents_);
205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  web_contents_->Focus();
2065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
2075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DefaultBindingsDelegate::OpenInNewTab(const std::string& url) {
2095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  content::OpenURLParams params(
2105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GURL(url), content::Referrer(), NEW_FOREGROUND_TAB,
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ui::PAGE_TRANSITION_LINK, false);
2125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  Browser* browser = FindBrowser(web_contents_);
2135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  browser->OpenURL(params);
2145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
2155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DefaultBindingsDelegate::InspectedContentsClosing() {
2175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  web_contents_->GetRenderViewHost()->ClosePage();
2185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
2195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)InfoBarService* DefaultBindingsDelegate::GetInfoBarService() {
221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return InfoBarService::FromWebContents(web_contents_);
222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}  // namespace
2255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// DevToolsUIBindings::FrontendWebContentsObserver ----------------------------
2275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass DevToolsUIBindings::FrontendWebContentsObserver
2295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    : public content::WebContentsObserver {
2305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public:
231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  explicit FrontendWebContentsObserver(DevToolsUIBindings* ui_bindings);
2325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual ~FrontendWebContentsObserver();
2335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private:
2355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // contents::WebContentsObserver:
236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE;
2375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void AboutToNavigateRenderView(
2385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      content::RenderViewHost* render_view_host) OVERRIDE;
239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void DocumentOnLoadCompletedInMainFrame() OVERRIDE;
2405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DevToolsUIBindings* devtools_bindings_;
2425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DISALLOW_COPY_AND_ASSIGN(FrontendWebContentsObserver);
2435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu};
2445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuDevToolsUIBindings::FrontendWebContentsObserver::FrontendWebContentsObserver(
246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DevToolsUIBindings* devtools_ui_bindings)
247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : WebContentsObserver(devtools_ui_bindings->web_contents()),
248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      devtools_bindings_(devtools_ui_bindings) {
2495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
2505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuDevToolsUIBindings::FrontendWebContentsObserver::
2525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ~FrontendWebContentsObserver() {
2535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
2545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void DevToolsUIBindings::FrontendWebContentsObserver::RenderProcessGone(
256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    base::TerminationStatus status) {
2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  switch (status) {
2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case base::TERMINATION_STATUS_ABNORMAL_TERMINATION:
2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case base::TERMINATION_STATUS_PROCESS_WAS_KILLED:
2605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case base::TERMINATION_STATUS_PROCESS_CRASHED:
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (devtools_bindings_->agent_host_.get())
26203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        devtools_bindings_->Detach();
2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      break;
2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    default:
2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      break;
2665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  devtools_bindings_->delegate_->RenderProcessGone();
268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::FrontendWebContentsObserver::AboutToNavigateRenderView(
2715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    content::RenderViewHost* render_view_host) {
27203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  devtools_bindings_->frontend_host_.reset(
27303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      content::DevToolsFrontendHost::Create(
27403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          render_view_host, devtools_bindings_));
2755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
2765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::FrontendWebContentsObserver::
278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    DocumentOnLoadCompletedInMainFrame() {
2795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  devtools_bindings_->DocumentOnLoadCompletedInMainFrame();
2805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
2815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// DevToolsUIBindings ---------------------------------------------------------
2835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
28403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)DevToolsUIBindings* DevToolsUIBindings::ForWebContents(
28503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)     content::WebContents* web_contents) {
28603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (g_instances == NULL)
28703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)   return NULL;
28803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DevToolsUIBindingsList* instances = g_instances.Pointer();
28903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) for (DevToolsUIBindingsList::iterator it(instances->begin());
29003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      it != instances->end(); ++it) {
29103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)   if ((*it)->web_contents() == web_contents)
29203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)     return *it;
29303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) }
29403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return NULL;
29503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
29603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// static
2985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuGURL DevToolsUIBindings::ApplyThemeToURL(Profile* profile,
2995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                         const GURL& base_url) {
3005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::string frontend_url = base_url.spec();
3015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ThemeService* tp = ThemeServiceFactory::GetForProfile(profile);
3025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK(tp);
3035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::string url_string(
3045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      frontend_url +
3055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      ((frontend_url.find("?") == std::string::npos) ? "?" : "&") +
3065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "dockSide=undocked" + // TODO(dgozman): remove this support in M38.
3075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "&toolbarColor=" +
3085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      SkColorToRGBAString(tp->GetColor(ThemeProperties::COLOR_TOOLBAR)) +
3095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "&textColor=" +
3105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      SkColorToRGBAString(tp->GetColor(ThemeProperties::COLOR_BOOKMARK_TEXT)));
3115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (CommandLine::ForCurrentProcess()->HasSwitch(
3125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      switches::kEnableDevToolsExperiments))
3135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    url_string += "&experiments=true";
3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(DEBUG_DEVTOOLS)
3155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  url_string += "&debugFrontend=true";
3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif  // defined(DEBUG_DEVTOOLS)
3175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return GURL(url_string);
3185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
3195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
32003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)DevToolsUIBindings::DevToolsUIBindings(content::WebContents* web_contents)
3215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    : profile_(Profile::FromBrowserContext(web_contents->GetBrowserContext())),
3225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      web_contents_(web_contents),
3235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      delegate_(new DefaultBindingsDelegate(web_contents_)),
324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      device_count_updates_enabled_(false),
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      devices_updates_enabled_(false),
3265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      weak_factory_(this) {
32703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  g_instances.Get().push_back(this);
3285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  frontend_contents_observer_.reset(new FrontendWebContentsObserver(this));
3295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  web_contents_->GetMutableRendererPrefs()->can_accept_load_drops = false;
3305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file_helper_.reset(new DevToolsFileHelper(web_contents_, profile_));
3325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file_system_indexer_ = new DevToolsFileSystemIndexer();
3335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  extensions::ChromeExtensionWebContentsObserver::CreateForWebContents(
3345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      web_contents_);
3355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Wipe out page icon so that the default application icon is used.
3375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  content::NavigationEntry* entry =
3385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      web_contents_->GetController().GetActiveEntry();
3395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry->GetFavicon().image = gfx::Image();
3405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry->GetFavicon().valid = true;
3415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Register on-load actions.
3435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  registrar_.Add(
3445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
3455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      content::Source<ThemeService>(
3465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          ThemeServiceFactory::GetForProfile(profile_)));
3475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  embedder_message_dispatcher_.reset(
3495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      DevToolsEmbedderMessageDispatcher::createForDevToolsFrontend(this));
35003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
35103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  frontend_host_.reset(
35203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      content::DevToolsFrontendHost::Create(
35303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          web_contents_->GetRenderViewHost(), this));
3545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
3555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuDevToolsUIBindings::~DevToolsUIBindings() {
3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (agent_host_.get())
35803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    agent_host_->DetachClient();
3595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  for (IndexingJobsMap::const_iterator jobs_it(indexing_jobs_.begin());
3615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu       jobs_it != indexing_jobs_.end(); ++jobs_it) {
3625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    jobs_it->second->Stop();
3635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
3645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  indexing_jobs_.clear();
365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetDeviceCountUpdatesEnabled(false);
366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetDevicesUpdatesEnabled(false);
36703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
36803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Remove self from global list.
36903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DevToolsUIBindingsList* instances = g_instances.Pointer();
37003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DevToolsUIBindingsList::iterator it(
37103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      std::find(instances->begin(), instances->end(), this));
37203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DCHECK(it != instances->end());
37303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  instances->erase(it);
3745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
3755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// content::NotificationObserver overrides ------------------------------------
3775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::Observe(int type,
3785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                 const content::NotificationSource& source,
3795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                 const content::NotificationDetails& details) {
3805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK_EQ(chrome::NOTIFICATION_BROWSER_THEME_CHANGED, type);
3815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  UpdateTheme();
3825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
3835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// content::DevToolsFrontendHost::Delegate implementation ---------------------
3855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DevToolsUIBindings::HandleMessageFromDevToolsFrontend(
3865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& message) {
3875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::string method;
3885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::ListValue empty_params;
3895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::ListValue* params = &empty_params;
3905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::DictionaryValue* dict = NULL;
3925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<base::Value> parsed_message(base::JSONReader::Read(message));
3935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!parsed_message ||
3945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      !parsed_message->GetAsDictionary(&dict) ||
3955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      !dict->GetString(kFrontendHostMethod, &method) ||
3965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      (dict->HasKey(kFrontendHostParams) &&
3975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          !dict->GetList(kFrontendHostParams, &params))) {
3985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    LOG(ERROR) << "Invalid message was sent to embedder: " << message;
3995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return;
4005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
4015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int id = 0;
4035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  dict->GetInteger(kFrontendHostId, &id);
4045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::string error;
4065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  embedder_message_dispatcher_->Dispatch(method, params, &error);
4075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (id) {
408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::FundamentalValue id_value(id);
409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::StringValue error_value(error);
4105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    CallClientFunction("InspectorFrontendAPI.embedderMessageAck",
411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       &id_value, &error_value, NULL);
4125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
4135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
4145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DevToolsUIBindings::HandleMessageFromDevToolsFrontendToBackend(
4165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& message) {
4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (agent_host_.get())
41803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    agent_host_->DispatchProtocolMessage(message);
4195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
42103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// content::DevToolsAgentHostClient implementation --------------------------
42203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void DevToolsUIBindings::DispatchProtocolMessage(
42303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    content::DevToolsAgentHost* agent_host, const std::string& message) {
42403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DCHECK(agent_host == agent_host_.get());
4255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::StringValue message_value(message);
4265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CallClientFunction("InspectorFrontendAPI.dispatchMessage",
4275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     &message_value, NULL, NULL);
4285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
43003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void DevToolsUIBindings::AgentHostClosed(
43103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    content::DevToolsAgentHost* agent_host,
43203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    bool replaced_with_another_client) {
43303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DCHECK(agent_host == agent_host_.get());
43403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  agent_host_ = NULL;
4355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  delegate_->InspectedContentsClosing();
4365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// DevToolsEmbedderMessageDispatcher::Delegate implementation -----------------
4395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::ActivateWindow() {
4405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  delegate_->ActivateWindow();
4415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
4425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::CloseWindow() {
444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  delegate_->CloseWindow();
4455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
4465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void DevToolsUIBindings::SetInspectedPageBounds(const gfx::Rect& rect) {
448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delegate_->SetInspectedPageBounds(rect);
4495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
4505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::MoveWindow(int x, int y) {
4525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  delegate_->MoveWindow(x, y);
4535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
4545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::SetIsDocked(bool dock_requested) {
4565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  delegate_->SetIsDocked(dock_requested);
4575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
4585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::InspectElementCompleted() {
4605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  delegate_->InspectElementCompleted();
4615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
4625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void DevToolsUIBindings::InspectedURLChanged(const std::string& url) {
464010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  content::NavigationController& controller = web_contents()->GetController();
465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  content::NavigationEntry* entry = controller.GetActiveEntry();
466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // DevTools UI is not localized.
467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  entry->SetTitle(
468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::UTF8ToUTF16(base::StringPrintf(kTitleFormat, url.c_str())));
469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  web_contents()->NotifyNavigationStateChanged(content::INVALIDATE_TYPE_TITLE);
470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::OpenInNewTab(const std::string& url) {
4735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  delegate_->OpenInNewTab(url);
4745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
4755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::SaveToFile(const std::string& url,
4775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                    const std::string& content,
4785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                    bool save_as) {
4795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file_helper_->Save(url, content, save_as,
4805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     base::Bind(&DevToolsUIBindings::FileSavedAs,
4815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                weak_factory_.GetWeakPtr(), url),
4825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     base::Bind(&DevToolsUIBindings::CanceledFileSaveAs,
4835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                weak_factory_.GetWeakPtr(), url));
4845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
4855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::AppendToFile(const std::string& url,
4875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                      const std::string& content) {
4885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file_helper_->Append(url, content,
4895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       base::Bind(&DevToolsUIBindings::AppendedTo,
4905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                  weak_factory_.GetWeakPtr(), url));
4915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
4925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::RequestFileSystems() {
4945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CHECK(web_contents_->GetURL().SchemeIs(content::kChromeDevToolsScheme));
4955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file_helper_->RequestFileSystems(base::Bind(
4965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      &DevToolsUIBindings::FileSystemsLoaded, weak_factory_.GetWeakPtr()));
4975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
4985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::AddFileSystem() {
5005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CHECK(web_contents_->GetURL().SchemeIs(content::kChromeDevToolsScheme));
5015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file_helper_->AddFileSystem(
5025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      base::Bind(&DevToolsUIBindings::FileSystemAdded,
5035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 weak_factory_.GetWeakPtr()),
5045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      base::Bind(&DevToolsUIBindings::ShowDevToolsConfirmInfoBar,
5055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 weak_factory_.GetWeakPtr()));
5065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
5075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::RemoveFileSystem(
5095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const std::string& file_system_path) {
5105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CHECK(web_contents_->GetURL().SchemeIs(content::kChromeDevToolsScheme));
5115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file_helper_->RemoveFileSystem(file_system_path);
5125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::StringValue file_system_path_value(file_system_path);
5135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CallClientFunction("InspectorFrontendAPI.fileSystemRemoved",
5145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     &file_system_path_value, NULL, NULL);
5155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
5165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::UpgradeDraggedFileSystemPermissions(
5185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const std::string& file_system_url) {
5195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CHECK(web_contents_->GetURL().SchemeIs(content::kChromeDevToolsScheme));
5205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file_helper_->UpgradeDraggedFileSystemPermissions(
5215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      file_system_url,
5225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      base::Bind(&DevToolsUIBindings::FileSystemAdded,
5235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 weak_factory_.GetWeakPtr()),
5245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      base::Bind(&DevToolsUIBindings::ShowDevToolsConfirmInfoBar,
5255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 weak_factory_.GetWeakPtr()));
5265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
5275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::IndexPath(int request_id,
5295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                   const std::string& file_system_path) {
5305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
5315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CHECK(web_contents_->GetURL().SchemeIs(content::kChromeDevToolsScheme));
5325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!file_helper_->IsFileSystemAdded(file_system_path)) {
5335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    IndexingDone(request_id, file_system_path);
5345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return;
5355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
5365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  indexing_jobs_[request_id] =
5375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      scoped_refptr<DevToolsFileSystemIndexer::FileSystemIndexingJob>(
5385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          file_system_indexer_->IndexPath(
5395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              file_system_path,
5405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              Bind(&DevToolsUIBindings::IndexingTotalWorkCalculated,
5415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                   weak_factory_.GetWeakPtr(),
5425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                   request_id,
5435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                   file_system_path),
5445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              Bind(&DevToolsUIBindings::IndexingWorked,
5455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                   weak_factory_.GetWeakPtr(),
5465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                   request_id,
5475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                   file_system_path),
5485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              Bind(&DevToolsUIBindings::IndexingDone,
5495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                   weak_factory_.GetWeakPtr(),
5505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                   request_id,
5515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                   file_system_path)));
5525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
5535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::StopIndexing(int request_id) {
5555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
5565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  IndexingJobsMap::iterator it = indexing_jobs_.find(request_id);
5575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (it == indexing_jobs_.end())
5585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return;
5595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  it->second->Stop();
5605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  indexing_jobs_.erase(it);
5615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
5625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::SearchInPath(int request_id,
5645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                      const std::string& file_system_path,
5655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                      const std::string& query) {
5665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
5675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CHECK(web_contents_->GetURL().SchemeIs(content::kChromeDevToolsScheme));
5685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!file_helper_->IsFileSystemAdded(file_system_path)) {
5695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    SearchCompleted(request_id, file_system_path, std::vector<std::string>());
5705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return;
5715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
5725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file_system_indexer_->SearchInPath(file_system_path,
5735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                     query,
5745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                     Bind(&DevToolsUIBindings::SearchCompleted,
5755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                          weak_factory_.GetWeakPtr(),
5765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                          request_id,
5775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                          file_system_path));
5785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
5795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::SetWhitelistedShortcuts(
5815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const std::string& message) {
5820de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  delegate_->SetWhitelistedShortcuts(message);
5835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
5845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::ZoomIn() {
5865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  chrome_page_zoom::Zoom(web_contents(), content::PAGE_ZOOM_IN);
5875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
5885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::ZoomOut() {
5905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  chrome_page_zoom::Zoom(web_contents(), content::PAGE_ZOOM_OUT);
5915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
5925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::ResetZoom() {
5945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  chrome_page_zoom::Zoom(web_contents(), content::PAGE_ZOOM_RESET);
5955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
5965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic void InspectTarget(Profile* profile, DevToolsTargetImpl* target) {
5985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (target)
5995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    target->Inspect(profile);
6005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
6015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::OpenUrlOnRemoteDeviceAndInspect(
6035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const std::string& browser_id,
6045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const std::string& url) {
6055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (remote_targets_handler_) {
6065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    remote_targets_handler_->Open(browser_id, url,
6075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        base::Bind(&InspectTarget, profile_));
6085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
6095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
6105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
611116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DevToolsUIBindings::SetDeviceCountUpdatesEnabled(bool enabled) {
612116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (device_count_updates_enabled_ == enabled)
613cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
6145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DevToolsAndroidBridge* adb_bridge =
6155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      DevToolsAndroidBridge::Factory::GetForProfile(profile_);
6165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!adb_bridge)
6175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return;
6185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
619116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  device_count_updates_enabled_ = enabled;
620116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (enabled)
6215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    adb_bridge->AddDeviceCountListener(this);
6225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  else
6235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    adb_bridge->RemoveDeviceCountListener(this);
6245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
6255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
626116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DevToolsUIBindings::SetDevicesUpdatesEnabled(bool enabled) {
627116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (devices_updates_enabled_ == enabled)
628116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
629116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  devices_updates_enabled_ = enabled;
630116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (enabled) {
631116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    remote_targets_handler_ = DevToolsTargetsUIHandler::CreateForAdb(
632116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::Bind(&DevToolsUIBindings::DevicesUpdated,
633116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   base::Unretained(this)),
634116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        profile_);
635116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
636116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    remote_targets_handler_.reset();
637116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
638116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
639116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
6405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DevToolsUIBindings::SendMessageToBrowser(const std::string& message) {
6411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (agent_host_.get())
64203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    agent_host_->DispatchProtocolMessage(message);
6435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
6445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::DeviceCountChanged(int count) {
6465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::FundamentalValue value(count);
647116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CallClientFunction("InspectorFrontendAPI.deviceCountUpdated", &value, NULL,
648116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     NULL);
6495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
6505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
651116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DevToolsUIBindings::DevicesUpdated(
6525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const std::string& source,
653116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::ListValue& targets) {
654116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CallClientFunction("InspectorFrontendAPI.devicesUpdated", &targets, NULL,
655116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     NULL);
6565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
6575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::FileSavedAs(const std::string& url) {
6595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::StringValue url_value(url);
6605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CallClientFunction("InspectorFrontendAPI.savedURL", &url_value, NULL, NULL);
6615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
6625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::CanceledFileSaveAs(const std::string& url) {
6645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::StringValue url_value(url);
6655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CallClientFunction("InspectorFrontendAPI.canceledSaveURL",
6665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     &url_value, NULL, NULL);
6675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
6685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::AppendedTo(const std::string& url) {
6705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::StringValue url_value(url);
6715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CallClientFunction("InspectorFrontendAPI.appendedToURL", &url_value, NULL,
6725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     NULL);
6735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
6745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::FileSystemsLoaded(
6765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const std::vector<DevToolsFileHelper::FileSystem>& file_systems) {
6775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::ListValue file_systems_value;
6785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  for (size_t i = 0; i < file_systems.size(); ++i)
6795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    file_systems_value.Append(CreateFileSystemValue(file_systems[i]));
6805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CallClientFunction("InspectorFrontendAPI.fileSystemsLoaded",
6815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     &file_systems_value, NULL, NULL);
6825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
6835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::FileSystemAdded(
6855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const DevToolsFileHelper::FileSystem& file_system) {
6865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<base::StringValue> error_string_value(
6875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      new base::StringValue(std::string()));
6885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<base::DictionaryValue> file_system_value;
6895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!file_system.file_system_path.empty())
6905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    file_system_value.reset(CreateFileSystemValue(file_system));
6915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CallClientFunction("InspectorFrontendAPI.fileSystemAdded",
6925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     error_string_value.get(), file_system_value.get(), NULL);
6935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
6945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::IndexingTotalWorkCalculated(
6965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    int request_id,
6975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const std::string& file_system_path,
6985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    int total_work) {
6995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
7005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::FundamentalValue request_id_value(request_id);
7015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::StringValue file_system_path_value(file_system_path);
7025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::FundamentalValue total_work_value(total_work);
7035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CallClientFunction("InspectorFrontendAPI.indexingTotalWorkCalculated",
7045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     &request_id_value, &file_system_path_value,
7055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     &total_work_value);
7065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
7075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
7085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::IndexingWorked(int request_id,
7095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                        const std::string& file_system_path,
7105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                        int worked) {
7115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
7125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::FundamentalValue request_id_value(request_id);
7135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::StringValue file_system_path_value(file_system_path);
7145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::FundamentalValue worked_value(worked);
7155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CallClientFunction("InspectorFrontendAPI.indexingWorked", &request_id_value,
7165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     &file_system_path_value, &worked_value);
7175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
7185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
7195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::IndexingDone(int request_id,
7205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                      const std::string& file_system_path) {
7215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  indexing_jobs_.erase(request_id);
7225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
7235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::FundamentalValue request_id_value(request_id);
7245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::StringValue file_system_path_value(file_system_path);
7255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CallClientFunction("InspectorFrontendAPI.indexingDone", &request_id_value,
7265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     &file_system_path_value, NULL);
7275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
7285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
7295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::SearchCompleted(
7305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    int request_id,
7315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const std::string& file_system_path,
7325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const std::vector<std::string>& file_paths) {
7335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
7345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::ListValue file_paths_value;
7355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  for (std::vector<std::string>::const_iterator it(file_paths.begin());
7365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu       it != file_paths.end(); ++it) {
7375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    file_paths_value.AppendString(*it);
7385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
7395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::FundamentalValue request_id_value(request_id);
7405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::StringValue file_system_path_value(file_system_path);
7415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CallClientFunction("InspectorFrontendAPI.searchCompleted", &request_id_value,
7425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     &file_system_path_value, &file_paths_value);
7435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
7445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
7455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::ShowDevToolsConfirmInfoBar(
7465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const base::string16& message,
7475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const InfoBarCallback& callback) {
748010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DevToolsConfirmInfoBarDelegate::Create(delegate_->GetInfoBarService(),
7495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      callback, message);
7505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
7515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
7525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::UpdateTheme() {
7535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ThemeService* tp = ThemeServiceFactory::GetForProfile(profile_);
7545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK(tp);
7555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
7565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::string command("InspectorFrontendAPI.setToolbarColors(\"" +
7575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      SkColorToRGBAString(tp->GetColor(ThemeProperties::COLOR_TOOLBAR)) +
7585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "\", \"" +
7595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      SkColorToRGBAString(tp->GetColor(ThemeProperties::COLOR_BOOKMARK_TEXT)) +
7605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "\")");
7615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  web_contents_->GetMainFrame()->ExecuteJavaScript(base::ASCIIToUTF16(command));
7625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
7635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
7645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::AddDevToolsExtensionsToClient() {
7655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const ExtensionService* extension_service = extensions::ExtensionSystem::Get(
7665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      profile_->GetOriginalProfile())->extension_service();
7675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!extension_service)
7685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return;
7695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const extensions::ExtensionSet* extensions = extension_service->extensions();
7705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
7715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::ListValue results;
7725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  for (extensions::ExtensionSet::const_iterator extension(extensions->begin());
7735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu       extension != extensions->end(); ++extension) {
7745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (extensions::ManifestURL::GetDevToolsPage(extension->get()).is_empty())
7755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      continue;
7765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    base::DictionaryValue* extension_info = new base::DictionaryValue();
7775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    extension_info->Set(
7785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        "startPage",
7795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        new base::StringValue(
7805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            extensions::ManifestURL::GetDevToolsPage(
7815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                extension->get()).spec()));
7825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    extension_info->Set("name", new base::StringValue((*extension)->name()));
78346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    extension_info->Set("exposeExperimentalAPIs",
78446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        new base::FundamentalValue(
78546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                            (*extension)->permissions_data()->HasAPIPermission(
78646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                extensions::APIPermission::kExperimental)));
7875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    results.Append(extension_info);
7885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
7895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CallClientFunction("WebInspector.addExtensions", &results, NULL, NULL);
7905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
7915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
7925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::SetDelegate(Delegate* delegate) {
7935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  delegate_.reset(delegate);
7945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
7955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
7961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DevToolsUIBindings::AttachTo(
7971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const scoped_refptr<content::DevToolsAgentHost>& agent_host) {
7981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (agent_host_.get())
79903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    Detach();
80003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  agent_host_ = agent_host;
80103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  agent_host_->AttachClient(this);
80203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
80303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
80403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void DevToolsUIBindings::Reattach() {
8051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(agent_host_.get());
80603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  agent_host_->DetachClient();
80703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  agent_host_->AttachClient(this);
80803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
80903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
81003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void DevToolsUIBindings::Detach() {
8111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (agent_host_.get())
81203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    agent_host_->DetachClient();
81303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  agent_host_ = NULL;
81403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
81503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
81603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool DevToolsUIBindings::IsAttachedTo(content::DevToolsAgentHost* agent_host) {
8171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return agent_host_.get() == agent_host;
81803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
81903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::CallClientFunction(const std::string& function_name,
8215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                            const base::Value* arg1,
8225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                            const base::Value* arg2,
8235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                            const base::Value* arg3) {
8245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::string params;
8255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (arg1) {
8265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    std::string json;
8275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    base::JSONWriter::Write(arg1, &json);
8285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    params.append(json);
8295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (arg2) {
8305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      base::JSONWriter::Write(arg2, &json);
8315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      params.append(", " + json);
8325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      if (arg3) {
8335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        base::JSONWriter::Write(arg3, &json);
8345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        params.append(", " + json);
8355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      }
8365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
8375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
8385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
8395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::string16 javascript = base::UTF8ToUTF16(
8405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      function_name + "(" + params + ");");
8415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  web_contents_->GetMainFrame()->ExecuteJavaScript(javascript);
8425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
8435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
8445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsUIBindings::DocumentOnLoadCompletedInMainFrame() {
8455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Call delegate first - it seeds importants bit of information.
8465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  delegate_->OnLoadCompleted();
8475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
8485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  UpdateTheme();
8495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  AddDevToolsExtensionsToClient();
8505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
851