Index: chrome/browser/debugger/devtools_window.cc |
diff --git a/chrome/browser/debugger/devtools_window.cc b/chrome/browser/debugger/devtools_window.cc |
deleted file mode 100644 |
index 3001b6bfd1cfa9cde02df771fb51cb6e17130445..0000000000000000000000000000000000000000 |
--- a/chrome/browser/debugger/devtools_window.cc |
+++ /dev/null |
@@ -1,914 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include <algorithm> |
- |
-#include "base/command_line.h" |
-#include "base/json/json_writer.h" |
-#include "base/lazy_instance.h" |
-#include "base/string_number_conversions.h" |
-#include "base/stringprintf.h" |
-#include "base/utf_string_conversions.h" |
-#include "base/values.h" |
-#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/debugger/devtools_window.h" |
-#include "chrome/browser/extensions/api/debugger/debugger_api.h" |
-#include "chrome/browser/extensions/extension_service.h" |
-#include "chrome/browser/extensions/extension_system.h" |
-#include "chrome/browser/file_select_helper.h" |
-#include "chrome/browser/prefs/pref_service.h" |
-#include "chrome/browser/prefs/scoped_user_pref_update.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/sessions/session_tab_helper.h" |
-#include "chrome/browser/themes/theme_service.h" |
-#include "chrome/browser/themes/theme_service_factory.h" |
-#include "chrome/browser/ui/browser.h" |
-#include "chrome/browser/ui/browser_list.h" |
-#include "chrome/browser/ui/browser_list_impl.h" |
-#include "chrome/browser/ui/browser_window.h" |
-#include "chrome/browser/ui/tabs/tab_strip_model.h" |
-#include "chrome/common/chrome_notification_types.h" |
-#include "chrome/common/chrome_switches.h" |
-#include "chrome/common/pref_names.h" |
-#include "chrome/common/render_messages.h" |
-#include "chrome/common/url_constants.h" |
-#include "content/public/browser/content_browser_client.h" |
-#include "content/public/browser/devtools_agent_host_registry.h" |
-#include "content/public/browser/devtools_manager.h" |
-#include "content/public/browser/favicon_status.h" |
-#include "content/public/browser/load_notification_details.h" |
-#include "content/public/browser/navigation_controller.h" |
-#include "content/public/browser/navigation_entry.h" |
-#include "content/public/browser/notification_source.h" |
-#include "content/public/browser/render_process_host.h" |
-#include "content/public/browser/render_view_host.h" |
-#include "content/public/browser/web_contents.h" |
-#include "content/public/browser/web_contents_view.h" |
-#include "content/public/common/bindings_policy.h" |
-#include "content/public/common/page_transition_types.h" |
-#include "grit/generated_resources.h" |
- |
-typedef std::vector<DevToolsWindow*> DevToolsWindowList; |
-namespace { |
-base::LazyInstance<DevToolsWindowList>::Leaky |
- g_instances = LAZY_INSTANCE_INITIALIZER; |
-} // namespace |
- |
-using content::DevToolsAgentHost; |
-using content::DevToolsAgentHostRegistry; |
-using content::DevToolsClientHost; |
-using content::DevToolsManager; |
-using content::FileChooserParams; |
-using content::NativeWebKeyboardEvent; |
-using content::NavigationController; |
-using content::NavigationEntry; |
-using content::OpenURLParams; |
-using content::RenderViewHost; |
-using content::WebContents; |
- |
-const char DevToolsWindow::kDevToolsApp[] = "DevToolsApp"; |
- |
-const char kOldPrefBottom[] = "bottom"; |
-const char kOldPrefRight[] = "right"; |
- |
-const char kPrefBottom[] = "dock_bottom"; |
-const char kPrefRight[] = "dock_right"; |
-const char kPrefUndocked[] = "undocked"; |
- |
-const char kDockSideBottom[] = "bottom"; |
-const char kDockSideRight[] = "right"; |
-const char kDockSideUndocked[] = "undocked"; |
- |
-// Minimal height of devtools pane or content pane when devtools are docked |
-// to the browser window. |
-const int kMinDevToolsHeight = 50; |
-const int kMinDevToolsWidth = 150; |
-const int kMinContentsSize = 50; |
- |
-// static |
-void DevToolsWindow::RegisterUserPrefs(PrefService* prefs) { |
- prefs->RegisterBooleanPref(prefs::kDevToolsOpenDocked, |
- true, |
- PrefService::UNSYNCABLE_PREF); |
- prefs->RegisterStringPref(prefs::kDevToolsDockSide, |
- kDockSideBottom, |
- PrefService::UNSYNCABLE_PREF); |
- prefs->RegisterDictionaryPref(prefs::kDevToolsEditedFiles, |
- PrefService::UNSYNCABLE_PREF); |
-} |
- |
-// static |
-DevToolsWindow* DevToolsWindow::GetDockedInstanceForInspectedTab( |
- WebContents* inspected_web_contents) { |
- if (!inspected_web_contents) |
- return NULL; |
- |
- if (!DevToolsAgentHostRegistry::HasDevToolsAgentHost( |
- inspected_web_contents->GetRenderViewHost())) |
- return NULL; |
- DevToolsAgentHost* agent = DevToolsAgentHostRegistry::GetDevToolsAgentHost( |
- inspected_web_contents->GetRenderViewHost()); |
- DevToolsManager* manager = DevToolsManager::GetInstance(); |
- DevToolsClientHost* client_host = manager->GetDevToolsClientHostFor(agent); |
- DevToolsWindow* window = AsDevToolsWindow(client_host); |
- return window && window->IsDocked() ? window : NULL; |
-} |
- |
-// static |
-bool DevToolsWindow::IsDevToolsWindow(RenderViewHost* window_rvh) { |
- return AsDevToolsWindow(window_rvh) != NULL; |
-} |
- |
-// static |
-DevToolsWindow* DevToolsWindow::OpenDevToolsWindowForWorker( |
- Profile* profile, |
- DevToolsAgentHost* worker_agent) { |
- DevToolsWindow* window; |
- DevToolsClientHost* client = content::DevToolsManager::GetInstance()-> |
- GetDevToolsClientHostFor(worker_agent); |
- if (client) { |
- window = AsDevToolsWindow(client); |
- if (!window) |
- return NULL; |
- } else { |
- window = DevToolsWindow::CreateDevToolsWindowForWorker(profile); |
- DevToolsManager::GetInstance()->RegisterDevToolsClientHostFor( |
- worker_agent, |
- window->frontend_host_); |
- } |
- window->Show(DEVTOOLS_TOGGLE_ACTION_SHOW); |
- return window; |
-} |
- |
-// static |
-DevToolsWindow* DevToolsWindow::CreateDevToolsWindowForWorker( |
- Profile* profile) { |
- return Create(profile, NULL, DEVTOOLS_DOCK_SIDE_UNDOCKED, true); |
-} |
- |
-// static |
-DevToolsWindow* DevToolsWindow::OpenDevToolsWindow( |
- RenderViewHost* inspected_rvh) { |
- return ToggleDevToolsWindow(inspected_rvh, true, |
- DEVTOOLS_TOGGLE_ACTION_SHOW); |
-} |
- |
-// static |
-DevToolsWindow* DevToolsWindow::ToggleDevToolsWindow( |
- Browser* browser, |
- DevToolsToggleAction action) { |
- if (action == DEVTOOLS_TOGGLE_ACTION_TOGGLE && browser->is_devtools()) { |
- browser->tab_strip_model()->CloseAllTabs(); |
- return NULL; |
- } |
- RenderViewHost* inspected_rvh = |
- browser->tab_strip_model()->GetActiveWebContents()->GetRenderViewHost(); |
- |
- return ToggleDevToolsWindow(inspected_rvh, |
- action == DEVTOOLS_TOGGLE_ACTION_INSPECT, |
- action); |
-} |
- |
-void DevToolsWindow::InspectElement(RenderViewHost* inspected_rvh, |
- int x, |
- int y) { |
- DevToolsAgentHost* agent = DevToolsAgentHostRegistry::GetDevToolsAgentHost( |
- inspected_rvh); |
- DevToolsManager::GetInstance()->InspectElement(agent, x, y); |
- // TODO(loislo): we should initiate DevTools window opening from within |
- // renderer. Otherwise, we still can hit a race condition here. |
- OpenDevToolsWindow(inspected_rvh); |
-} |
- |
- |
-DevToolsWindow* DevToolsWindow::Create( |
- Profile* profile, |
- RenderViewHost* inspected_rvh, |
- DevToolsDockSide dock_side, |
- bool shared_worker_frontend) { |
- // Create WebContents with devtools. |
- WebContents* web_contents = |
- WebContents::Create(WebContents::CreateParams(profile)); |
- web_contents->GetRenderViewHost()->AllowBindings( |
- content::BINDINGS_POLICY_WEB_UI); |
- web_contents->GetController().LoadURL( |
- GetDevToolsUrl(profile, dock_side, shared_worker_frontend), |
- content::Referrer(), |
- content::PAGE_TRANSITION_AUTO_TOPLEVEL, |
- std::string()); |
- return new DevToolsWindow(web_contents, profile, inspected_rvh, dock_side); |
-} |
- |
-DevToolsWindow::DevToolsWindow(WebContents* web_contents, |
- Profile* profile, |
- RenderViewHost* inspected_rvh, |
- DevToolsDockSide dock_side) |
- : profile_(profile), |
- inspected_web_contents_(NULL), |
- web_contents_(web_contents), |
- browser_(NULL), |
- dock_side_(dock_side), |
- is_loaded_(false), |
- action_on_load_(DEVTOOLS_TOGGLE_ACTION_SHOW), |
- width_(-1), |
- height_(-1) { |
- frontend_host_ = DevToolsClientHost::CreateDevToolsFrontendHost(web_contents, |
- this); |
- file_helper_.reset(new DevToolsFileHelper(profile, this)); |
- |
- g_instances.Get().push_back(this); |
- // Wipe out page icon so that the default application icon is used. |
- NavigationEntry* entry = web_contents->GetController().GetActiveEntry(); |
- entry->GetFavicon().image = gfx::Image(); |
- entry->GetFavicon().valid = true; |
- |
- // Register on-load actions. |
- registrar_.Add( |
- this, |
- content::NOTIFICATION_LOAD_STOP, |
- content::Source<NavigationController>(&web_contents->GetController())); |
- registrar_.Add( |
- this, |
- chrome::NOTIFICATION_TAB_CLOSING, |
- content::Source<NavigationController>(&web_contents->GetController())); |
- registrar_.Add( |
- this, |
- chrome::NOTIFICATION_BROWSER_THEME_CHANGED, |
- content::Source<ThemeService>( |
- ThemeServiceFactory::GetForProfile(profile_))); |
- // There is no inspected_rvh in case of shared workers. |
- if (inspected_rvh) |
- inspected_web_contents_ = WebContents::FromRenderViewHost(inspected_rvh); |
-} |
- |
-DevToolsWindow::~DevToolsWindow() { |
- DevToolsWindowList& instances = g_instances.Get(); |
- DevToolsWindowList::iterator it = std::find(instances.begin(), |
- instances.end(), |
- this); |
- DCHECK(it != instances.end()); |
- instances.erase(it); |
-} |
- |
-void DevToolsWindow::InspectedContentsClosing() { |
- if (IsDocked()) { |
- // Update dev tools to reflect removed dev tools window. |
- BrowserWindow* inspected_window = GetInspectedBrowserWindow(); |
- if (inspected_window) |
- inspected_window->UpdateDevTools(); |
- // In case of docked web_contents_, we own it so delete here. |
- delete web_contents_; |
- |
- delete this; |
- } else { |
- // First, initiate self-destruct to free all the registrars. |
- // Then close all tabs. Browser will take care of deleting web_contents_ |
- // for us. |
- Browser* browser = browser_; |
- delete this; |
- browser->tab_strip_model()->CloseAllTabs(); |
- } |
-} |
- |
-void DevToolsWindow::ContentsReplaced(WebContents* new_contents) { |
- inspected_web_contents_ = new_contents; |
-} |
- |
-void DevToolsWindow::Show(DevToolsToggleAction action) { |
- if (IsDocked()) { |
- Browser* inspected_browser; |
- int inspected_tab_index; |
- // Tell inspected browser to update splitter and switch to inspected panel. |
- if (!IsInspectedBrowserPopupOrPanel() && |
- FindInspectedBrowserAndTabIndex(&inspected_browser, |
- &inspected_tab_index)) { |
- BrowserWindow* inspected_window = inspected_browser->window(); |
- web_contents_->SetDelegate(this); |
- inspected_window->UpdateDevTools(); |
- web_contents_->GetView()->SetInitialFocus(); |
- inspected_window->Show(); |
- TabStripModel* tab_strip_model = inspected_browser->tab_strip_model(); |
- tab_strip_model->ActivateTabAt(inspected_tab_index, true); |
- ScheduleAction(action); |
- return; |
- } else { |
- // Sometimes we don't know where to dock. Stay undocked. |
- dock_side_ = DEVTOOLS_DOCK_SIDE_UNDOCKED; |
- } |
- } |
- |
- // Avoid consecutive window switching if the devtools window has been opened |
- // and the Inspect Element shortcut is pressed in the inspected tab. |
- bool should_show_window = |
- !browser_ || action != DEVTOOLS_TOGGLE_ACTION_INSPECT; |
- |
- if (!browser_) |
- CreateDevToolsBrowser(); |
- |
- if (should_show_window) { |
- browser_->window()->Show(); |
- web_contents_->GetView()->SetInitialFocus(); |
- } |
- |
- ScheduleAction(action); |
-} |
- |
-int DevToolsWindow::GetWidth(int container_width) { |
- if (width_ == -1) { |
- width_ = profile_->GetPrefs()-> |
- GetInteger(prefs::kDevToolsVSplitLocation); |
- } |
- |
- // By default, size devtools as 1/3 of the browser window. |
- if (width_ == -1) |
- width_ = container_width / 3; |
- |
- // Respect the minimum devtools width preset. |
- width_ = std::max(kMinDevToolsWidth, width_); |
- |
- // But it should never compromise the content window size unless the entire |
- // window is tiny. |
- width_ = std::min(container_width - kMinContentsSize, width_); |
- if (width_ < (kMinContentsSize / 2)) |
- width_ = container_width / 3; |
- return width_; |
-} |
- |
-int DevToolsWindow::GetHeight(int container_height) { |
- if (height_ == -1) { |
- height_ = profile_->GetPrefs()-> |
- GetInteger(prefs::kDevToolsHSplitLocation); |
- } |
- |
- // By default, size devtools as 1/3 of the browser window. |
- if (height_ == -1) |
- height_ = container_height / 3; |
- |
- // Respect the minimum devtools width preset. |
- height_ = std::max(kMinDevToolsHeight, height_); |
- |
- // But it should never compromise the content window size. |
- height_ = std::min(container_height - kMinContentsSize, height_); |
- if (height_ < (kMinContentsSize / 2)) |
- height_ = container_height / 3; |
- return height_; |
-} |
- |
-void DevToolsWindow::SetWidth(int width) { |
- width_ = width; |
- profile_->GetPrefs()->SetInteger(prefs::kDevToolsVSplitLocation, width); |
-} |
- |
-void DevToolsWindow::SetHeight(int height) { |
- height_ = height; |
- profile_->GetPrefs()->SetInteger(prefs::kDevToolsHSplitLocation, height); |
-} |
- |
-RenderViewHost* DevToolsWindow::GetRenderViewHost() { |
- return web_contents_->GetRenderViewHost(); |
-} |
- |
-void DevToolsWindow::CreateDevToolsBrowser() { |
- // TODO(pfeldman): Make browser's getter for this key static. |
- std::string wp_key; |
- wp_key.append(prefs::kBrowserWindowPlacement); |
- wp_key.append("_"); |
- wp_key.append(kDevToolsApp); |
- |
- PrefService* prefs = profile_->GetPrefs(); |
- if (!prefs->FindPreference(wp_key.c_str())) { |
- prefs->RegisterDictionaryPref(wp_key.c_str(), PrefService::UNSYNCABLE_PREF); |
- } |
- |
- const DictionaryValue* wp_pref = prefs->GetDictionary(wp_key.c_str()); |
- if (!wp_pref || wp_pref->empty()) { |
- DictionaryPrefUpdate update(prefs, wp_key.c_str()); |
- DictionaryValue* defaults = update.Get(); |
- defaults->SetInteger("left", 100); |
- defaults->SetInteger("top", 100); |
- defaults->SetInteger("right", 740); |
- defaults->SetInteger("bottom", 740); |
- defaults->SetBoolean("maximized", false); |
- defaults->SetBoolean("always_on_top", false); |
- } |
- |
- browser_ = new Browser(Browser::CreateParams::CreateForDevTools(profile_)); |
- browser_->tab_strip_model()->AddWebContents( |
- web_contents_, -1, content::PAGE_TRANSITION_AUTO_TOPLEVEL, |
- TabStripModel::ADD_ACTIVE); |
-} |
- |
-bool DevToolsWindow::FindInspectedBrowserAndTabIndex(Browser** browser, |
- int* tab) { |
- if (!inspected_web_contents_) |
- return false; |
- |
- bool found = FindInspectedBrowserAndTabIndexFromBrowserList( |
- chrome::BrowserListImpl::GetInstance(chrome::HOST_DESKTOP_TYPE_NATIVE), |
- browser, |
- tab); |
- // On Windows 8 we can have the desktop environment and the ASH environment |
- // active concurrently. If we fail to find the inspected web contents in the |
- // native browser list, then we should look in the ASH browser list. |
-#if defined(OS_WIN) && defined(USE_AURA) |
- if (!found) { |
- found = FindInspectedBrowserAndTabIndexFromBrowserList( |
- chrome::BrowserListImpl::GetInstance(chrome::HOST_DESKTOP_TYPE_ASH), |
- browser, |
- tab); |
- } |
-#endif |
- return found; |
-} |
- |
-bool DevToolsWindow::FindInspectedBrowserAndTabIndexFromBrowserList( |
- chrome::BrowserListImpl* browser_list, |
- Browser** browser, |
- int* tab) { |
- if (!inspected_web_contents_) |
- return false; |
- |
- for (chrome::BrowserListImpl::const_iterator it = browser_list->begin(); |
- it != browser_list->end(); ++it) { |
- int tab_index = (*it)->tab_strip_model()->GetIndexOfWebContents( |
- inspected_web_contents_); |
- if (tab_index != TabStripModel::kNoTab) { |
- *browser = *it; |
- *tab = tab_index; |
- return true; |
- } |
- } |
- return false; |
-} |
- |
-BrowserWindow* DevToolsWindow::GetInspectedBrowserWindow() { |
- Browser* browser = NULL; |
- int tab; |
- return FindInspectedBrowserAndTabIndex(&browser, &tab) ? |
- browser->window() : NULL; |
-} |
- |
-bool DevToolsWindow::IsInspectedBrowserPopupOrPanel() { |
- Browser* browser = NULL; |
- int tab; |
- if (!FindInspectedBrowserAndTabIndex(&browser, &tab)) |
- return false; |
- |
- return browser->is_type_popup() || browser->is_type_panel(); |
-} |
- |
-void DevToolsWindow::UpdateFrontendDockSide() { |
- base::StringValue dock_side(SideToString(dock_side_)); |
- CallClientFunction("InspectorFrontendAPI.setDockSide", &dock_side); |
- base::FundamentalValue docked(IsDocked()); |
- CallClientFunction("InspectorFrontendAPI.setAttachedWindow", &docked); |
-} |
- |
- |
-void DevToolsWindow::AddDevToolsExtensionsToClient() { |
- if (inspected_web_contents_) { |
- SessionTabHelper* session_tab_helper = |
- SessionTabHelper::FromWebContents(inspected_web_contents_); |
- if (session_tab_helper) { |
- base::FundamentalValue tabId(session_tab_helper->session_id().id()); |
- CallClientFunction("WebInspector.setInspectedTabId", &tabId); |
- } |
- } |
- ListValue results; |
- Profile* profile = |
- Profile::FromBrowserContext(web_contents_->GetBrowserContext()); |
- const ExtensionService* extension_service = extensions::ExtensionSystem::Get( |
- profile->GetOriginalProfile())->extension_service(); |
- if (!extension_service) |
- return; |
- |
- const ExtensionSet* extensions = extension_service->extensions(); |
- |
- for (ExtensionSet::const_iterator extension = extensions->begin(); |
- extension != extensions->end(); ++extension) { |
- if ((*extension)->devtools_url().is_empty()) |
- continue; |
- DictionaryValue* extension_info = new DictionaryValue(); |
- extension_info->Set("startPage", |
- new StringValue((*extension)->devtools_url().spec())); |
- extension_info->Set("name", new StringValue((*extension)->name())); |
- bool allow_experimental = (*extension)->HasAPIPermission( |
- extensions::APIPermission::kExperimental); |
- extension_info->Set("exposeExperimentalAPIs", |
- new base::FundamentalValue(allow_experimental)); |
- results.Append(extension_info); |
- } |
- CallClientFunction("WebInspector.addExtensions", &results); |
-} |
- |
-WebContents* DevToolsWindow::OpenURLFromTab(WebContents* source, |
- const OpenURLParams& params) { |
- if (inspected_web_contents_) |
- return inspected_web_contents_->OpenURL(params); |
- return NULL; |
-} |
- |
-void DevToolsWindow::CallClientFunction(const std::string& function_name, |
- const Value* arg) { |
- std::string json; |
- if (arg) |
- base::JSONWriter::Write(arg, &json); |
- |
- string16 javascript = |
- ASCIIToUTF16(function_name + "(" + json + ");"); |
- web_contents_->GetRenderViewHost()-> |
- ExecuteJavascriptInWebFrame(string16(), javascript); |
-} |
- |
-void DevToolsWindow::Observe(int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) { |
- if (type == content::NOTIFICATION_LOAD_STOP && !is_loaded_) { |
- is_loaded_ = true; |
- UpdateTheme(); |
- DoAction(); |
- AddDevToolsExtensionsToClient(); |
- } else if (type == chrome::NOTIFICATION_TAB_CLOSING) { |
- if (content::Source<NavigationController>(source).ptr() == |
- &web_contents_->GetController()) { |
- // This happens when browser closes all of its tabs as a result |
- // of window.Close event. |
- // Notify manager that this DevToolsClientHost no longer exists and |
- // initiate self-destuct here. |
- DevToolsManager::GetInstance()->ClientHostClosing(frontend_host_); |
- UpdateBrowserToolbar(); |
- delete this; |
- } |
- } else if (type == chrome::NOTIFICATION_BROWSER_THEME_CHANGED) { |
- UpdateTheme(); |
- } |
-} |
- |
-void DevToolsWindow::ScheduleAction(DevToolsToggleAction action) { |
- action_on_load_ = action; |
- if (is_loaded_) |
- DoAction(); |
-} |
- |
-void DevToolsWindow::DoAction() { |
- UpdateFrontendDockSide(); |
- switch (action_on_load_) { |
- case DEVTOOLS_TOGGLE_ACTION_SHOW_CONSOLE: |
- CallClientFunction("InspectorFrontendAPI.showConsole", NULL); |
- break; |
- case DEVTOOLS_TOGGLE_ACTION_INSPECT: |
- CallClientFunction("InspectorFrontendAPI.enterInspectElementMode", NULL); |
- case DEVTOOLS_TOGGLE_ACTION_SHOW: |
- case DEVTOOLS_TOGGLE_ACTION_TOGGLE: |
- // Do nothing. |
- break; |
- default: |
- NOTREACHED(); |
- } |
- action_on_load_ = DEVTOOLS_TOGGLE_ACTION_SHOW; |
-} |
- |
-std::string SkColorToRGBAString(SkColor color) { |
- // We convert the alpha using DoubleToString because StringPrintf will use |
- // locale specific formatters (e.g., use , instead of . in German). |
- return StringPrintf("rgba(%d,%d,%d,%s)", SkColorGetR(color), |
- SkColorGetG(color), SkColorGetB(color), |
- base::DoubleToString(SkColorGetA(color) / 255.0).c_str()); |
-} |
- |
-// static |
-GURL DevToolsWindow::GetDevToolsUrl(Profile* profile, |
- DevToolsDockSide dock_side, |
- bool shared_worker_frontend) { |
- ThemeService* tp = ThemeServiceFactory::GetForProfile(profile); |
- CHECK(tp); |
- |
- SkColor color_toolbar = |
- tp->GetColor(ThemeService::COLOR_TOOLBAR); |
- SkColor color_tab_text = |
- tp->GetColor(ThemeService::COLOR_BOOKMARK_TEXT); |
- |
- const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
- bool experiments_enabled = |
- command_line.HasSwitch(switches::kEnableDevToolsExperiments); |
- |
- std::string url_string = StringPrintf("%sdevtools.html?" |
- "dockSide=%s&toolbarColor=%s&textColor=%s%s%s", |
- chrome::kChromeUIDevToolsURL, |
- SideToString(dock_side).c_str(), |
- SkColorToRGBAString(color_toolbar).c_str(), |
- SkColorToRGBAString(color_tab_text).c_str(), |
- shared_worker_frontend ? "&isSharedWorker=true" : "", |
- experiments_enabled ? "&experiments=true" : ""); |
- return GURL(url_string); |
-} |
- |
-void DevToolsWindow::UpdateTheme() { |
- ThemeService* tp = ThemeServiceFactory::GetForProfile(profile_); |
- CHECK(tp); |
- |
- SkColor color_toolbar = |
- tp->GetColor(ThemeService::COLOR_TOOLBAR); |
- SkColor color_tab_text = |
- tp->GetColor(ThemeService::COLOR_BOOKMARK_TEXT); |
- std::string command = StringPrintf( |
- "InspectorFrontendAPI.setToolbarColors(\"%s\", \"%s\")", |
- SkColorToRGBAString(color_toolbar).c_str(), |
- SkColorToRGBAString(color_tab_text).c_str()); |
- web_contents_->GetRenderViewHost()-> |
- ExecuteJavascriptInWebFrame(string16(), UTF8ToUTF16(command)); |
-} |
- |
-void DevToolsWindow::AddNewContents(WebContents* source, |
- WebContents* new_contents, |
- WindowOpenDisposition disposition, |
- const gfx::Rect& initial_pos, |
- bool user_gesture, |
- bool* was_blocked) { |
- if (inspected_web_contents_) { |
- inspected_web_contents_->GetDelegate()->AddNewContents( |
- source, new_contents, disposition, initial_pos, user_gesture, |
- was_blocked); |
- } |
-} |
- |
-bool DevToolsWindow::PreHandleKeyboardEvent( |
- WebContents* source, |
- const NativeWebKeyboardEvent& event, bool* is_keyboard_shortcut) { |
- if (IsDocked()) { |
- BrowserWindow* inspected_window = GetInspectedBrowserWindow(); |
- if (inspected_window) |
- return inspected_window->PreHandleKeyboardEvent( |
- event, is_keyboard_shortcut); |
- } |
- return false; |
-} |
- |
-void DevToolsWindow::HandleKeyboardEvent(WebContents* source, |
- const NativeWebKeyboardEvent& event) { |
- if (IsDocked()) { |
- if (event.windowsKeyCode == 0x08) { |
- // Do not navigate back in history on Windows (http://crbug.com/74156). |
- return; |
- } |
- BrowserWindow* inspected_window = GetInspectedBrowserWindow(); |
- if (inspected_window) |
- inspected_window->HandleKeyboardEvent(event); |
- } |
-} |
- |
-// static |
-DevToolsWindow* DevToolsWindow::ToggleDevToolsWindow( |
- RenderViewHost* inspected_rvh, |
- bool force_open, |
- DevToolsToggleAction action) { |
- DevToolsAgentHost* agent = DevToolsAgentHostRegistry::GetDevToolsAgentHost( |
- inspected_rvh); |
- DevToolsManager* manager = DevToolsManager::GetInstance(); |
- DevToolsClientHost* host = manager->GetDevToolsClientHostFor(agent); |
- DevToolsWindow* window = AsDevToolsWindow(host); |
- if (host && !window) { |
- // Break remote debugging / extension debugging session. |
- host->ReplacedWithAnotherClient(); |
- manager->UnregisterDevToolsClientHostFor(agent); |
- } |
- |
- bool do_open = force_open; |
- if (!window) { |
- Profile* profile = Profile::FromBrowserContext( |
- inspected_rvh->GetProcess()->GetBrowserContext()); |
- DevToolsDockSide dock_side = GetDockSideFromPrefs(profile); |
- window = Create(profile, inspected_rvh, dock_side, false); |
- manager->RegisterDevToolsClientHostFor(agent, window->frontend_host_); |
- do_open = true; |
- } |
- |
- // Update toolbar to reflect DevTools changes. |
- window->UpdateBrowserToolbar(); |
- |
- // If window is docked and visible, we hide it on toggle. If window is |
- // undocked, we show (activate) it. |
- if (!window->IsDocked() || do_open) |
- window->Show(action); |
- else |
- manager->UnregisterDevToolsClientHostFor(agent); |
- |
- return window; |
-} |
- |
-// static |
-DevToolsWindow* DevToolsWindow::AsDevToolsWindow( |
- DevToolsClientHost* client_host) { |
- if (!client_host || g_instances == NULL) |
- return NULL; |
- DevToolsWindowList& instances = g_instances.Get(); |
- for (DevToolsWindowList::iterator it = instances.begin(); |
- it != instances.end(); ++it) { |
- if ((*it)->frontend_host_ == client_host) |
- return *it; |
- } |
- return NULL; |
-} |
- |
-// static |
-DevToolsWindow* DevToolsWindow::AsDevToolsWindow(RenderViewHost* window_rvh) { |
- if (g_instances == NULL) |
- return NULL; |
- DevToolsWindowList& instances = g_instances.Get(); |
- for (DevToolsWindowList::iterator it = instances.begin(); |
- it != instances.end(); ++it) { |
- if ((*it)->web_contents_->GetRenderViewHost() == window_rvh) |
- return *it; |
- } |
- return NULL; |
-} |
- |
-void DevToolsWindow::ActivateWindow() { |
- if (!IsDocked()) { |
- if (!browser_->window()->IsActive()) { |
- browser_->window()->Activate(); |
- } |
- } else { |
- BrowserWindow* inspected_window = GetInspectedBrowserWindow(); |
- if (inspected_window) |
- web_contents_->GetView()->Focus(); |
- } |
-} |
- |
-void DevToolsWindow::CloseWindow() { |
- DCHECK(IsDocked()); |
- DevToolsManager::GetInstance()->ClientHostClosing(frontend_host_); |
- InspectedContentsClosing(); |
-} |
- |
-void DevToolsWindow::MoveWindow(int x, int y) { |
- if (!IsDocked()) { |
- gfx::Rect bounds = browser_->window()->GetBounds(); |
- bounds.Offset(x, y); |
- browser_->window()->SetBounds(bounds); |
- } |
-} |
- |
-void DevToolsWindow::SetDockSide(const std::string& side) { |
- DevToolsDockSide requested_side = SideFromString(side); |
- bool dock_requested = requested_side != DEVTOOLS_DOCK_SIDE_UNDOCKED; |
- bool is_docked = IsDocked(); |
- |
- if (dock_requested && (!inspected_web_contents_ || |
- !GetInspectedBrowserWindow() || IsInspectedBrowserPopupOrPanel())) { |
- // Cannot dock, avoid window flashing due to close-reopen cycle. |
- return; |
- } |
- |
- dock_side_ = requested_side; |
- if (dock_requested) { |
- if (!is_docked) { |
- // Detach window from the external devtools browser. It will lead to |
- // the browser object's close and delete. Remove observer first. |
- TabStripModel* tab_strip_model = browser_->tab_strip_model(); |
- tab_strip_model->DetachWebContentsAt( |
- tab_strip_model->GetIndexOfWebContents(web_contents_)); |
- browser_ = NULL; |
- } |
- } else if (is_docked) { |
- // Update inspected window to hide split and reset it. |
- BrowserWindow* inspected_window = GetInspectedBrowserWindow(); |
- if (inspected_window) |
- inspected_window->UpdateDevTools(); |
- } |
- |
- std::string pref_value = kPrefBottom; |
- switch (dock_side_) { |
- case DEVTOOLS_DOCK_SIDE_UNDOCKED: |
- pref_value = kPrefUndocked; |
- break; |
- case DEVTOOLS_DOCK_SIDE_RIGHT: |
- pref_value = kPrefRight; |
- break; |
- case DEVTOOLS_DOCK_SIDE_BOTTOM: |
- pref_value = kPrefBottom; |
- break; |
- } |
- profile_->GetPrefs()->SetString(prefs::kDevToolsDockSide, pref_value); |
- |
- Show(DEVTOOLS_TOGGLE_ACTION_SHOW); |
-} |
- |
-void DevToolsWindow::OpenInNewTab(const std::string& url) { |
- OpenURLParams params(GURL(url), |
- content::Referrer(), |
- NEW_FOREGROUND_TAB, |
- content::PAGE_TRANSITION_LINK, |
- false /* is_renderer_initiated */); |
- if (inspected_web_contents_) { |
- inspected_web_contents_->OpenURL(params); |
- } else { |
- for (BrowserList::const_iterator it = BrowserList::begin(); |
- it != BrowserList::end(); ++it) { |
- if ((*it)->type() == Browser::TYPE_TABBED) { |
- (*it)->OpenURL(params); |
- break; |
- } |
- } |
- } |
-} |
- |
-void DevToolsWindow::SaveToFile(const std::string& url, |
- const std::string& content, |
- bool save_as) { |
- file_helper_->Save(url, content, save_as); |
-} |
- |
-void DevToolsWindow::AppendToFile(const std::string& url, |
- const std::string& content) { |
- file_helper_->Append(url, content); |
-} |
- |
-void DevToolsWindow::FileSavedAs(const std::string& url) { |
- StringValue url_value(url); |
- CallClientFunction("InspectorFrontendAPI.savedURL", &url_value); |
-} |
- |
-void DevToolsWindow::AppendedTo(const std::string& url) { |
- StringValue url_value(url); |
- CallClientFunction("InspectorFrontendAPI.appendedToURL", &url_value); |
-} |
- |
-content::JavaScriptDialogCreator* DevToolsWindow::GetJavaScriptDialogCreator() { |
- if (inspected_web_contents_ && inspected_web_contents_->GetDelegate()) { |
- return inspected_web_contents_->GetDelegate()-> |
- GetJavaScriptDialogCreator(); |
- } |
- return content::WebContentsDelegate::GetJavaScriptDialogCreator(); |
-} |
- |
-void DevToolsWindow::RunFileChooser(WebContents* web_contents, |
- const FileChooserParams& params) { |
- FileSelectHelper::RunFileChooser(web_contents, params); |
-} |
- |
-void DevToolsWindow::WebContentsFocused(WebContents* contents) { |
- Browser* inspected_browser = NULL; |
- int inspected_tab_index = -1; |
- |
- if (IsDocked() && FindInspectedBrowserAndTabIndex(&inspected_browser, |
- &inspected_tab_index)) { |
- inspected_browser->window()->WebContentsFocused(contents); |
- } |
-} |
- |
-void DevToolsWindow::UpdateBrowserToolbar() { |
- if (!inspected_web_contents_) |
- return; |
- BrowserWindow* inspected_window = GetInspectedBrowserWindow(); |
- if (inspected_window) |
- inspected_window->UpdateToolbar(inspected_web_contents_, false); |
-} |
- |
-bool DevToolsWindow::IsDocked() { |
- return dock_side_ != DEVTOOLS_DOCK_SIDE_UNDOCKED; |
-} |
- |
-// static |
-DevToolsDockSide DevToolsWindow::GetDockSideFromPrefs(Profile* profile) { |
- std::string dock_side = |
- profile->GetPrefs()->GetString(prefs::kDevToolsDockSide); |
- |
- // Migrate prefs |
- if (dock_side == kOldPrefBottom || dock_side == kOldPrefRight) { |
- bool docked = profile->GetPrefs()->GetBoolean(prefs::kDevToolsOpenDocked); |
- if (dock_side == kOldPrefBottom) |
- return docked ? DEVTOOLS_DOCK_SIDE_BOTTOM : DEVTOOLS_DOCK_SIDE_UNDOCKED; |
- else |
- return docked ? DEVTOOLS_DOCK_SIDE_RIGHT : DEVTOOLS_DOCK_SIDE_UNDOCKED; |
- } |
- |
- if (dock_side == kPrefUndocked) |
- return DEVTOOLS_DOCK_SIDE_UNDOCKED; |
- else if (dock_side == kPrefRight) |
- return DEVTOOLS_DOCK_SIDE_RIGHT; |
- // Default to docked to bottom |
- return DEVTOOLS_DOCK_SIDE_BOTTOM; |
-} |
- |
-// static |
-std::string DevToolsWindow::SideToString(DevToolsDockSide dock_side) { |
- std::string dock_side_string; |
- switch (dock_side) { |
- case DEVTOOLS_DOCK_SIDE_UNDOCKED: return kDockSideUndocked; |
- case DEVTOOLS_DOCK_SIDE_RIGHT: return kDockSideRight; |
- case DEVTOOLS_DOCK_SIDE_BOTTOM: return kDockSideBottom; |
- } |
- return kDockSideUndocked; |
-} |
- |
-// static |
-DevToolsDockSide DevToolsWindow::SideFromString( |
- const std::string& dock_side) { |
- if (dock_side == kDockSideRight) |
- return DEVTOOLS_DOCK_SIDE_RIGHT; |
- if (dock_side == kDockSideBottom) |
- return DEVTOOLS_DOCK_SIDE_BOTTOM; |
- return DEVTOOLS_DOCK_SIDE_UNDOCKED; |
-} |