Chromium Code Reviews| 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/json/json_reader.h" | 9 #include "base/json/json_reader.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 165 inspected_contents_observer_->web_contents(); | 165 inspected_contents_observer_->web_contents(); |
| 166 if (!inspected_contents) | 166 if (!inspected_contents) |
| 167 return NULL; | 167 return NULL; |
| 168 Browser* browser = NULL; | 168 Browser* browser = NULL; |
| 169 int tab = 0; | 169 int tab = 0; |
| 170 if (FindInspectedBrowserAndTabIndex(inspected_contents, &browser, &tab)) | 170 if (FindInspectedBrowserAndTabIndex(inspected_contents, &browser, &tab)) |
| 171 return browser->window(); | 171 return browser->window(); |
| 172 return NULL; | 172 return NULL; |
| 173 } | 173 } |
| 174 | 174 |
| 175 bool AreDeveloperToolsDisabled( | |
| 176 const WebContents* const inspected_web_contents) { | |
| 177 Profile* profile = | |
| 178 Profile::FromBrowserContext(inspected_web_contents->GetBrowserContext()); | |
| 179 return profile->GetPrefs()->GetBoolean(prefs::kDevToolsDisabled); | |
| 180 } | |
| 181 | |
| 175 } // namespace | 182 } // namespace |
| 176 | 183 |
| 177 // DevToolsEventForwarder ----------------------------------------------------- | 184 // DevToolsEventForwarder ----------------------------------------------------- |
| 178 | 185 |
| 179 class DevToolsEventForwarder { | 186 class DevToolsEventForwarder { |
| 180 public: | 187 public: |
| 181 explicit DevToolsEventForwarder(DevToolsWindow* window) | 188 explicit DevToolsEventForwarder(DevToolsWindow* window) |
| 182 : devtools_window_(window) {} | 189 : devtools_window_(window) {} |
| 183 | 190 |
| 184 // Registers whitelisted shortcuts with the forwarder. | 191 // Registers whitelisted shortcuts with the forwarder. |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 395 if (!window) { | 402 if (!window) { |
| 396 window = DevToolsWindow::CreateDevToolsWindowForWorker(profile); | 403 window = DevToolsWindow::CreateDevToolsWindowForWorker(profile); |
| 397 DCHECK(window); | 404 DCHECK(window); |
| 398 window->bindings_->AttachTo(worker_agent); | 405 window->bindings_->AttachTo(worker_agent); |
| 399 } | 406 } |
| 400 window->ScheduleShow(DevToolsToggleAction::Show()); | 407 window->ScheduleShow(DevToolsToggleAction::Show()); |
| 401 return window; | 408 return window; |
| 402 } | 409 } |
| 403 | 410 |
| 404 // static | 411 // static |
| 405 DevToolsWindow* DevToolsWindow::CreateDevToolsWindowForWorker( | 412 DevToolsWindow* DevToolsWindow::CreateDevToolsWindowForWorker( |
|
dgozman
2015/03/10 05:43:23
This one should check for policy as well.
| |
| 406 Profile* profile) { | 413 Profile* profile) { |
| 407 content::RecordAction(base::UserMetricsAction("DevTools_InspectWorker")); | 414 content::RecordAction(base::UserMetricsAction("DevTools_InspectWorker")); |
| 408 return Create(profile, GURL(), NULL, true, std::string(), false, ""); | 415 return Create(profile, GURL(), NULL, true, std::string(), false, ""); |
| 409 } | 416 } |
| 410 | 417 |
| 411 // static | 418 // static |
| 412 DevToolsWindow* DevToolsWindow::OpenDevToolsWindow( | 419 void DevToolsWindow::OpenDevToolsWindow( |
| 413 content::WebContents* inspected_web_contents) { | 420 content::WebContents* inspected_web_contents) { |
| 414 return ToggleDevToolsWindow( | 421 DevToolsWindow::OpenDevToolsWindow(inspected_web_contents, |
| 415 inspected_web_contents, true, DevToolsToggleAction::Show(), ""); | 422 DevToolsToggleAction::Show()); |
| 416 } | 423 } |
| 417 | 424 |
| 418 // static | 425 // static |
| 419 DevToolsWindow* DevToolsWindow::OpenDevToolsWindow( | 426 void DevToolsWindow::OpenDevToolsWindow( |
| 420 content::WebContents* inspected_web_contents, | 427 content::WebContents* inspected_web_contents, |
| 421 const DevToolsToggleAction& action) { | 428 const DevToolsToggleAction& action) { |
| 422 return ToggleDevToolsWindow(inspected_web_contents, true, action, ""); | 429 ToggleDevToolsWindow(inspected_web_contents, true, action, ""); |
| 423 } | 430 } |
| 424 | 431 |
| 425 // static | 432 // static |
| 426 DevToolsWindow* DevToolsWindow::ToggleDevToolsWindow( | 433 void DevToolsWindow::ToggleDevToolsWindow( |
| 427 Browser* browser, | 434 Browser* browser, |
| 428 const DevToolsToggleAction& action) { | 435 const DevToolsToggleAction& action) { |
| 429 if (action.type() == DevToolsToggleAction::kToggle && | 436 if (action.type() == DevToolsToggleAction::kToggle && |
| 430 browser->is_devtools()) { | 437 browser->is_devtools()) { |
| 431 browser->tab_strip_model()->CloseAllTabs(); | 438 browser->tab_strip_model()->CloseAllTabs(); |
| 432 return NULL; | 439 return; |
| 433 } | 440 } |
| 434 | 441 |
| 435 return ToggleDevToolsWindow( | 442 ToggleDevToolsWindow( |
| 436 browser->tab_strip_model()->GetActiveWebContents(), | 443 browser->tab_strip_model()->GetActiveWebContents(), |
| 437 action.type() == DevToolsToggleAction::kInspect, | 444 action.type() == DevToolsToggleAction::kInspect, |
| 438 action, ""); | 445 action, ""); |
| 439 } | 446 } |
| 440 | 447 |
| 441 // static | 448 // static |
| 442 void DevToolsWindow::OpenExternalFrontend( | 449 void DevToolsWindow::OpenExternalFrontend( |
| 443 Profile* profile, | 450 Profile* profile, |
| 444 const std::string& frontend_url, | 451 const std::string& frontend_url, |
| 445 const scoped_refptr<content::DevToolsAgentHost>& agent_host, | 452 const scoped_refptr<content::DevToolsAgentHost>& agent_host, |
| 446 bool isWorker) { | 453 bool isWorker) { |
| 447 DevToolsWindow* window = FindDevToolsWindow(agent_host.get()); | 454 DevToolsWindow* window = FindDevToolsWindow(agent_host.get()); |
| 448 if (!window) { | 455 if (!window) { |
| 449 window = Create(profile, GURL(), nullptr, isWorker, | 456 window = Create(profile, GURL(), nullptr, isWorker, |
|
dgozman
2015/03/10 05:43:24
This one should check for policy as well. We shoul
| |
| 450 DevToolsUI::GetProxyURL(frontend_url).spec(), false, std::string()); | 457 DevToolsUI::GetProxyURL(frontend_url).spec(), false, std::string()); |
| 451 if (window) | 458 if (window) |
| 452 window->bindings_->AttachTo(agent_host); | 459 window->bindings_->AttachTo(agent_host); |
| 453 } | 460 } |
| 454 if (window) | 461 if (window) |
| 455 window->ScheduleShow(DevToolsToggleAction::Show()); | 462 window->ScheduleShow(DevToolsToggleAction::Show()); |
| 456 } | 463 } |
| 457 | 464 |
| 458 // static | 465 // static |
| 459 DevToolsWindow* DevToolsWindow::ToggleDevToolsWindow( | 466 void DevToolsWindow::ToggleDevToolsWindow( |
| 460 content::WebContents* inspected_web_contents, | 467 content::WebContents* inspected_web_contents, |
| 461 bool force_open, | 468 bool force_open, |
| 462 const DevToolsToggleAction& action, | 469 const DevToolsToggleAction& action, |
| 463 const std::string& settings) { | 470 const std::string& settings) { |
| 471 // If development tools disabled by policy don't open the window. | |
| 472 if (AreDeveloperToolsDisabled(inspected_web_contents)) | |
| 473 return; | |
| 474 | |
| 464 scoped_refptr<DevToolsAgentHost> agent( | 475 scoped_refptr<DevToolsAgentHost> agent( |
| 465 DevToolsAgentHost::GetOrCreateFor(inspected_web_contents)); | 476 DevToolsAgentHost::GetOrCreateFor(inspected_web_contents)); |
| 466 DevToolsWindow* window = FindDevToolsWindow(agent.get()); | 477 DevToolsWindow* window = FindDevToolsWindow(agent.get()); |
| 467 bool do_open = force_open; | 478 bool do_open = force_open; |
| 468 if (!window) { | 479 if (!window) { |
| 469 Profile* profile = Profile::FromBrowserContext( | 480 Profile* profile = Profile::FromBrowserContext( |
| 470 inspected_web_contents->GetBrowserContext()); | 481 inspected_web_contents->GetBrowserContext()); |
| 471 content::RecordAction( | 482 content::RecordAction( |
| 472 base::UserMetricsAction("DevTools_InspectRenderer")); | 483 base::UserMetricsAction("DevTools_InspectRenderer")); |
| 473 window = Create(profile, GURL(), inspected_web_contents, | 484 window = Create(profile, GURL(), inspected_web_contents, |
| 474 false, std::string(), true, settings); | 485 false, std::string(), true, settings); |
| 475 DCHECK(window); | 486 DCHECK(window); |
| 476 window->bindings_->AttachTo(agent.get()); | 487 window->bindings_->AttachTo(agent.get()); |
| 477 do_open = true; | 488 do_open = true; |
| 478 } | 489 } |
| 479 | 490 |
| 480 // Update toolbar to reflect DevTools changes. | 491 // Update toolbar to reflect DevTools changes. |
| 481 window->UpdateBrowserToolbar(); | 492 window->UpdateBrowserToolbar(); |
| 482 | 493 |
| 483 // If window is docked and visible, we hide it on toggle. If window is | 494 // If window is docked and visible, we hide it on toggle. If window is |
| 484 // undocked, we show (activate) it. | 495 // undocked, we show (activate) it. |
| 485 if (!window->is_docked_ || do_open) | 496 if (!window->is_docked_ || do_open) |
| 486 window->ScheduleShow(action); | 497 window->ScheduleShow(action); |
| 487 else | 498 else |
| 488 window->CloseWindow(); | 499 window->CloseWindow(); |
| 489 | |
| 490 return window; | |
| 491 } | 500 } |
| 492 | 501 |
| 493 // static | 502 // static |
| 494 void DevToolsWindow::InspectElement( | 503 void DevToolsWindow::InspectElement( |
| 495 content::WebContents* inspected_web_contents, | 504 content::WebContents* inspected_web_contents, |
| 496 int x, | 505 int x, |
| 497 int y) { | 506 int y) { |
| 498 scoped_refptr<DevToolsAgentHost> agent( | 507 scoped_refptr<DevToolsAgentHost> agent( |
| 499 DevToolsAgentHost::GetOrCreateFor(inspected_web_contents)); | 508 DevToolsAgentHost::GetOrCreateFor(inspected_web_contents)); |
| 500 agent->InspectElement(x, y); | 509 agent->InspectElement(x, y); |
| 501 bool should_measure_time = FindDevToolsWindow(agent.get()) == NULL; | 510 bool should_measure_time = FindDevToolsWindow(agent.get()) == NULL; |
| 502 base::TimeTicks start_time = base::TimeTicks::Now(); | 511 base::TimeTicks start_time = base::TimeTicks::Now(); |
| 503 // TODO(loislo): we should initiate DevTools window opening from within | 512 // TODO(loislo): we should initiate DevTools window opening from within |
| 504 // renderer. Otherwise, we still can hit a race condition here. | 513 // renderer. Otherwise, we still can hit a race condition here. |
| 505 DevToolsWindow* window = OpenDevToolsWindow(inspected_web_contents); | 514 OpenDevToolsWindow(inspected_web_contents); |
| 506 if (should_measure_time) | 515 |
| 516 DevToolsWindow* window = FindDevToolsWindow(agent.get()); | |
| 517 if (should_measure_time && window) | |
| 507 window->inspect_element_start_time_ = start_time; | 518 window->inspect_element_start_time_ = start_time; |
| 508 } | 519 } |
| 509 | 520 |
| 510 void DevToolsWindow::ScheduleShow(const DevToolsToggleAction& action) { | 521 void DevToolsWindow::ScheduleShow(const DevToolsToggleAction& action) { |
| 511 if (life_stage_ == kLoadCompleted) { | 522 if (life_stage_ == kLoadCompleted) { |
| 512 Show(action); | 523 Show(action); |
| 513 return; | 524 return; |
| 514 } | 525 } |
| 515 | 526 |
| 516 // Action will be done only after load completed. | 527 // Action will be done only after load completed. |
| (...skipping 686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1203 closure.Run(); | 1214 closure.Run(); |
| 1204 return; | 1215 return; |
| 1205 } | 1216 } |
| 1206 load_completed_callback_ = closure; | 1217 load_completed_callback_ = closure; |
| 1207 } | 1218 } |
| 1208 | 1219 |
| 1209 bool DevToolsWindow::ForwardKeyboardEvent( | 1220 bool DevToolsWindow::ForwardKeyboardEvent( |
| 1210 const content::NativeWebKeyboardEvent& event) { | 1221 const content::NativeWebKeyboardEvent& event) { |
| 1211 return event_forwarder_->ForwardEvent(event); | 1222 return event_forwarder_->ForwardEvent(event); |
| 1212 } | 1223 } |
| OLD | NEW |