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, ¶ms))) { 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