OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/devtools/devtools_window.h" | 5 #include "chrome/browser/devtools/devtools_window.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/json/json_writer.h" | 10 #include "base/json/json_writer.h" |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 const char kDockSideUndocked[] = "undocked"; | 96 const char kDockSideUndocked[] = "undocked"; |
97 const char kDockSideMinimized[] = "minimized"; | 97 const char kDockSideMinimized[] = "minimized"; |
98 | 98 |
99 // Minimal height of devtools pane or content pane when devtools are docked | 99 // Minimal height of devtools pane or content pane when devtools are docked |
100 // to the browser window. | 100 // to the browser window. |
101 const int kMinDevToolsHeight = 50; | 101 const int kMinDevToolsHeight = 50; |
102 const int kMinDevToolsWidth = 150; | 102 const int kMinDevToolsWidth = 150; |
103 const int kMinContentsSize = 50; | 103 const int kMinContentsSize = 50; |
104 const int kMinimizedDevToolsHeight = 24; | 104 const int kMinimizedDevToolsHeight = 24; |
105 | 105 |
106 class DevToolsWindow::InspectedWebContentsObserver | |
107 : public content::WebContentsObserver { | |
108 public: | |
109 explicit InspectedWebContentsObserver(content::WebContents* web_contents) | |
110 : WebContentsObserver(web_contents) { | |
111 } | |
112 | 106 |
113 content::WebContents* Get() { return web_contents(); } | 107 // DevToolsConfirmInfoBarDelegate --------------------------------------------- |
114 }; | |
115 | |
116 class DevToolsWindow::FrontendWebContentsObserver | |
117 : public content::WebContentsObserver { | |
118 public: | |
119 explicit FrontendWebContentsObserver(content::WebContents* web_contents) | |
120 : WebContentsObserver(web_contents) { | |
121 } | |
122 private: | |
123 // Overriden from contents::WebContentsObserver. | |
124 virtual void AboutToNavigateRenderView( | |
125 RenderViewHost* render_view_host) OVERRIDE { | |
126 content::DevToolsClientHost::SetupDevToolsFrontendClient(render_view_host); | |
127 } | |
128 }; | |
129 | 108 |
130 typedef Callback<void(bool)> ConfirmInfoBarCallback; | 109 typedef Callback<void(bool)> ConfirmInfoBarCallback; |
131 | 110 |
132 class DevToolsConfirmInfoBarDelegate : public ConfirmInfoBarDelegate { | 111 class DevToolsConfirmInfoBarDelegate : public ConfirmInfoBarDelegate { |
133 public: | 112 public: |
134 DevToolsConfirmInfoBarDelegate( | 113 DevToolsConfirmInfoBarDelegate(InfoBarService* infobar_service, |
135 InfoBarService* infobar_service, | 114 const ConfirmInfoBarCallback& callback, |
136 const ConfirmInfoBarCallback& callback, | 115 string16 message); |
137 string16 message) | |
138 : ConfirmInfoBarDelegate(infobar_service), | |
139 callback_(callback), | |
140 message_(message) { | |
141 } | |
142 | 116 |
143 virtual string16 GetMessageText() const OVERRIDE { return message_; } | 117 virtual string16 GetMessageText() const OVERRIDE; |
144 | 118 virtual string16 GetButtonLabel(InfoBarButton button) const OVERRIDE; |
145 virtual bool Accept() OVERRIDE { | 119 virtual bool Accept() OVERRIDE; |
146 callback_.Run(true); | 120 virtual bool Cancel() OVERRIDE; |
147 callback_.Reset(); | |
148 return true; | |
149 } | |
150 | |
151 virtual bool Cancel() OVERRIDE { | |
152 callback_.Run(false); | |
153 callback_.Reset(); | |
154 return true; | |
155 } | |
156 | |
157 virtual string16 GetButtonLabel(InfoBarButton button) const OVERRIDE { | |
158 return l10n_util::GetStringUTF16((button == BUTTON_OK) | |
159 ? IDS_DEV_TOOLS_CONFIRM_ALLOW_BUTTON | |
160 : IDS_DEV_TOOLS_CONFIRM_DENY_BUTTON); | |
161 } | |
162 | 121 |
163 private: | 122 private: |
164 virtual ~DevToolsConfirmInfoBarDelegate() { | 123 virtual ~DevToolsConfirmInfoBarDelegate(); |
165 if (!callback_.is_null()) { | |
166 callback_.Run(false); | |
167 } | |
168 } | |
169 | 124 |
170 ConfirmInfoBarCallback callback_; | 125 ConfirmInfoBarCallback callback_; |
171 string16 message_; | 126 string16 message_; |
172 }; | 127 }; |
173 | 128 |
| 129 DevToolsConfirmInfoBarDelegate::DevToolsConfirmInfoBarDelegate( |
| 130 InfoBarService* infobar_service, |
| 131 const ConfirmInfoBarCallback& callback, |
| 132 string16 message) |
| 133 : ConfirmInfoBarDelegate(infobar_service), |
| 134 callback_(callback), |
| 135 message_(message) { |
| 136 } |
| 137 |
| 138 string16 DevToolsConfirmInfoBarDelegate::GetMessageText() const { |
| 139 return message_; |
| 140 } |
| 141 |
| 142 string16 DevToolsConfirmInfoBarDelegate::GetButtonLabel( |
| 143 InfoBarButton button) const { |
| 144 return l10n_util::GetStringUTF16((button == BUTTON_OK) ? |
| 145 IDS_DEV_TOOLS_CONFIRM_ALLOW_BUTTON : IDS_DEV_TOOLS_CONFIRM_DENY_BUTTON); |
| 146 } |
| 147 |
| 148 bool DevToolsConfirmInfoBarDelegate::Accept() { |
| 149 callback_.Run(true); |
| 150 callback_.Reset(); |
| 151 return true; |
| 152 } |
| 153 |
| 154 bool DevToolsConfirmInfoBarDelegate::Cancel() { |
| 155 callback_.Run(false); |
| 156 callback_.Reset(); |
| 157 return true; |
| 158 } |
| 159 |
| 160 DevToolsConfirmInfoBarDelegate::~DevToolsConfirmInfoBarDelegate() { |
| 161 if (!callback_.is_null()) { |
| 162 callback_.Run(false); |
| 163 } |
| 164 } |
| 165 |
| 166 |
| 167 // DevToolsWindow::InspectedWebContentsObserver ------------------------------- |
| 168 |
| 169 class DevToolsWindow::InspectedWebContentsObserver |
| 170 : public content::WebContentsObserver { |
| 171 public: |
| 172 explicit InspectedWebContentsObserver(content::WebContents* web_contents); |
| 173 |
| 174 content::WebContents* web_contents() { |
| 175 return WebContentsObserver::web_contents(); |
| 176 } |
| 177 }; |
| 178 |
| 179 DevToolsWindow::InspectedWebContentsObserver::InspectedWebContentsObserver( |
| 180 content::WebContents* web_contents) |
| 181 : WebContentsObserver(web_contents) { |
| 182 } |
| 183 |
| 184 |
| 185 // DevToolsWindow::FrontendWebContentsObserver -------------------------------- |
| 186 |
| 187 class DevToolsWindow::FrontendWebContentsObserver |
| 188 : public content::WebContentsObserver { |
| 189 public: |
| 190 explicit FrontendWebContentsObserver(content::WebContents* web_contents); |
| 191 |
| 192 private: |
| 193 // Overriden from contents::WebContentsObserver. |
| 194 virtual void AboutToNavigateRenderView( |
| 195 RenderViewHost* render_view_host) OVERRIDE; |
| 196 }; |
| 197 |
| 198 DevToolsWindow::FrontendWebContentsObserver::FrontendWebContentsObserver( |
| 199 content::WebContents* web_contents) |
| 200 : WebContentsObserver(web_contents) { |
| 201 } |
| 202 |
| 203 void DevToolsWindow::FrontendWebContentsObserver::AboutToNavigateRenderView( |
| 204 content::RenderViewHost* render_view_host) { |
| 205 content::DevToolsClientHost::SetupDevToolsFrontendClient(render_view_host); |
| 206 } |
| 207 |
| 208 |
| 209 // DevToolsWindow ------------------------------------------------------------- |
| 210 |
| 211 namespace { |
| 212 |
| 213 std::string SkColorToRGBAString(SkColor color) { |
| 214 // We convert the alpha using DoubleToString because StringPrintf will use |
| 215 // locale specific formatters (e.g., use , instead of . in German). |
| 216 return base::StringPrintf("rgba(%d,%d,%d,%s)", SkColorGetR(color), |
| 217 SkColorGetG(color), SkColorGetB(color), |
| 218 base::DoubleToString(SkColorGetA(color) / 255.0).c_str()); |
| 219 } |
| 220 |
| 221 DictionaryValue* CreateFileSystemValue( |
| 222 DevToolsFileHelper::FileSystem file_system) { |
| 223 DictionaryValue* file_system_value = new DictionaryValue(); |
| 224 file_system_value->SetString("fileSystemName", file_system.file_system_name); |
| 225 file_system_value->SetString("rootURL", file_system.root_url); |
| 226 file_system_value->SetString("fileSystemPath", file_system.file_system_path); |
| 227 return file_system_value; |
| 228 } |
| 229 |
| 230 } // namespace |
| 231 |
| 232 DevToolsWindow::~DevToolsWindow() { |
| 233 DevToolsWindowList& instances = g_instances.Get(); |
| 234 DevToolsWindowList::iterator it = std::find(instances.begin(), |
| 235 instances.end(), |
| 236 this); |
| 237 DCHECK(it != instances.end()); |
| 238 instances.erase(it); |
| 239 } |
| 240 |
174 // static | 241 // static |
175 std::string DevToolsWindow::GetDevToolsWindowPlacementPrefKey() { | 242 std::string DevToolsWindow::GetDevToolsWindowPlacementPrefKey() { |
176 std::string wp_key; | 243 std::string wp_key; |
177 wp_key.append(prefs::kBrowserWindowPlacement); | 244 wp_key.append(prefs::kBrowserWindowPlacement); |
178 wp_key.append("_"); | 245 wp_key.append("_"); |
179 wp_key.append(kDevToolsApp); | 246 wp_key.append(kDevToolsApp); |
180 return wp_key; | 247 return wp_key; |
181 } | 248 } |
182 | 249 |
183 // static | 250 // static |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 } | 332 } |
266 RenderViewHost* inspected_rvh = | 333 RenderViewHost* inspected_rvh = |
267 browser->tab_strip_model()->GetActiveWebContents()->GetRenderViewHost(); | 334 browser->tab_strip_model()->GetActiveWebContents()->GetRenderViewHost(); |
268 | 335 |
269 return ToggleDevToolsWindow(inspected_rvh, | 336 return ToggleDevToolsWindow(inspected_rvh, |
270 action == DEVTOOLS_TOGGLE_ACTION_INSPECT, | 337 action == DEVTOOLS_TOGGLE_ACTION_INSPECT, |
271 action); | 338 action); |
272 } | 339 } |
273 | 340 |
274 // static | 341 // static |
275 void DevToolsWindow::InspectElement(RenderViewHost* inspected_rvh, | |
276 int x, | |
277 int y) { | |
278 scoped_refptr<DevToolsAgentHost> agent( | |
279 DevToolsAgentHost::GetOrCreateFor(inspected_rvh)); | |
280 agent->InspectElement(x, y); | |
281 // TODO(loislo): we should initiate DevTools window opening from within | |
282 // renderer. Otherwise, we still can hit a race condition here. | |
283 OpenDevToolsWindow(inspected_rvh); | |
284 } | |
285 | |
286 // static | |
287 void DevToolsWindow::OpenExternalFrontend( | 342 void DevToolsWindow::OpenExternalFrontend( |
288 Profile* profile, | 343 Profile* profile, |
289 const std::string& frontend_url, | 344 const std::string& frontend_url, |
290 content::DevToolsAgentHost* agent_host) { | 345 content::DevToolsAgentHost* agent_host) { |
291 DevToolsWindow* window = FindDevToolsWindow(agent_host); | 346 DevToolsWindow* window = FindDevToolsWindow(agent_host); |
292 if (!window) { | 347 if (!window) { |
293 window = Create(profile, DevToolsUI::GetProxyURL(frontend_url), NULL, | 348 window = Create(profile, DevToolsUI::GetProxyURL(frontend_url), NULL, |
294 DEVTOOLS_DOCK_SIDE_UNDOCKED, false); | 349 DEVTOOLS_DOCK_SIDE_UNDOCKED, false); |
295 DevToolsManager::GetInstance()->RegisterDevToolsClientHostFor( | 350 DevToolsManager::GetInstance()->RegisterDevToolsClientHostFor( |
296 agent_host, window->frontend_host_.get()); | 351 agent_host, window->frontend_host_.get()); |
297 } | 352 } |
298 window->Show(DEVTOOLS_TOGGLE_ACTION_SHOW); | 353 window->Show(DEVTOOLS_TOGGLE_ACTION_SHOW); |
299 } | 354 } |
300 | 355 |
301 // static | 356 // static |
302 DevToolsWindow* DevToolsWindow::Create( | 357 DevToolsWindow* DevToolsWindow::ToggleDevToolsWindow( |
303 Profile* profile, | |
304 const GURL& frontend_url, | |
305 RenderViewHost* inspected_rvh, | 358 RenderViewHost* inspected_rvh, |
306 DevToolsDockSide dock_side, | 359 bool force_open, |
307 bool shared_worker_frontend) { | 360 DevToolsToggleAction action) { |
308 // Create WebContents with devtools. | 361 scoped_refptr<DevToolsAgentHost> agent( |
309 GURL url = GetDevToolsURL(profile, frontend_url, dock_side, | 362 DevToolsAgentHost::GetOrCreateFor(inspected_rvh)); |
310 shared_worker_frontend); | 363 DevToolsManager* manager = DevToolsManager::GetInstance(); |
311 return new DevToolsWindow(profile, url, inspected_rvh, dock_side); | 364 DevToolsWindow* window = FindDevToolsWindow(agent.get()); |
| 365 bool do_open = force_open; |
| 366 if (!window) { |
| 367 Profile* profile = Profile::FromBrowserContext( |
| 368 inspected_rvh->GetProcess()->GetBrowserContext()); |
| 369 DevToolsDockSide dock_side = GetDockSideFromPrefs(profile); |
| 370 window = Create(profile, GURL(), inspected_rvh, dock_side, false); |
| 371 manager->RegisterDevToolsClientHostFor(agent.get(), |
| 372 window->frontend_host_.get()); |
| 373 do_open = true; |
| 374 } |
| 375 |
| 376 // Update toolbar to reflect DevTools changes. |
| 377 window->UpdateBrowserToolbar(); |
| 378 |
| 379 // If window is docked and visible, we hide it on toggle. If window is |
| 380 // undocked, we show (activate) it. If window is minimized, we maximize it. |
| 381 if (window->dock_side_ == DEVTOOLS_DOCK_SIDE_MINIMIZED) |
| 382 window->Restore(); |
| 383 else if (!window->IsDocked() || do_open) |
| 384 window->Show(action); |
| 385 else |
| 386 window->CloseWindow(); |
| 387 |
| 388 return window; |
312 } | 389 } |
313 | 390 |
314 DevToolsWindow::DevToolsWindow(Profile* profile, | 391 // static |
315 const GURL& url, | 392 void DevToolsWindow::InspectElement(RenderViewHost* inspected_rvh, |
316 RenderViewHost* inspected_rvh, | 393 int x, |
317 DevToolsDockSide dock_side) | 394 int y) { |
318 : profile_(profile), | 395 scoped_refptr<DevToolsAgentHost> agent( |
319 browser_(NULL), | 396 DevToolsAgentHost::GetOrCreateFor(inspected_rvh)); |
320 dock_side_(dock_side), | 397 agent->InspectElement(x, y); |
321 is_loaded_(false), | 398 // TODO(loislo): we should initiate DevTools window opening from within |
322 action_on_load_(DEVTOOLS_TOGGLE_ACTION_SHOW), | 399 // renderer. Otherwise, we still can hit a race condition here. |
323 weak_factory_(this), | 400 OpenDevToolsWindow(inspected_rvh); |
324 width_(-1), | |
325 height_(-1), | |
326 dock_side_before_minimized_(dock_side) { | |
327 web_contents_ = WebContents::Create(WebContents::CreateParams(profile)); | |
328 frontend_contents_observer_.reset( | |
329 new FrontendWebContentsObserver(web_contents_)); | |
330 | |
331 web_contents_->GetController().LoadURL(url, content::Referrer(), | |
332 content::PAGE_TRANSITION_AUTO_TOPLEVEL, std::string()); | |
333 | |
334 frontend_host_.reset( | |
335 DevToolsClientHost::CreateDevToolsFrontendHost(web_contents_, this)); | |
336 file_helper_.reset(new DevToolsFileHelper(web_contents_, profile)); | |
337 | |
338 g_instances.Get().push_back(this); | |
339 // Wipe out page icon so that the default application icon is used. | |
340 NavigationEntry* entry = web_contents_->GetController().GetActiveEntry(); | |
341 entry->GetFavicon().image = gfx::Image(); | |
342 entry->GetFavicon().valid = true; | |
343 | |
344 // Register on-load actions. | |
345 registrar_.Add( | |
346 this, | |
347 content::NOTIFICATION_LOAD_STOP, | |
348 content::Source<NavigationController>(&web_contents_->GetController())); | |
349 registrar_.Add( | |
350 this, | |
351 chrome::NOTIFICATION_TAB_CLOSING, | |
352 content::Source<NavigationController>(&web_contents_->GetController())); | |
353 registrar_.Add( | |
354 this, | |
355 chrome::NOTIFICATION_BROWSER_THEME_CHANGED, | |
356 content::Source<ThemeService>( | |
357 ThemeServiceFactory::GetForProfile(profile_))); | |
358 // There is no inspected_rvh in case of shared workers. | |
359 if (inspected_rvh) | |
360 inspected_contents_observer_.reset(new InspectedWebContentsObserver( | |
361 WebContents::FromRenderViewHost(inspected_rvh))); | |
362 } | 401 } |
363 | 402 |
364 DevToolsWindow::~DevToolsWindow() { | 403 // static |
365 DevToolsWindowList& instances = g_instances.Get(); | 404 int DevToolsWindow::GetMinimumWidth() { |
366 DevToolsWindowList::iterator it = std::find(instances.begin(), | 405 return kMinDevToolsWidth; |
367 instances.end(), | |
368 this); | |
369 DCHECK(it != instances.end()); | |
370 instances.erase(it); | |
371 } | 406 } |
372 | 407 |
373 content::WebContents* DevToolsWindow::GetInspectedWebContents() { | 408 // static |
374 if (!inspected_contents_observer_) | 409 int DevToolsWindow::GetMinimumHeight() { |
375 return NULL; | 410 return kMinDevToolsHeight; |
376 return inspected_contents_observer_->Get(); | 411 } |
| 412 |
| 413 // static |
| 414 int DevToolsWindow::GetMinimizedHeight() { |
| 415 return kMinimizedDevToolsHeight; |
377 } | 416 } |
378 | 417 |
379 void DevToolsWindow::InspectedContentsClosing() { | 418 void DevToolsWindow::InspectedContentsClosing() { |
380 Hide(); | 419 Hide(); |
381 } | 420 } |
382 | 421 |
383 void DevToolsWindow::Hide() { | 422 RenderViewHost* DevToolsWindow::GetRenderViewHost() { |
384 if (IsDocked()) { | 423 return web_contents_->GetRenderViewHost(); |
385 // Update dev tools to reflect removed dev tools window. | |
386 BrowserWindow* inspected_window = GetInspectedBrowserWindow(); | |
387 if (inspected_window) | |
388 inspected_window->UpdateDevTools(); | |
389 // In case of docked web_contents_, we own it so delete here. | |
390 delete web_contents_; | |
391 | |
392 delete this; | |
393 } else { | |
394 // First, initiate self-destruct to free all the registrars. | |
395 // Then close all tabs. Browser will take care of deleting web_contents_ | |
396 // for us. | |
397 Browser* browser = browser_; | |
398 delete this; | |
399 browser->tab_strip_model()->CloseAllTabs(); | |
400 } | |
401 } | |
402 | |
403 void DevToolsWindow::Show(DevToolsToggleAction action) { | |
404 if (IsDocked()) { | |
405 Browser* inspected_browser; | |
406 int inspected_tab_index; | |
407 // Tell inspected browser to update splitter and switch to inspected panel. | |
408 if (!IsInspectedBrowserPopup() && | |
409 FindInspectedBrowserAndTabIndex(&inspected_browser, | |
410 &inspected_tab_index)) { | |
411 BrowserWindow* inspected_window = inspected_browser->window(); | |
412 web_contents_->SetDelegate(this); | |
413 inspected_window->UpdateDevTools(); | |
414 web_contents_->GetView()->SetInitialFocus(); | |
415 inspected_window->Show(); | |
416 TabStripModel* tab_strip_model = inspected_browser->tab_strip_model(); | |
417 tab_strip_model->ActivateTabAt(inspected_tab_index, true); | |
418 PrefsTabHelper::CreateForWebContents(web_contents_); | |
419 GetRenderViewHost()->SyncRendererPrefs(); | |
420 ScheduleAction(action); | |
421 return; | |
422 } else { | |
423 // Sometimes we don't know where to dock. Stay undocked. | |
424 dock_side_ = DEVTOOLS_DOCK_SIDE_UNDOCKED; | |
425 } | |
426 } | |
427 | |
428 // Avoid consecutive window switching if the devtools window has been opened | |
429 // and the Inspect Element shortcut is pressed in the inspected tab. | |
430 bool should_show_window = | |
431 !browser_ || action != DEVTOOLS_TOGGLE_ACTION_INSPECT; | |
432 | |
433 if (!browser_) | |
434 CreateDevToolsBrowser(); | |
435 | |
436 if (should_show_window) { | |
437 browser_->window()->Show(); | |
438 web_contents_->GetView()->SetInitialFocus(); | |
439 } | |
440 | |
441 ScheduleAction(action); | |
442 } | 424 } |
443 | 425 |
444 DevToolsClientHost* DevToolsWindow::GetDevToolsClientHostForTest() { | 426 DevToolsClientHost* DevToolsWindow::GetDevToolsClientHostForTest() { |
445 return frontend_host_.get(); | 427 return frontend_host_.get(); |
446 } | 428 } |
447 | 429 |
448 int DevToolsWindow::GetWidth(int container_width) { | 430 int DevToolsWindow::GetWidth(int container_width) { |
449 if (width_ == -1) { | 431 if (width_ == -1) { |
450 width_ = profile_->GetPrefs()-> | 432 width_ = profile_->GetPrefs()-> |
451 GetInteger(prefs::kDevToolsVSplitLocation); | 433 GetInteger(prefs::kDevToolsVSplitLocation); |
(...skipping 23 matching lines...) Expand all Loading... |
475 height_ = container_height / 3; | 457 height_ = container_height / 3; |
476 | 458 |
477 // Respect the minimum devtools width preset. | 459 // Respect the minimum devtools width preset. |
478 height_ = std::max(kMinDevToolsHeight, height_); | 460 height_ = std::max(kMinDevToolsHeight, height_); |
479 | 461 |
480 // But it should never compromise the content window size. | 462 // But it should never compromise the content window size. |
481 height_ = std::min(container_height - kMinContentsSize, height_); | 463 height_ = std::min(container_height - kMinContentsSize, height_); |
482 return height_; | 464 return height_; |
483 } | 465 } |
484 | 466 |
485 int DevToolsWindow::GetMinimumWidth() { | |
486 return kMinDevToolsWidth; | |
487 } | |
488 | |
489 int DevToolsWindow::GetMinimumHeight() { | |
490 return kMinDevToolsHeight; | |
491 } | |
492 | |
493 void DevToolsWindow::SetWidth(int width) { | 467 void DevToolsWindow::SetWidth(int width) { |
494 width_ = width; | 468 width_ = width; |
495 profile_->GetPrefs()->SetInteger(prefs::kDevToolsVSplitLocation, width); | 469 profile_->GetPrefs()->SetInteger(prefs::kDevToolsVSplitLocation, width); |
496 } | 470 } |
497 | 471 |
498 void DevToolsWindow::SetHeight(int height) { | 472 void DevToolsWindow::SetHeight(int height) { |
499 height_ = height; | 473 height_ = height; |
500 profile_->GetPrefs()->SetInteger(prefs::kDevToolsHSplitLocation, height); | 474 profile_->GetPrefs()->SetInteger(prefs::kDevToolsHSplitLocation, height); |
501 } | 475 } |
502 | 476 |
503 int DevToolsWindow::GetMinimizedHeight() { | 477 void DevToolsWindow::Show(DevToolsToggleAction action) { |
504 return kMinimizedDevToolsHeight; | 478 if (IsDocked()) { |
505 } | 479 Browser* inspected_browser; |
506 | 480 int inspected_tab_index; |
507 RenderViewHost* DevToolsWindow::GetRenderViewHost() { | 481 // Tell inspected browser to update splitter and switch to inspected panel. |
508 return web_contents_->GetRenderViewHost(); | 482 if (!IsInspectedBrowserPopup() && |
509 } | 483 FindInspectedBrowserAndTabIndex(&inspected_browser, |
510 | 484 &inspected_tab_index)) { |
511 void DevToolsWindow::CreateDevToolsBrowser() { | 485 BrowserWindow* inspected_window = inspected_browser->window(); |
512 std::string wp_key = GetDevToolsWindowPlacementPrefKey(); | 486 web_contents_->SetDelegate(this); |
513 PrefService* prefs = profile_->GetPrefs(); | 487 inspected_window->UpdateDevTools(); |
514 const DictionaryValue* wp_pref = prefs->GetDictionary(wp_key.c_str()); | 488 web_contents_->GetView()->SetInitialFocus(); |
515 if (!wp_pref || wp_pref->empty()) { | 489 inspected_window->Show(); |
516 DictionaryPrefUpdate update(prefs, wp_key.c_str()); | 490 TabStripModel* tab_strip_model = inspected_browser->tab_strip_model(); |
517 DictionaryValue* defaults = update.Get(); | 491 tab_strip_model->ActivateTabAt(inspected_tab_index, true); |
518 defaults->SetInteger("left", 100); | 492 PrefsTabHelper::CreateForWebContents(web_contents_); |
519 defaults->SetInteger("top", 100); | 493 GetRenderViewHost()->SyncRendererPrefs(); |
520 defaults->SetInteger("right", 740); | 494 ScheduleAction(action); |
521 defaults->SetInteger("bottom", 740); | 495 return; |
522 defaults->SetBoolean("maximized", false); | 496 } else { |
523 defaults->SetBoolean("always_on_top", false); | 497 // Sometimes we don't know where to dock. Stay undocked. |
524 } | 498 dock_side_ = DEVTOOLS_DOCK_SIDE_UNDOCKED; |
525 | |
526 chrome::HostDesktopType host_desktop_type = | |
527 chrome::GetHostDesktopTypeForNativeView( | |
528 web_contents_->GetView()->GetNativeView()); | |
529 | |
530 browser_ = new Browser(Browser::CreateParams::CreateForDevTools( | |
531 profile_, host_desktop_type)); | |
532 browser_->tab_strip_model()->AddWebContents( | |
533 web_contents_, -1, content::PAGE_TRANSITION_AUTO_TOPLEVEL, | |
534 TabStripModel::ADD_ACTIVE); | |
535 GetRenderViewHost()->SyncRendererPrefs(); | |
536 } | |
537 | |
538 bool DevToolsWindow::FindInspectedBrowserAndTabIndex(Browser** browser, | |
539 int* tab) { | |
540 content::WebContents* inspected_web_contents = GetInspectedWebContents(); | |
541 if (!inspected_web_contents) | |
542 return false; | |
543 | |
544 for (chrome::BrowserIterator it; !it.done(); it.Next()) { | |
545 int tab_index = it->tab_strip_model()->GetIndexOfWebContents( | |
546 inspected_web_contents); | |
547 if (tab_index != TabStripModel::kNoTab) { | |
548 *browser = *it; | |
549 *tab = tab_index; | |
550 return true; | |
551 } | 499 } |
552 } | 500 } |
553 return false; | 501 |
554 } | 502 // Avoid consecutive window switching if the devtools window has been opened |
555 | 503 // and the Inspect Element shortcut is pressed in the inspected tab. |
556 BrowserWindow* DevToolsWindow::GetInspectedBrowserWindow() { | 504 bool should_show_window = |
557 Browser* browser = NULL; | 505 !browser_ || action != DEVTOOLS_TOGGLE_ACTION_INSPECT; |
558 int tab; | 506 |
559 return FindInspectedBrowserAndTabIndex(&browser, &tab) ? | 507 if (!browser_) |
560 browser->window() : NULL; | 508 CreateDevToolsBrowser(); |
561 } | 509 |
562 | 510 if (should_show_window) { |
563 bool DevToolsWindow::IsInspectedBrowserPopup() { | 511 browser_->window()->Show(); |
564 Browser* browser = NULL; | 512 web_contents_->GetView()->SetInitialFocus(); |
565 int tab; | 513 } |
566 if (!FindInspectedBrowserAndTabIndex(&browser, &tab)) | 514 |
567 return false; | 515 ScheduleAction(action); |
568 | 516 } |
569 return browser->is_type_popup(); | 517 |
570 } | 518 DevToolsWindow::DevToolsWindow(Profile* profile, |
571 | 519 const GURL& url, |
572 void DevToolsWindow::UpdateFrontendDockSide() { | 520 RenderViewHost* inspected_rvh, |
573 base::StringValue dock_side(SideToString(dock_side_)); | 521 DevToolsDockSide dock_side) |
574 CallClientFunction("InspectorFrontendAPI.setDockSide", &dock_side); | 522 : profile_(profile), |
575 base::FundamentalValue docked(IsDocked()); | 523 browser_(NULL), |
576 CallClientFunction("InspectorFrontendAPI.setAttachedWindow", &docked); | 524 dock_side_(dock_side), |
577 } | 525 is_loaded_(false), |
578 | 526 action_on_load_(DEVTOOLS_TOGGLE_ACTION_SHOW), |
579 | 527 weak_factory_(this), |
580 void DevToolsWindow::AddDevToolsExtensionsToClient() { | 528 width_(-1), |
581 content::WebContents* inspected_web_contents = GetInspectedWebContents(); | 529 height_(-1), |
582 if (inspected_web_contents) { | 530 dock_side_before_minimized_(dock_side) { |
583 SessionTabHelper* session_tab_helper = | 531 web_contents_ = WebContents::Create(WebContents::CreateParams(profile)); |
584 SessionTabHelper::FromWebContents(inspected_web_contents); | 532 frontend_contents_observer_.reset( |
585 if (session_tab_helper) { | 533 new FrontendWebContentsObserver(web_contents_)); |
586 base::FundamentalValue tabId(session_tab_helper->session_id().id()); | 534 |
587 CallClientFunction("WebInspector.setInspectedTabId", &tabId); | 535 web_contents_->GetController().LoadURL(url, content::Referrer(), |
588 } | 536 content::PAGE_TRANSITION_AUTO_TOPLEVEL, std::string()); |
589 } | 537 |
590 ListValue results; | 538 frontend_host_.reset( |
591 Profile* profile = | 539 DevToolsClientHost::CreateDevToolsFrontendHost(web_contents_, this)); |
592 Profile::FromBrowserContext(web_contents_->GetBrowserContext()); | 540 file_helper_.reset(new DevToolsFileHelper(web_contents_, profile)); |
593 const ExtensionService* extension_service = extensions::ExtensionSystem::Get( | 541 |
594 profile->GetOriginalProfile())->extension_service(); | 542 g_instances.Get().push_back(this); |
595 if (!extension_service) | 543 // Wipe out page icon so that the default application icon is used. |
596 return; | 544 NavigationEntry* entry = web_contents_->GetController().GetActiveEntry(); |
597 | 545 entry->GetFavicon().image = gfx::Image(); |
598 const ExtensionSet* extensions = extension_service->extensions(); | 546 entry->GetFavicon().valid = true; |
599 | 547 |
600 for (ExtensionSet::const_iterator extension = extensions->begin(); | 548 // Register on-load actions. |
601 extension != extensions->end(); ++extension) { | 549 registrar_.Add( |
602 if (extensions::ManifestURL::GetDevToolsPage(extension->get()).is_empty()) | 550 this, |
603 continue; | 551 content::NOTIFICATION_LOAD_STOP, |
604 DictionaryValue* extension_info = new DictionaryValue(); | 552 content::Source<NavigationController>(&web_contents_->GetController())); |
605 extension_info->Set( | 553 registrar_.Add( |
606 "startPage", | 554 this, |
607 new StringValue( | 555 chrome::NOTIFICATION_TAB_CLOSING, |
608 extensions::ManifestURL::GetDevToolsPage(extension->get()).spec())); | 556 content::Source<NavigationController>(&web_contents_->GetController())); |
609 extension_info->Set("name", new StringValue((*extension)->name())); | 557 registrar_.Add( |
610 bool allow_experimental = (*extension)->HasAPIPermission( | 558 this, |
611 extensions::APIPermission::kExperimental); | 559 chrome::NOTIFICATION_BROWSER_THEME_CHANGED, |
612 extension_info->Set("exposeExperimentalAPIs", | 560 content::Source<ThemeService>( |
613 new base::FundamentalValue(allow_experimental)); | 561 ThemeServiceFactory::GetForProfile(profile_))); |
614 results.Append(extension_info); | 562 // There is no inspected_rvh in case of shared workers. |
615 } | 563 if (inspected_rvh) |
616 CallClientFunction("WebInspector.addExtensions", &results); | 564 inspected_contents_observer_.reset(new InspectedWebContentsObserver( |
617 } | 565 WebContents::FromRenderViewHost(inspected_rvh))); |
618 | 566 } |
619 WebContents* DevToolsWindow::OpenURLFromTab(WebContents* source, | 567 |
620 const OpenURLParams& params) { | 568 // static |
621 if (!params.url.SchemeIs(chrome::kChromeDevToolsScheme)) { | 569 DevToolsWindow* DevToolsWindow::Create( |
622 content::WebContents* inspected_web_contents = GetInspectedWebContents(); | 570 Profile* profile, |
623 if (inspected_web_contents) | 571 const GURL& frontend_url, |
624 return inspected_web_contents->OpenURL(params); | 572 RenderViewHost* inspected_rvh, |
| 573 DevToolsDockSide dock_side, |
| 574 bool shared_worker_frontend) { |
| 575 // Create WebContents with devtools. |
| 576 GURL url = GetDevToolsURL(profile, frontend_url, dock_side, |
| 577 shared_worker_frontend); |
| 578 return new DevToolsWindow(profile, url, inspected_rvh, dock_side); |
| 579 } |
| 580 |
| 581 // static |
| 582 GURL DevToolsWindow::GetDevToolsURL(Profile* profile, |
| 583 const GURL& base_url, |
| 584 DevToolsDockSide dock_side, |
| 585 bool shared_worker_frontend) { |
| 586 ThemeService* tp = ThemeServiceFactory::GetForProfile(profile); |
| 587 CHECK(tp); |
| 588 |
| 589 SkColor color_toolbar = |
| 590 tp->GetColor(ThemeProperties::COLOR_TOOLBAR); |
| 591 SkColor color_tab_text = |
| 592 tp->GetColor(ThemeProperties::COLOR_BOOKMARK_TEXT); |
| 593 |
| 594 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
| 595 bool experiments_enabled = |
| 596 command_line.HasSwitch(switches::kEnableDevToolsExperiments); |
| 597 |
| 598 std::string frontend_url = base_url.is_empty() ? |
| 599 chrome::kChromeUIDevToolsURL : base_url.spec(); |
| 600 std::string params_separator = |
| 601 frontend_url.find("?") == std::string::npos ? "?" : "&"; |
| 602 std::string url_string = base::StringPrintf("%s%s" |
| 603 "dockSide=%s&toolbarColor=%s&textColor=%s%s%s", |
| 604 frontend_url.c_str(), |
| 605 params_separator.c_str(), |
| 606 SideToString(dock_side).c_str(), |
| 607 SkColorToRGBAString(color_toolbar).c_str(), |
| 608 SkColorToRGBAString(color_tab_text).c_str(), |
| 609 shared_worker_frontend ? "&isSharedWorker=true" : "", |
| 610 experiments_enabled ? "&experiments=true" : ""); |
| 611 return GURL(url_string); |
| 612 } |
| 613 |
| 614 // static |
| 615 DevToolsWindow* DevToolsWindow::FindDevToolsWindow( |
| 616 DevToolsAgentHost* agent_host) { |
| 617 DevToolsManager* manager = DevToolsManager::GetInstance(); |
| 618 DevToolsWindowList& instances = g_instances.Get(); |
| 619 for (DevToolsWindowList::iterator it = instances.begin(); |
| 620 it != instances.end(); ++it) { |
| 621 if (manager->GetDevToolsAgentHostFor((*it)->frontend_host_.get()) == |
| 622 agent_host) |
| 623 return *it; |
| 624 } |
| 625 return NULL; |
| 626 } |
| 627 |
| 628 // static |
| 629 DevToolsWindow* DevToolsWindow::AsDevToolsWindow(RenderViewHost* window_rvh) { |
| 630 if (g_instances == NULL) |
625 return NULL; | 631 return NULL; |
626 } | 632 DevToolsWindowList& instances = g_instances.Get(); |
627 | 633 for (DevToolsWindowList::iterator it = instances.begin(); |
628 DevToolsManager* manager = DevToolsManager::GetInstance(); | 634 it != instances.end(); ++it) { |
629 scoped_refptr<DevToolsAgentHost> agent_host( | 635 if ((*it)->web_contents_->GetRenderViewHost() == window_rvh) |
630 manager->GetDevToolsAgentHostFor(frontend_host_.get())); | 636 return *it; |
631 if (!agent_host.get()) | 637 } |
632 return NULL; | 638 return NULL; |
633 manager->ClientHostClosing(frontend_host_.get()); | 639 } |
634 manager->RegisterDevToolsClientHostFor(agent_host.get(), | 640 |
635 frontend_host_.get()); | 641 // static |
636 | 642 DevToolsDockSide DevToolsWindow::GetDockSideFromPrefs(Profile* profile) { |
637 chrome::NavigateParams nav_params(profile_, params.url, params.transition); | 643 std::string dock_side = |
638 FillNavigateParamsFromOpenURLParams(&nav_params, params); | 644 profile->GetPrefs()->GetString(prefs::kDevToolsDockSide); |
639 nav_params.source_contents = source; | 645 |
640 nav_params.tabstrip_add_types = TabStripModel::ADD_NONE; | 646 // Migrate prefs |
641 nav_params.window_action = chrome::NavigateParams::SHOW_WINDOW; | 647 if (dock_side == kOldPrefBottom || dock_side == kOldPrefRight) { |
642 nav_params.user_gesture = params.user_gesture; | 648 bool docked = profile->GetPrefs()->GetBoolean(prefs::kDevToolsOpenDocked); |
643 chrome::Navigate(&nav_params); | 649 if (dock_side == kOldPrefBottom) |
644 return nav_params.target_contents; | 650 return docked ? DEVTOOLS_DOCK_SIDE_BOTTOM : DEVTOOLS_DOCK_SIDE_UNDOCKED; |
645 } | 651 else |
646 | 652 return docked ? DEVTOOLS_DOCK_SIDE_RIGHT : DEVTOOLS_DOCK_SIDE_UNDOCKED; |
647 void DevToolsWindow::CallClientFunction(const std::string& function_name, | 653 } |
648 const Value* arg1, | 654 |
649 const Value* arg2) { | 655 if (dock_side == kPrefUndocked) |
650 std::string params; | 656 return DEVTOOLS_DOCK_SIDE_UNDOCKED; |
651 if (arg1) { | 657 else if (dock_side == kPrefRight) |
652 std::string json; | 658 return DEVTOOLS_DOCK_SIDE_RIGHT; |
653 base::JSONWriter::Write(arg1, &json); | 659 // Default to docked to bottom |
654 params.append(json); | 660 return DEVTOOLS_DOCK_SIDE_BOTTOM; |
655 if (arg2) { | 661 } |
656 base::JSONWriter::Write(arg2, &json); | 662 |
657 params.append(", " + json); | 663 // static |
658 } | 664 std::string DevToolsWindow::SideToString(DevToolsDockSide dock_side) { |
659 } | 665 std::string dock_side_string; |
660 string16 javascript = ASCIIToUTF16(function_name + "(" + params + ");"); | 666 switch (dock_side) { |
661 web_contents_->GetRenderViewHost()-> | 667 case DEVTOOLS_DOCK_SIDE_UNDOCKED: return kDockSideUndocked; |
662 ExecuteJavascriptInWebFrame(string16(), javascript); | 668 case DEVTOOLS_DOCK_SIDE_RIGHT: return kDockSideRight; |
| 669 case DEVTOOLS_DOCK_SIDE_BOTTOM: return kDockSideBottom; |
| 670 case DEVTOOLS_DOCK_SIDE_MINIMIZED: return kDockSideMinimized; |
| 671 } |
| 672 return kDockSideUndocked; |
| 673 } |
| 674 |
| 675 // static |
| 676 DevToolsDockSide DevToolsWindow::SideFromString( |
| 677 const std::string& dock_side) { |
| 678 if (dock_side == kDockSideRight) |
| 679 return DEVTOOLS_DOCK_SIDE_RIGHT; |
| 680 if (dock_side == kDockSideBottom) |
| 681 return DEVTOOLS_DOCK_SIDE_BOTTOM; |
| 682 if (dock_side == kDockSideMinimized) |
| 683 return DEVTOOLS_DOCK_SIDE_MINIMIZED; |
| 684 return DEVTOOLS_DOCK_SIDE_UNDOCKED; |
663 } | 685 } |
664 | 686 |
665 void DevToolsWindow::Observe(int type, | 687 void DevToolsWindow::Observe(int type, |
666 const content::NotificationSource& source, | 688 const content::NotificationSource& source, |
667 const content::NotificationDetails& details) { | 689 const content::NotificationDetails& details) { |
668 if (type == content::NOTIFICATION_LOAD_STOP && !is_loaded_) { | 690 if (type == content::NOTIFICATION_LOAD_STOP && !is_loaded_) { |
669 is_loaded_ = true; | 691 is_loaded_ = true; |
670 UpdateTheme(); | 692 UpdateTheme(); |
671 DoAction(); | 693 DoAction(); |
672 AddDevToolsExtensionsToClient(); | 694 AddDevToolsExtensionsToClient(); |
673 } else if (type == chrome::NOTIFICATION_TAB_CLOSING) { | 695 } else if (type == chrome::NOTIFICATION_TAB_CLOSING) { |
674 if (content::Source<NavigationController>(source).ptr() == | 696 if (content::Source<NavigationController>(source).ptr() == |
675 &web_contents_->GetController()) { | 697 &web_contents_->GetController()) { |
676 // This happens when browser closes all of its tabs as a result | 698 // This happens when browser closes all of its tabs as a result |
677 // of window.Close event. | 699 // of window.Close event. |
678 // Notify manager that this DevToolsClientHost no longer exists and | 700 // Notify manager that this DevToolsClientHost no longer exists and |
679 // initiate self-destuct here. | 701 // initiate self-destuct here. |
680 DevToolsManager::GetInstance()->ClientHostClosing(frontend_host_.get()); | 702 DevToolsManager::GetInstance()->ClientHostClosing(frontend_host_.get()); |
681 UpdateBrowserToolbar(); | 703 UpdateBrowserToolbar(); |
682 delete this; | 704 delete this; |
683 } | 705 } |
684 } else if (type == chrome::NOTIFICATION_BROWSER_THEME_CHANGED) { | 706 } else if (type == chrome::NOTIFICATION_BROWSER_THEME_CHANGED) { |
685 UpdateTheme(); | 707 UpdateTheme(); |
686 } | 708 } |
687 } | 709 } |
688 | 710 |
689 void DevToolsWindow::ScheduleAction(DevToolsToggleAction action) { | 711 WebContents* DevToolsWindow::OpenURLFromTab(WebContents* source, |
690 action_on_load_ = action; | 712 const OpenURLParams& params) { |
691 if (is_loaded_) | 713 if (!params.url.SchemeIs(chrome::kChromeDevToolsScheme)) { |
692 DoAction(); | 714 content::WebContents* inspected_web_contents = GetInspectedWebContents(); |
693 } | 715 if (inspected_web_contents) |
| 716 return inspected_web_contents->OpenURL(params); |
| 717 return NULL; |
| 718 } |
694 | 719 |
695 void DevToolsWindow::DoAction() { | 720 DevToolsManager* manager = DevToolsManager::GetInstance(); |
696 UpdateFrontendDockSide(); | 721 scoped_refptr<DevToolsAgentHost> agent_host( |
697 switch (action_on_load_) { | 722 manager->GetDevToolsAgentHostFor(frontend_host_.get())); |
698 case DEVTOOLS_TOGGLE_ACTION_SHOW_CONSOLE: | 723 if (!agent_host.get()) |
699 CallClientFunction("InspectorFrontendAPI.showConsole", NULL); | 724 return NULL; |
700 break; | 725 manager->ClientHostClosing(frontend_host_.get()); |
701 case DEVTOOLS_TOGGLE_ACTION_INSPECT: | 726 manager->RegisterDevToolsClientHostFor(agent_host.get(), |
702 CallClientFunction("InspectorFrontendAPI.enterInspectElementMode", NULL); | 727 frontend_host_.get()); |
703 case DEVTOOLS_TOGGLE_ACTION_SHOW: | |
704 case DEVTOOLS_TOGGLE_ACTION_TOGGLE: | |
705 // Do nothing. | |
706 break; | |
707 default: | |
708 NOTREACHED(); | |
709 } | |
710 action_on_load_ = DEVTOOLS_TOGGLE_ACTION_SHOW; | |
711 } | |
712 | 728 |
713 std::string SkColorToRGBAString(SkColor color) { | 729 chrome::NavigateParams nav_params(profile_, params.url, params.transition); |
714 // We convert the alpha using DoubleToString because StringPrintf will use | 730 FillNavigateParamsFromOpenURLParams(&nav_params, params); |
715 // locale specific formatters (e.g., use , instead of . in German). | 731 nav_params.source_contents = source; |
716 return base::StringPrintf("rgba(%d,%d,%d,%s)", SkColorGetR(color), | 732 nav_params.tabstrip_add_types = TabStripModel::ADD_NONE; |
717 SkColorGetG(color), SkColorGetB(color), | 733 nav_params.window_action = chrome::NavigateParams::SHOW_WINDOW; |
718 base::DoubleToString(SkColorGetA(color) / 255.0).c_str()); | 734 nav_params.user_gesture = params.user_gesture; |
719 } | 735 chrome::Navigate(&nav_params); |
720 | 736 return nav_params.target_contents; |
721 // static | |
722 GURL DevToolsWindow::GetDevToolsURL(Profile* profile, | |
723 const GURL& base_url, | |
724 DevToolsDockSide dock_side, | |
725 bool shared_worker_frontend) { | |
726 ThemeService* tp = ThemeServiceFactory::GetForProfile(profile); | |
727 CHECK(tp); | |
728 | |
729 SkColor color_toolbar = | |
730 tp->GetColor(ThemeProperties::COLOR_TOOLBAR); | |
731 SkColor color_tab_text = | |
732 tp->GetColor(ThemeProperties::COLOR_BOOKMARK_TEXT); | |
733 | |
734 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); | |
735 bool experiments_enabled = | |
736 command_line.HasSwitch(switches::kEnableDevToolsExperiments); | |
737 | |
738 std::string frontend_url = base_url.is_empty() ? | |
739 chrome::kChromeUIDevToolsURL : base_url.spec(); | |
740 std::string params_separator = | |
741 frontend_url.find("?") == std::string::npos ? "?" : "&"; | |
742 std::string url_string = base::StringPrintf("%s%s" | |
743 "dockSide=%s&toolbarColor=%s&textColor=%s%s%s", | |
744 frontend_url.c_str(), | |
745 params_separator.c_str(), | |
746 SideToString(dock_side).c_str(), | |
747 SkColorToRGBAString(color_toolbar).c_str(), | |
748 SkColorToRGBAString(color_tab_text).c_str(), | |
749 shared_worker_frontend ? "&isSharedWorker=true" : "", | |
750 experiments_enabled ? "&experiments=true" : ""); | |
751 return GURL(url_string); | |
752 } | |
753 | |
754 void DevToolsWindow::UpdateTheme() { | |
755 ThemeService* tp = ThemeServiceFactory::GetForProfile(profile_); | |
756 CHECK(tp); | |
757 | |
758 SkColor color_toolbar = | |
759 tp->GetColor(ThemeProperties::COLOR_TOOLBAR); | |
760 SkColor color_tab_text = | |
761 tp->GetColor(ThemeProperties::COLOR_BOOKMARK_TEXT); | |
762 std::string command = base::StringPrintf( | |
763 "InspectorFrontendAPI.setToolbarColors(\"%s\", \"%s\")", | |
764 SkColorToRGBAString(color_toolbar).c_str(), | |
765 SkColorToRGBAString(color_tab_text).c_str()); | |
766 web_contents_->GetRenderViewHost()-> | |
767 ExecuteJavascriptInWebFrame(string16(), UTF8ToUTF16(command)); | |
768 } | 737 } |
769 | 738 |
770 void DevToolsWindow::AddNewContents(WebContents* source, | 739 void DevToolsWindow::AddNewContents(WebContents* source, |
771 WebContents* new_contents, | 740 WebContents* new_contents, |
772 WindowOpenDisposition disposition, | 741 WindowOpenDisposition disposition, |
773 const gfx::Rect& initial_pos, | 742 const gfx::Rect& initial_pos, |
774 bool user_gesture, | 743 bool user_gesture, |
775 bool* was_blocked) { | 744 bool* was_blocked) { |
776 content::WebContents* inspected_web_contents = GetInspectedWebContents(); | 745 content::WebContents* inspected_web_contents = GetInspectedWebContents(); |
777 if (inspected_web_contents) { | 746 if (inspected_web_contents) { |
778 inspected_web_contents->GetDelegate()->AddNewContents( | 747 inspected_web_contents->GetDelegate()->AddNewContents( |
779 source, new_contents, disposition, initial_pos, user_gesture, | 748 source, new_contents, disposition, initial_pos, user_gesture, |
780 was_blocked); | 749 was_blocked); |
781 } | 750 } |
782 } | 751 } |
783 | 752 |
| 753 void DevToolsWindow::CloseContents(content::WebContents* source) { |
| 754 } |
| 755 |
784 bool DevToolsWindow::PreHandleKeyboardEvent( | 756 bool DevToolsWindow::PreHandleKeyboardEvent( |
785 WebContents* source, | 757 WebContents* source, |
786 const NativeWebKeyboardEvent& event, bool* is_keyboard_shortcut) { | 758 const NativeWebKeyboardEvent& event, bool* is_keyboard_shortcut) { |
787 if (IsDocked()) { | 759 if (IsDocked()) { |
788 BrowserWindow* inspected_window = GetInspectedBrowserWindow(); | 760 BrowserWindow* inspected_window = GetInspectedBrowserWindow(); |
789 if (inspected_window) | 761 if (inspected_window) |
790 return inspected_window->PreHandleKeyboardEvent( | 762 return inspected_window->PreHandleKeyboardEvent( |
791 event, is_keyboard_shortcut); | 763 event, is_keyboard_shortcut); |
792 } | 764 } |
793 return false; | 765 return false; |
794 } | 766 } |
795 | 767 |
796 void DevToolsWindow::HandleKeyboardEvent(WebContents* source, | 768 void DevToolsWindow::HandleKeyboardEvent(WebContents* source, |
797 const NativeWebKeyboardEvent& event) { | 769 const NativeWebKeyboardEvent& event) { |
798 if (IsDocked()) { | 770 if (IsDocked()) { |
799 if (event.windowsKeyCode == 0x08) { | 771 if (event.windowsKeyCode == 0x08) { |
800 // Do not navigate back in history on Windows (http://crbug.com/74156). | 772 // Do not navigate back in history on Windows (http://crbug.com/74156). |
801 return; | 773 return; |
802 } | 774 } |
803 BrowserWindow* inspected_window = GetInspectedBrowserWindow(); | 775 BrowserWindow* inspected_window = GetInspectedBrowserWindow(); |
804 if (inspected_window) | 776 if (inspected_window) |
805 inspected_window->HandleKeyboardEvent(event); | 777 inspected_window->HandleKeyboardEvent(event); |
806 } | 778 } |
807 } | 779 } |
808 | 780 |
809 // static | 781 content::JavaScriptDialogManager* DevToolsWindow::GetJavaScriptDialogManager() { |
810 DevToolsWindow* DevToolsWindow::ToggleDevToolsWindow( | 782 content::WebContents* inspected_web_contents = GetInspectedWebContents(); |
811 RenderViewHost* inspected_rvh, | 783 if (inspected_web_contents && inspected_web_contents->GetDelegate()) { |
812 bool force_open, | 784 return inspected_web_contents->GetDelegate()-> |
813 DevToolsToggleAction action) { | 785 GetJavaScriptDialogManager(); |
814 scoped_refptr<DevToolsAgentHost> agent( | |
815 DevToolsAgentHost::GetOrCreateFor(inspected_rvh)); | |
816 DevToolsManager* manager = DevToolsManager::GetInstance(); | |
817 DevToolsWindow* window = FindDevToolsWindow(agent.get()); | |
818 bool do_open = force_open; | |
819 if (!window) { | |
820 Profile* profile = Profile::FromBrowserContext( | |
821 inspected_rvh->GetProcess()->GetBrowserContext()); | |
822 DevToolsDockSide dock_side = GetDockSideFromPrefs(profile); | |
823 window = Create(profile, GURL(), inspected_rvh, dock_side, false); | |
824 manager->RegisterDevToolsClientHostFor(agent.get(), | |
825 window->frontend_host_.get()); | |
826 do_open = true; | |
827 } | 786 } |
828 | 787 return content::WebContentsDelegate::GetJavaScriptDialogManager(); |
829 // Update toolbar to reflect DevTools changes. | |
830 window->UpdateBrowserToolbar(); | |
831 | |
832 // If window is docked and visible, we hide it on toggle. If window is | |
833 // undocked, we show (activate) it. If window is minimized, we maximize it. | |
834 if (window->dock_side_ == DEVTOOLS_DOCK_SIDE_MINIMIZED) | |
835 window->Restore(); | |
836 else if (!window->IsDocked() || do_open) | |
837 window->Show(action); | |
838 else | |
839 window->CloseWindow(); | |
840 | |
841 return window; | |
842 } | 788 } |
843 | 789 |
844 // static | 790 content::ColorChooser* DevToolsWindow::OpenColorChooser( |
845 DevToolsWindow* DevToolsWindow::FindDevToolsWindow( | 791 WebContents* web_contents, SkColor initial_color) { |
846 DevToolsAgentHost* agent_host) { | 792 return chrome::ShowColorChooser(web_contents, initial_color); |
847 DevToolsManager* manager = DevToolsManager::GetInstance(); | |
848 DevToolsWindowList& instances = g_instances.Get(); | |
849 for (DevToolsWindowList::iterator it = instances.begin(); | |
850 it != instances.end(); ++it) { | |
851 if (manager->GetDevToolsAgentHostFor((*it)->frontend_host_.get()) == | |
852 agent_host) | |
853 return *it; | |
854 } | |
855 return NULL; | |
856 } | 793 } |
857 | 794 |
858 // static | 795 void DevToolsWindow::RunFileChooser(WebContents* web_contents, |
859 DevToolsWindow* DevToolsWindow::AsDevToolsWindow(RenderViewHost* window_rvh) { | 796 const FileChooserParams& params) { |
860 if (g_instances == NULL) | 797 FileSelectHelper::RunFileChooser(web_contents, params); |
861 return NULL; | 798 } |
862 DevToolsWindowList& instances = g_instances.Get(); | 799 |
863 for (DevToolsWindowList::iterator it = instances.begin(); | 800 void DevToolsWindow::WebContentsFocused(WebContents* contents) { |
864 it != instances.end(); ++it) { | 801 Browser* inspected_browser = NULL; |
865 if ((*it)->web_contents_->GetRenderViewHost() == window_rvh) | 802 int inspected_tab_index = -1; |
866 return *it; | 803 |
| 804 if (IsDocked() && FindInspectedBrowserAndTabIndex(&inspected_browser, |
| 805 &inspected_tab_index)) { |
| 806 inspected_browser->window()->WebContentsFocused(contents); |
867 } | 807 } |
868 return NULL; | |
869 } | 808 } |
870 | 809 |
871 void DevToolsWindow::ActivateWindow() { | 810 void DevToolsWindow::ActivateWindow() { |
872 if (!IsDocked()) { | 811 if (!IsDocked()) { |
873 if (!browser_->window()->IsActive()) { | 812 if (!browser_->window()->IsActive()) { |
874 browser_->window()->Activate(); | 813 browser_->window()->Activate(); |
875 } | 814 } |
876 } else { | 815 } else { |
877 BrowserWindow* inspected_window = GetInspectedBrowserWindow(); | 816 BrowserWindow* inspected_window = GetInspectedBrowserWindow(); |
878 if (inspected_window) | 817 if (inspected_window) |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
947 case DEVTOOLS_DOCK_SIDE_MINIMIZED: | 886 case DEVTOOLS_DOCK_SIDE_MINIMIZED: |
948 // We don't persist minimized state. | 887 // We don't persist minimized state. |
949 break; | 888 break; |
950 } | 889 } |
951 profile_->GetPrefs()->SetString(prefs::kDevToolsDockSide, pref_value); | 890 profile_->GetPrefs()->SetString(prefs::kDevToolsDockSide, pref_value); |
952 } | 891 } |
953 | 892 |
954 Show(DEVTOOLS_TOGGLE_ACTION_SHOW); | 893 Show(DEVTOOLS_TOGGLE_ACTION_SHOW); |
955 } | 894 } |
956 | 895 |
957 void DevToolsWindow::Restore() { | |
958 if (dock_side_ == DEVTOOLS_DOCK_SIDE_MINIMIZED) | |
959 SetDockSide(SideToString(dock_side_before_minimized_)); | |
960 } | |
961 | |
962 void DevToolsWindow::OpenInNewTab(const std::string& url) { | 896 void DevToolsWindow::OpenInNewTab(const std::string& url) { |
963 OpenURLParams params(GURL(url), | 897 OpenURLParams params(GURL(url), |
964 content::Referrer(), | 898 content::Referrer(), |
965 NEW_FOREGROUND_TAB, | 899 NEW_FOREGROUND_TAB, |
966 content::PAGE_TRANSITION_LINK, | 900 content::PAGE_TRANSITION_LINK, |
967 false /* is_renderer_initiated */); | 901 false /* is_renderer_initiated */); |
968 content::WebContents* inspected_web_contents = GetInspectedWebContents(); | 902 content::WebContents* inspected_web_contents = GetInspectedWebContents(); |
969 if (inspected_web_contents) { | 903 if (inspected_web_contents) { |
970 inspected_web_contents->OpenURL(params); | 904 inspected_web_contents->OpenURL(params); |
971 } else { | 905 } else { |
(...skipping 27 matching lines...) Expand all Loading... |
999 url)); | 933 url)); |
1000 } | 934 } |
1001 | 935 |
1002 void DevToolsWindow::AppendToFile(const std::string& url, | 936 void DevToolsWindow::AppendToFile(const std::string& url, |
1003 const std::string& content) { | 937 const std::string& content) { |
1004 file_helper_->Append(url, content, Bind(&DevToolsWindow::AppendedTo, | 938 file_helper_->Append(url, content, Bind(&DevToolsWindow::AppendedTo, |
1005 weak_factory_.GetWeakPtr(), | 939 weak_factory_.GetWeakPtr(), |
1006 url)); | 940 url)); |
1007 } | 941 } |
1008 | 942 |
1009 namespace { | |
1010 | |
1011 DictionaryValue* CreateFileSystemValue( | |
1012 DevToolsFileHelper::FileSystem file_system) { | |
1013 DictionaryValue* file_system_value = new DictionaryValue(); | |
1014 file_system_value->SetString("fileSystemName", file_system.file_system_name); | |
1015 file_system_value->SetString("rootURL", file_system.root_url); | |
1016 file_system_value->SetString("fileSystemPath", file_system.file_system_path); | |
1017 return file_system_value; | |
1018 } | |
1019 | |
1020 } // namespace | |
1021 | |
1022 void DevToolsWindow::RequestFileSystems() { | 943 void DevToolsWindow::RequestFileSystems() { |
1023 CHECK(web_contents_->GetURL().SchemeIs(chrome::kChromeDevToolsScheme)); | 944 CHECK(web_contents_->GetURL().SchemeIs(chrome::kChromeDevToolsScheme)); |
1024 file_helper_->RequestFileSystems( | 945 file_helper_->RequestFileSystems( |
1025 Bind(&DevToolsWindow::FileSystemsLoaded, weak_factory_.GetWeakPtr())); | 946 Bind(&DevToolsWindow::FileSystemsLoaded, weak_factory_.GetWeakPtr())); |
1026 } | 947 } |
1027 | 948 |
1028 void DevToolsWindow::AddFileSystem() { | 949 void DevToolsWindow::AddFileSystem() { |
1029 CHECK(web_contents_->GetURL().SchemeIs(chrome::kChromeDevToolsScheme)); | 950 CHECK(web_contents_->GetURL().SchemeIs(chrome::kChromeDevToolsScheme)); |
1030 file_helper_->AddFileSystem( | 951 file_helper_->AddFileSystem( |
1031 Bind(&DevToolsWindow::FileSystemAdded, weak_factory_.GetWeakPtr()), | 952 Bind(&DevToolsWindow::FileSystemAdded, weak_factory_.GetWeakPtr()), |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1085 infobar_service->AddInfoBar(scoped_ptr<InfoBarDelegate>( | 1006 infobar_service->AddInfoBar(scoped_ptr<InfoBarDelegate>( |
1086 new DevToolsConfirmInfoBarDelegate( | 1007 new DevToolsConfirmInfoBarDelegate( |
1087 infobar_service, | 1008 infobar_service, |
1088 callback, | 1009 callback, |
1089 message))); | 1010 message))); |
1090 } else { | 1011 } else { |
1091 callback.Run(false); | 1012 callback.Run(false); |
1092 } | 1013 } |
1093 } | 1014 } |
1094 | 1015 |
1095 content::JavaScriptDialogManager* DevToolsWindow::GetJavaScriptDialogManager() { | 1016 void DevToolsWindow::CreateDevToolsBrowser() { |
1096 content::WebContents* inspected_web_contents = GetInspectedWebContents(); | 1017 std::string wp_key = GetDevToolsWindowPlacementPrefKey(); |
1097 if (inspected_web_contents && inspected_web_contents->GetDelegate()) { | 1018 PrefService* prefs = profile_->GetPrefs(); |
1098 return inspected_web_contents->GetDelegate()-> | 1019 const DictionaryValue* wp_pref = prefs->GetDictionary(wp_key.c_str()); |
1099 GetJavaScriptDialogManager(); | 1020 if (!wp_pref || wp_pref->empty()) { |
| 1021 DictionaryPrefUpdate update(prefs, wp_key.c_str()); |
| 1022 DictionaryValue* defaults = update.Get(); |
| 1023 defaults->SetInteger("left", 100); |
| 1024 defaults->SetInteger("top", 100); |
| 1025 defaults->SetInteger("right", 740); |
| 1026 defaults->SetInteger("bottom", 740); |
| 1027 defaults->SetBoolean("maximized", false); |
| 1028 defaults->SetBoolean("always_on_top", false); |
1100 } | 1029 } |
1101 return content::WebContentsDelegate::GetJavaScriptDialogManager(); | 1030 |
| 1031 chrome::HostDesktopType host_desktop_type = |
| 1032 chrome::GetHostDesktopTypeForNativeView( |
| 1033 web_contents_->GetView()->GetNativeView()); |
| 1034 |
| 1035 browser_ = new Browser(Browser::CreateParams::CreateForDevTools( |
| 1036 profile_, host_desktop_type)); |
| 1037 browser_->tab_strip_model()->AddWebContents( |
| 1038 web_contents_, -1, content::PAGE_TRANSITION_AUTO_TOPLEVEL, |
| 1039 TabStripModel::ADD_ACTIVE); |
| 1040 GetRenderViewHost()->SyncRendererPrefs(); |
1102 } | 1041 } |
1103 | 1042 |
1104 content::ColorChooser* DevToolsWindow::OpenColorChooser( | 1043 bool DevToolsWindow::FindInspectedBrowserAndTabIndex(Browser** browser, |
1105 WebContents* web_contents, SkColor initial_color) { | 1044 int* tab) { |
1106 return chrome::ShowColorChooser(web_contents, initial_color); | 1045 content::WebContents* inspected_web_contents = GetInspectedWebContents(); |
| 1046 if (!inspected_web_contents) |
| 1047 return false; |
| 1048 |
| 1049 for (chrome::BrowserIterator it; !it.done(); it.Next()) { |
| 1050 int tab_index = it->tab_strip_model()->GetIndexOfWebContents( |
| 1051 inspected_web_contents); |
| 1052 if (tab_index != TabStripModel::kNoTab) { |
| 1053 *browser = *it; |
| 1054 *tab = tab_index; |
| 1055 return true; |
| 1056 } |
| 1057 } |
| 1058 return false; |
1107 } | 1059 } |
1108 | 1060 |
1109 void DevToolsWindow::RunFileChooser(WebContents* web_contents, | 1061 BrowserWindow* DevToolsWindow::GetInspectedBrowserWindow() { |
1110 const FileChooserParams& params) { | 1062 Browser* browser = NULL; |
1111 FileSelectHelper::RunFileChooser(web_contents, params); | 1063 int tab; |
| 1064 return FindInspectedBrowserAndTabIndex(&browser, &tab) ? |
| 1065 browser->window() : NULL; |
1112 } | 1066 } |
1113 | 1067 |
1114 void DevToolsWindow::WebContentsFocused(WebContents* contents) { | 1068 bool DevToolsWindow::IsInspectedBrowserPopup() { |
1115 Browser* inspected_browser = NULL; | 1069 Browser* browser = NULL; |
1116 int inspected_tab_index = -1; | 1070 int tab; |
| 1071 if (!FindInspectedBrowserAndTabIndex(&browser, &tab)) |
| 1072 return false; |
1117 | 1073 |
1118 if (IsDocked() && FindInspectedBrowserAndTabIndex(&inspected_browser, | 1074 return browser->is_type_popup(); |
1119 &inspected_tab_index)) { | 1075 } |
1120 inspected_browser->window()->WebContentsFocused(contents); | 1076 |
| 1077 void DevToolsWindow::UpdateFrontendDockSide() { |
| 1078 base::StringValue dock_side(SideToString(dock_side_)); |
| 1079 CallClientFunction("InspectorFrontendAPI.setDockSide", &dock_side); |
| 1080 base::FundamentalValue docked(IsDocked()); |
| 1081 CallClientFunction("InspectorFrontendAPI.setAttachedWindow", &docked); |
| 1082 } |
| 1083 |
| 1084 void DevToolsWindow::Hide() { |
| 1085 if (IsDocked()) { |
| 1086 // Update dev tools to reflect removed dev tools window. |
| 1087 BrowserWindow* inspected_window = GetInspectedBrowserWindow(); |
| 1088 if (inspected_window) |
| 1089 inspected_window->UpdateDevTools(); |
| 1090 // In case of docked web_contents_, we own it so delete here. |
| 1091 delete web_contents_; |
| 1092 |
| 1093 delete this; |
| 1094 } else { |
| 1095 // First, initiate self-destruct to free all the registrars. |
| 1096 // Then close all tabs. Browser will take care of deleting web_contents_ |
| 1097 // for us. |
| 1098 Browser* browser = browser_; |
| 1099 delete this; |
| 1100 browser->tab_strip_model()->CloseAllTabs(); |
1121 } | 1101 } |
1122 } | 1102 } |
1123 | 1103 |
| 1104 void DevToolsWindow::ScheduleAction(DevToolsToggleAction action) { |
| 1105 action_on_load_ = action; |
| 1106 if (is_loaded_) |
| 1107 DoAction(); |
| 1108 } |
| 1109 |
| 1110 void DevToolsWindow::DoAction() { |
| 1111 UpdateFrontendDockSide(); |
| 1112 switch (action_on_load_) { |
| 1113 case DEVTOOLS_TOGGLE_ACTION_SHOW_CONSOLE: |
| 1114 CallClientFunction("InspectorFrontendAPI.showConsole", NULL); |
| 1115 break; |
| 1116 case DEVTOOLS_TOGGLE_ACTION_INSPECT: |
| 1117 CallClientFunction("InspectorFrontendAPI.enterInspectElementMode", NULL); |
| 1118 case DEVTOOLS_TOGGLE_ACTION_SHOW: |
| 1119 case DEVTOOLS_TOGGLE_ACTION_TOGGLE: |
| 1120 // Do nothing. |
| 1121 break; |
| 1122 default: |
| 1123 NOTREACHED(); |
| 1124 } |
| 1125 action_on_load_ = DEVTOOLS_TOGGLE_ACTION_SHOW; |
| 1126 } |
| 1127 |
| 1128 void DevToolsWindow::UpdateTheme() { |
| 1129 ThemeService* tp = ThemeServiceFactory::GetForProfile(profile_); |
| 1130 CHECK(tp); |
| 1131 |
| 1132 SkColor color_toolbar = |
| 1133 tp->GetColor(ThemeProperties::COLOR_TOOLBAR); |
| 1134 SkColor color_tab_text = |
| 1135 tp->GetColor(ThemeProperties::COLOR_BOOKMARK_TEXT); |
| 1136 std::string command = base::StringPrintf( |
| 1137 "InspectorFrontendAPI.setToolbarColors(\"%s\", \"%s\")", |
| 1138 SkColorToRGBAString(color_toolbar).c_str(), |
| 1139 SkColorToRGBAString(color_tab_text).c_str()); |
| 1140 web_contents_->GetRenderViewHost()-> |
| 1141 ExecuteJavascriptInWebFrame(string16(), UTF8ToUTF16(command)); |
| 1142 } |
| 1143 |
| 1144 void DevToolsWindow::AddDevToolsExtensionsToClient() { |
| 1145 content::WebContents* inspected_web_contents = GetInspectedWebContents(); |
| 1146 if (inspected_web_contents) { |
| 1147 SessionTabHelper* session_tab_helper = |
| 1148 SessionTabHelper::FromWebContents(inspected_web_contents); |
| 1149 if (session_tab_helper) { |
| 1150 base::FundamentalValue tabId(session_tab_helper->session_id().id()); |
| 1151 CallClientFunction("WebInspector.setInspectedTabId", &tabId); |
| 1152 } |
| 1153 } |
| 1154 ListValue results; |
| 1155 Profile* profile = |
| 1156 Profile::FromBrowserContext(web_contents_->GetBrowserContext()); |
| 1157 const ExtensionService* extension_service = extensions::ExtensionSystem::Get( |
| 1158 profile->GetOriginalProfile())->extension_service(); |
| 1159 if (!extension_service) |
| 1160 return; |
| 1161 |
| 1162 const ExtensionSet* extensions = extension_service->extensions(); |
| 1163 |
| 1164 for (ExtensionSet::const_iterator extension = extensions->begin(); |
| 1165 extension != extensions->end(); ++extension) { |
| 1166 if (extensions::ManifestURL::GetDevToolsPage(extension->get()).is_empty()) |
| 1167 continue; |
| 1168 DictionaryValue* extension_info = new DictionaryValue(); |
| 1169 extension_info->Set( |
| 1170 "startPage", |
| 1171 new StringValue( |
| 1172 extensions::ManifestURL::GetDevToolsPage(extension->get()).spec())); |
| 1173 extension_info->Set("name", new StringValue((*extension)->name())); |
| 1174 bool allow_experimental = (*extension)->HasAPIPermission( |
| 1175 extensions::APIPermission::kExperimental); |
| 1176 extension_info->Set("exposeExperimentalAPIs", |
| 1177 new base::FundamentalValue(allow_experimental)); |
| 1178 results.Append(extension_info); |
| 1179 } |
| 1180 CallClientFunction("WebInspector.addExtensions", &results); |
| 1181 } |
| 1182 |
| 1183 void DevToolsWindow::CallClientFunction(const std::string& function_name, |
| 1184 const Value* arg1, |
| 1185 const Value* arg2) { |
| 1186 std::string params; |
| 1187 if (arg1) { |
| 1188 std::string json; |
| 1189 base::JSONWriter::Write(arg1, &json); |
| 1190 params.append(json); |
| 1191 if (arg2) { |
| 1192 base::JSONWriter::Write(arg2, &json); |
| 1193 params.append(", " + json); |
| 1194 } |
| 1195 } |
| 1196 string16 javascript = ASCIIToUTF16(function_name + "(" + params + ");"); |
| 1197 web_contents_->GetRenderViewHost()-> |
| 1198 ExecuteJavascriptInWebFrame(string16(), javascript); |
| 1199 } |
| 1200 |
1124 void DevToolsWindow::UpdateBrowserToolbar() { | 1201 void DevToolsWindow::UpdateBrowserToolbar() { |
1125 content::WebContents* inspected_web_contents = GetInspectedWebContents(); | 1202 content::WebContents* inspected_web_contents = GetInspectedWebContents(); |
1126 if (!inspected_web_contents) | 1203 if (!inspected_web_contents) |
1127 return; | 1204 return; |
1128 BrowserWindow* inspected_window = GetInspectedBrowserWindow(); | 1205 BrowserWindow* inspected_window = GetInspectedBrowserWindow(); |
1129 if (inspected_window) | 1206 if (inspected_window) |
1130 inspected_window->UpdateToolbar(inspected_web_contents, false); | 1207 inspected_window->UpdateToolbar(inspected_web_contents, false); |
1131 } | 1208 } |
1132 | 1209 |
1133 bool DevToolsWindow::IsDocked() { | 1210 bool DevToolsWindow::IsDocked() { |
1134 return dock_side_ != DEVTOOLS_DOCK_SIDE_UNDOCKED; | 1211 return dock_side_ != DEVTOOLS_DOCK_SIDE_UNDOCKED; |
1135 } | 1212 } |
1136 | 1213 |
1137 // static | 1214 void DevToolsWindow::Restore() { |
1138 DevToolsDockSide DevToolsWindow::GetDockSideFromPrefs(Profile* profile) { | 1215 if (dock_side_ == DEVTOOLS_DOCK_SIDE_MINIMIZED) |
1139 std::string dock_side = | 1216 SetDockSide(SideToString(dock_side_before_minimized_)); |
1140 profile->GetPrefs()->GetString(prefs::kDevToolsDockSide); | |
1141 | |
1142 // Migrate prefs | |
1143 if (dock_side == kOldPrefBottom || dock_side == kOldPrefRight) { | |
1144 bool docked = profile->GetPrefs()->GetBoolean(prefs::kDevToolsOpenDocked); | |
1145 if (dock_side == kOldPrefBottom) | |
1146 return docked ? DEVTOOLS_DOCK_SIDE_BOTTOM : DEVTOOLS_DOCK_SIDE_UNDOCKED; | |
1147 else | |
1148 return docked ? DEVTOOLS_DOCK_SIDE_RIGHT : DEVTOOLS_DOCK_SIDE_UNDOCKED; | |
1149 } | |
1150 | |
1151 if (dock_side == kPrefUndocked) | |
1152 return DEVTOOLS_DOCK_SIDE_UNDOCKED; | |
1153 else if (dock_side == kPrefRight) | |
1154 return DEVTOOLS_DOCK_SIDE_RIGHT; | |
1155 // Default to docked to bottom | |
1156 return DEVTOOLS_DOCK_SIDE_BOTTOM; | |
1157 } | 1217 } |
1158 | 1218 |
1159 // static | 1219 content::WebContents* DevToolsWindow::GetInspectedWebContents() { |
1160 std::string DevToolsWindow::SideToString(DevToolsDockSide dock_side) { | 1220 if (!inspected_contents_observer_) |
1161 std::string dock_side_string; | 1221 return NULL; |
1162 switch (dock_side) { | 1222 return inspected_contents_observer_->web_contents(); |
1163 case DEVTOOLS_DOCK_SIDE_UNDOCKED: return kDockSideUndocked; | |
1164 case DEVTOOLS_DOCK_SIDE_RIGHT: return kDockSideRight; | |
1165 case DEVTOOLS_DOCK_SIDE_BOTTOM: return kDockSideBottom; | |
1166 case DEVTOOLS_DOCK_SIDE_MINIMIZED: return kDockSideMinimized; | |
1167 } | |
1168 return kDockSideUndocked; | |
1169 } | 1223 } |
1170 | |
1171 // static | |
1172 DevToolsDockSide DevToolsWindow::SideFromString( | |
1173 const std::string& dock_side) { | |
1174 if (dock_side == kDockSideRight) | |
1175 return DEVTOOLS_DOCK_SIDE_RIGHT; | |
1176 if (dock_side == kDockSideBottom) | |
1177 return DEVTOOLS_DOCK_SIDE_BOTTOM; | |
1178 if (dock_side == kDockSideMinimized) | |
1179 return DEVTOOLS_DOCK_SIDE_MINIMIZED; | |
1180 return DEVTOOLS_DOCK_SIDE_UNDOCKED; | |
1181 } | |
OLD | NEW |