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" |
| 11 #include "base/prefs/scoped_user_pref_update.h" | 11 #include "base/prefs/scoped_user_pref_update.h" |
| 12 #include "base/time/time.h" | 12 #include "base/time/time.h" |
| 13 #include "base/values.h" | 13 #include "base/values.h" |
| 14 #include "chrome/browser/chrome_page_zoom.h" | 14 #include "chrome/browser/chrome_page_zoom.h" |
| 15 #include "chrome/browser/extensions/chrome_extension_web_contents_observer.h" | |
| 15 #include "chrome/browser/file_select_helper.h" | 16 #include "chrome/browser/file_select_helper.h" |
| 16 #include "chrome/browser/infobars/infobar_service.h" | 17 #include "chrome/browser/infobars/infobar_service.h" |
| 17 #include "chrome/browser/prefs/pref_service_syncable.h" | 18 #include "chrome/browser/prefs/pref_service_syncable.h" |
| 18 #include "chrome/browser/profiles/profile.h" | 19 #include "chrome/browser/profiles/profile.h" |
| 19 #include "chrome/browser/sessions/session_tab_helper.h" | 20 #include "chrome/browser/sessions/session_tab_helper.h" |
| 20 #include "chrome/browser/ui/browser.h" | 21 #include "chrome/browser/ui/browser.h" |
| 21 #include "chrome/browser/ui/browser_dialogs.h" | 22 #include "chrome/browser/ui/browser_dialogs.h" |
| 22 #include "chrome/browser/ui/browser_iterator.h" | 23 #include "chrome/browser/ui/browser_iterator.h" |
| 23 #include "chrome/browser/ui/browser_list.h" | 24 #include "chrome/browser/ui/browser_list.h" |
| 24 #include "chrome/browser/ui/browser_window.h" | 25 #include "chrome/browser/ui/browser_window.h" |
| (...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 486 agent_host, window->bindings_->frontend_host()); | 487 agent_host, window->bindings_->frontend_host()); |
| 487 } | 488 } |
| 488 window->ScheduleShow(DevToolsToggleAction::Show()); | 489 window->ScheduleShow(DevToolsToggleAction::Show()); |
| 489 } | 490 } |
| 490 | 491 |
| 491 // static | 492 // static |
| 492 DevToolsWindow* DevToolsWindow::ToggleDevToolsWindow( | 493 DevToolsWindow* DevToolsWindow::ToggleDevToolsWindow( |
| 493 content::RenderViewHost* inspected_rvh, | 494 content::RenderViewHost* inspected_rvh, |
| 494 bool force_open, | 495 bool force_open, |
| 495 const DevToolsToggleAction& action) { | 496 const DevToolsToggleAction& action) { |
| 497 LOG(INFO) << "Toggling devtools window"; | |
| 498 | |
| 496 scoped_refptr<DevToolsAgentHost> agent( | 499 scoped_refptr<DevToolsAgentHost> agent( |
| 497 DevToolsAgentHost::GetOrCreateFor(inspected_rvh)); | 500 DevToolsAgentHost::GetOrCreateFor(inspected_rvh)); |
| 498 content::DevToolsManager* manager = content::DevToolsManager::GetInstance(); | 501 content::DevToolsManager* manager = content::DevToolsManager::GetInstance(); |
| 499 DevToolsWindow* window = FindDevToolsWindow(agent.get()); | 502 DevToolsWindow* window = FindDevToolsWindow(agent.get()); |
| 500 bool do_open = force_open; | 503 bool do_open = force_open; |
| 501 if (!window) { | 504 if (!window) { |
| 505 LOG(INFO) << "No window"; | |
| 506 | |
| 502 Profile* profile = Profile::FromBrowserContext( | 507 Profile* profile = Profile::FromBrowserContext( |
| 503 inspected_rvh->GetProcess()->GetBrowserContext()); | 508 inspected_rvh->GetProcess()->GetBrowserContext()); |
| 504 content::RecordAction( | 509 content::RecordAction( |
| 505 base::UserMetricsAction("DevTools_InspectRenderer")); | 510 base::UserMetricsAction("DevTools_InspectRenderer")); |
| 506 window = Create(profile, GURL(), inspected_rvh, false, false, true); | 511 window = Create(profile, GURL(), inspected_rvh, false, false, true); |
| 507 manager->RegisterDevToolsClientHostFor(agent.get(), | 512 manager->RegisterDevToolsClientHostFor(agent.get(), |
| 508 window->bindings_->frontend_host()); | 513 window->bindings_->frontend_host()); |
| 509 do_open = true; | 514 do_open = true; |
| 510 } | 515 } |
| 511 | 516 |
| 517 // Attach an extensions WebContentsObserver for the devtools API. | |
| 518 content::WebContents* web_contents = | |
| 519 content::WebContents::FromRenderViewHost(inspected_rvh); | |
|
pfeldman
2014/07/10 13:44:36
I don't think inspected page contents should be in
| |
| 520 if (web_contents) { | |
| 521 LOG(INFO) << "there is no web contents"; | |
| 522 extensions::ChromeExtensionWebContentsObserver::CreateForWebContents( | |
| 523 web_contents); | |
| 524 } else { | |
| 525 LOG(INFO) << "extensions attached"; | |
| 526 } | |
| 527 | |
| 528 LOG(INFO) << "attaching to the blah blah"; | |
| 529 extensions::ChromeExtensionWebContentsObserver::CreateForWebContents( | |
| 530 window->web_contents_for_test()); | |
| 531 | |
| 512 // Update toolbar to reflect DevTools changes. | 532 // Update toolbar to reflect DevTools changes. |
| 513 window->UpdateBrowserToolbar(); | 533 window->UpdateBrowserToolbar(); |
| 514 | 534 |
| 515 // If window is docked and visible, we hide it on toggle. If window is | 535 // If window is docked and visible, we hide it on toggle. If window is |
| 516 // undocked, we show (activate) it. | 536 // undocked, we show (activate) it. |
| 517 if (!window->is_docked_ || do_open) | 537 if (!window->is_docked_ || do_open) |
| 518 window->ScheduleShow(action); | 538 window->ScheduleShow(action); |
| 519 else | 539 else |
| 520 window->CloseWindow(); | 540 window->CloseWindow(); |
| 521 | 541 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 563 Browser* inspected_browser = NULL; | 583 Browser* inspected_browser = NULL; |
| 564 int inspected_tab_index = -1; | 584 int inspected_tab_index = -1; |
| 565 FindInspectedBrowserAndTabIndex(GetInspectedWebContents(), | 585 FindInspectedBrowserAndTabIndex(GetInspectedWebContents(), |
| 566 &inspected_browser, | 586 &inspected_browser, |
| 567 &inspected_tab_index); | 587 &inspected_tab_index); |
| 568 DCHECK(inspected_browser); | 588 DCHECK(inspected_browser); |
| 569 DCHECK(inspected_tab_index != -1); | 589 DCHECK(inspected_tab_index != -1); |
| 570 | 590 |
| 571 // Tell inspected browser to update splitter and switch to inspected panel. | 591 // Tell inspected browser to update splitter and switch to inspected panel. |
| 572 BrowserWindow* inspected_window = inspected_browser->window(); | 592 BrowserWindow* inspected_window = inspected_browser->window(); |
| 573 main_web_contents_->SetDelegate(this); | 593 main_web_contents_->SetDelegate(this); |
|
dgozman
2014/07/09 20:13:36
The main difference between docked and undocked De
pfeldman
2014/07/10 13:44:36
It seems like ExtensionHostMsg_Request is dispatch
| |
| 574 | 594 |
| 575 TabStripModel* tab_strip_model = inspected_browser->tab_strip_model(); | 595 TabStripModel* tab_strip_model = inspected_browser->tab_strip_model(); |
| 576 tab_strip_model->ActivateTabAt(inspected_tab_index, true); | 596 tab_strip_model->ActivateTabAt(inspected_tab_index, true); |
| 577 | 597 |
| 578 inspected_window->UpdateDevTools(); | 598 inspected_window->UpdateDevTools(); |
| 579 main_web_contents_->SetInitialFocus(); | 599 main_web_contents_->SetInitialFocus(); |
| 580 inspected_window->Show(); | 600 inspected_window->Show(); |
| 581 // On Aura, focusing once is not enough. Do it again. | 601 // On Aura, focusing once is not enough. Do it again. |
| 582 // Note that focusing only here but not before isn't enough either. We just | 602 // Note that focusing only here but not before isn't enough either. We just |
| 583 // need to focus twice. | 603 // need to focus twice. |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 701 main_web_contents_->SetDelegate(this); | 721 main_web_contents_->SetDelegate(this); |
| 702 bindings_ = new DevToolsUIBindings( | 722 bindings_ = new DevToolsUIBindings( |
| 703 main_web_contents_, | 723 main_web_contents_, |
| 704 DevToolsUIBindings::ApplyThemeToURL(profile, url)); | 724 DevToolsUIBindings::ApplyThemeToURL(profile, url)); |
| 705 // Bindings take ownership over devtools as its delegate. | 725 // Bindings take ownership over devtools as its delegate. |
| 706 bindings_->SetDelegate(this); | 726 bindings_->SetDelegate(this); |
| 707 | 727 |
| 708 g_instances.Get().push_back(this); | 728 g_instances.Get().push_back(this); |
| 709 | 729 |
| 710 // There is no inspected_rvh in case of shared workers. | 730 // There is no inspected_rvh in case of shared workers. |
| 711 if (inspected_rvh) | 731 if (inspected_rvh) { |
| 712 inspected_contents_observer_.reset(new ObserverWithAccessor( | 732 inspected_contents_observer_.reset(new ObserverWithAccessor( |
| 713 content::WebContents::FromRenderViewHost(inspected_rvh))); | 733 content::WebContents::FromRenderViewHost(inspected_rvh))); |
| 734 } | |
| 714 event_forwarder_.reset(new DevToolsEventForwarder(this)); | 735 event_forwarder_.reset(new DevToolsEventForwarder(this)); |
| 736 LOG(INFO) << "Creating function dispatcher for devtools window"; | |
| 737 extension_dispatcher_.reset( | |
| 738 new extensions::ExtensionFunctionDispatcher(profile, this)); | |
| 715 } | 739 } |
| 716 | 740 |
| 717 // static | 741 // static |
| 718 DevToolsWindow* DevToolsWindow::Create( | 742 DevToolsWindow* DevToolsWindow::Create( |
| 719 Profile* profile, | 743 Profile* profile, |
| 720 const GURL& frontend_url, | 744 const GURL& frontend_url, |
| 721 content::RenderViewHost* inspected_rvh, | 745 content::RenderViewHost* inspected_rvh, |
| 722 bool shared_worker_frontend, | 746 bool shared_worker_frontend, |
| 723 bool external_frontend, | 747 bool external_frontend, |
| 724 bool can_dock) { | 748 bool can_dock) { |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 817 manager->ClientHostClosing(bindings_->frontend_host()); | 841 manager->ClientHostClosing(bindings_->frontend_host()); |
| 818 manager->RegisterDevToolsClientHostFor(agent_host.get(), | 842 manager->RegisterDevToolsClientHostFor(agent_host.get(), |
| 819 bindings_->frontend_host()); | 843 bindings_->frontend_host()); |
| 820 | 844 |
| 821 content::NavigationController::LoadURLParams load_url_params(params.url); | 845 content::NavigationController::LoadURLParams load_url_params(params.url); |
| 822 main_web_contents_->GetController().LoadURLWithParams(load_url_params); | 846 main_web_contents_->GetController().LoadURLWithParams(load_url_params); |
| 823 return main_web_contents_; | 847 return main_web_contents_; |
| 824 } | 848 } |
| 825 | 849 |
| 826 void DevToolsWindow::ActivateContents(WebContents* contents) { | 850 void DevToolsWindow::ActivateContents(WebContents* contents) { |
| 851 LOG(INFO) << "web contents activated"; | |
| 852 extensions::ChromeExtensionWebContentsObserver::CreateForWebContents( | |
|
pfeldman
2014/07/10 13:44:36
I don't think you want to do this here. Wiring the
| |
| 853 contents); | |
| 854 | |
| 827 if (is_docked_) { | 855 if (is_docked_) { |
| 828 WebContents* inspected_tab = GetInspectedWebContents(); | 856 WebContents* inspected_tab = GetInspectedWebContents(); |
| 829 inspected_tab->GetDelegate()->ActivateContents(inspected_tab); | 857 inspected_tab->GetDelegate()->ActivateContents(inspected_tab); |
| 830 } else { | 858 } else { |
| 831 browser_->window()->Activate(); | 859 browser_->window()->Activate(); |
| 832 } | 860 } |
| 833 } | 861 } |
| 834 | 862 |
| 835 void DevToolsWindow::AddNewContents(WebContents* source, | 863 void DevToolsWindow::AddNewContents(WebContents* source, |
| 836 WebContents* new_contents, | 864 WebContents* new_contents, |
| 837 WindowOpenDisposition disposition, | 865 WindowOpenDisposition disposition, |
| 838 const gfx::Rect& initial_pos, | 866 const gfx::Rect& initial_pos, |
| 839 bool user_gesture, | 867 bool user_gesture, |
| 840 bool* was_blocked) { | 868 bool* was_blocked) { |
| 869 LOG(INFO) << "web contents added"; | |
| 870 extensions::ChromeExtensionWebContentsObserver::CreateForWebContents( | |
|
pfeldman
2014/07/10 13:44:36
ditto.
| |
| 871 new_contents); | |
| 872 | |
| 841 if (new_contents == toolbox_web_contents_) { | 873 if (new_contents == toolbox_web_contents_) { |
| 842 toolbox_web_contents_->SetDelegate( | 874 toolbox_web_contents_->SetDelegate( |
| 843 new DevToolsToolboxDelegate(toolbox_web_contents_, | 875 new DevToolsToolboxDelegate(toolbox_web_contents_, |
| 844 inspected_contents_observer_.get())); | 876 inspected_contents_observer_.get())); |
| 845 gfx::Size size = main_web_contents_->GetViewBounds().size(); | 877 gfx::Size size = main_web_contents_->GetViewBounds().size(); |
| 846 if (toolbox_web_contents_->GetRenderWidgetHostView()) | 878 if (toolbox_web_contents_->GetRenderWidgetHostView()) |
| 847 toolbox_web_contents_->GetRenderWidgetHostView()->SetSize(size); | 879 toolbox_web_contents_->GetRenderWidgetHostView()->SetSize(size); |
| 848 UpdateBrowserWindow(); | 880 UpdateBrowserWindow(); |
| 849 return; | 881 return; |
| 850 } | 882 } |
| 851 | 883 |
| 852 WebContents* inspected_web_contents = GetInspectedWebContents(); | 884 WebContents* inspected_web_contents = GetInspectedWebContents(); |
| 853 if (inspected_web_contents) { | 885 if (inspected_web_contents) { |
| 854 inspected_web_contents->GetDelegate()->AddNewContents( | 886 inspected_web_contents->GetDelegate()->AddNewContents( |
| 855 source, new_contents, disposition, initial_pos, user_gesture, | 887 source, new_contents, disposition, initial_pos, user_gesture, |
| 856 was_blocked); | 888 was_blocked); |
| 857 } | 889 } |
| 858 } | 890 } |
| 859 | 891 |
| 860 void DevToolsWindow::WebContentsCreated(WebContents* source_contents, | 892 void DevToolsWindow::WebContentsCreated(WebContents* source_contents, |
| 861 int opener_render_frame_id, | 893 int opener_render_frame_id, |
| 862 const base::string16& frame_name, | 894 const base::string16& frame_name, |
| 863 const GURL& target_url, | 895 const GURL& target_url, |
| 864 WebContents* new_contents) { | 896 WebContents* new_contents) { |
| 897 LOG(INFO) << "web contents created on " << target_url; | |
|
pfeldman
2014/07/10 13:44:35
ditto.
| |
| 898 extensions::ChromeExtensionWebContentsObserver::CreateForWebContents( | |
| 899 new_contents); | |
| 900 | |
| 865 if (target_url.SchemeIs(content::kChromeDevToolsScheme) && | 901 if (target_url.SchemeIs(content::kChromeDevToolsScheme) && |
| 866 target_url.query().find("toolbox=true") != std::string::npos) { | 902 target_url.query().find("toolbox=true") != std::string::npos) { |
| 867 CHECK(can_dock_); | 903 CHECK(can_dock_); |
| 868 toolbox_web_contents_ = new_contents; | 904 toolbox_web_contents_ = new_contents; |
| 869 } | 905 } |
| 870 } | 906 } |
| 871 | 907 |
| 872 void DevToolsWindow::CloseContents(WebContents* source) { | 908 void DevToolsWindow::CloseContents(WebContents* source) { |
| 873 CHECK(is_docked_); | 909 CHECK(is_docked_); |
| 874 // Do this first so that when GetDockedInstanceForInspectedTab is called | 910 // Do this first so that when GetDockedInstanceForInspectedTab is called |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1132 } | 1168 } |
| 1133 | 1169 |
| 1134 void DevToolsWindow::RenderProcessGone() { | 1170 void DevToolsWindow::RenderProcessGone() { |
| 1135 // Docked DevToolsWindow owns its main_web_contents_ and must delete it. | 1171 // Docked DevToolsWindow owns its main_web_contents_ and must delete it. |
| 1136 // Undocked main_web_contents_ are owned and handled by browser. | 1172 // Undocked main_web_contents_ are owned and handled by browser. |
| 1137 // see crbug.com/369932 | 1173 // see crbug.com/369932 |
| 1138 if (is_docked_) | 1174 if (is_docked_) |
| 1139 CloseContents(main_web_contents_); | 1175 CloseContents(main_web_contents_); |
| 1140 } | 1176 } |
| 1141 | 1177 |
| 1178 extensions::WindowController* DevToolsWindow::GetExtensionWindowController() | |
| 1179 const { | |
| 1180 return NULL; | |
| 1181 } | |
| 1182 | |
| 1183 content::WebContents* DevToolsWindow::GetAssociatedWebContents() const { | |
| 1184 return main_web_contents_; | |
| 1185 } | |
| 1186 | |
| 1187 content::WebContents* DevToolsWindow::GetVisibleWebContents() const { | |
| 1188 return main_web_contents_; | |
| 1189 } | |
| 1190 | |
| 1142 void DevToolsWindow::OnLoadCompleted() { | 1191 void DevToolsWindow::OnLoadCompleted() { |
| 1143 // First seed inspected tab id for extension APIs. | 1192 // First seed inspected tab id for extension APIs. |
| 1144 WebContents* inspected_web_contents = GetInspectedWebContents(); | 1193 WebContents* inspected_web_contents = GetInspectedWebContents(); |
| 1145 if (inspected_web_contents) { | 1194 if (inspected_web_contents) { |
| 1146 SessionTabHelper* session_tab_helper = | 1195 SessionTabHelper* session_tab_helper = |
| 1147 SessionTabHelper::FromWebContents(inspected_web_contents); | 1196 SessionTabHelper::FromWebContents(inspected_web_contents); |
| 1148 if (session_tab_helper) { | 1197 if (session_tab_helper) { |
| 1149 base::FundamentalValue tabId(session_tab_helper->session_id().id()); | 1198 base::FundamentalValue tabId(session_tab_helper->session_id().id()); |
| 1150 bindings_->CallClientFunction("WebInspector.setInspectedTabId", | 1199 bindings_->CallClientFunction("WebInspector.setInspectedTabId", |
| 1151 &tabId, NULL, NULL); | 1200 &tabId, NULL, NULL); |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1262 closure.Run(); | 1311 closure.Run(); |
| 1263 return; | 1312 return; |
| 1264 } | 1313 } |
| 1265 load_completed_callback_ = closure; | 1314 load_completed_callback_ = closure; |
| 1266 } | 1315 } |
| 1267 | 1316 |
| 1268 bool DevToolsWindow::ForwardKeyboardEvent( | 1317 bool DevToolsWindow::ForwardKeyboardEvent( |
| 1269 const content::NativeWebKeyboardEvent& event) { | 1318 const content::NativeWebKeyboardEvent& event) { |
| 1270 return event_forwarder_->ForwardEvent(event); | 1319 return event_forwarder_->ForwardEvent(event); |
| 1271 } | 1320 } |
| OLD | NEW |