OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <algorithm> | 5 #include <algorithm> |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/json/json_writer.h" | 8 #include "base/json/json_writer.h" |
9 #include "base/lazy_instance.h" | |
10 #include "base/stringprintf.h" | 9 #include "base/stringprintf.h" |
11 #include "base/string_number_conversions.h" | 10 #include "base/string_number_conversions.h" |
12 #include "base/utf_string_conversions.h" | 11 #include "base/utf_string_conversions.h" |
13 #include "base/values.h" | 12 #include "base/values.h" |
14 #include "chrome/browser/browser_process.h" | 13 #include "chrome/browser/browser_process.h" |
15 #include "chrome/browser/debugger/devtools_file_util.h" | 14 #include "chrome/browser/debugger/devtools_file_util.h" |
16 #include "chrome/browser/debugger/devtools_window.h" | 15 #include "chrome/browser/debugger/devtools_window.h" |
17 #include "chrome/browser/extensions/extension_service.h" | 16 #include "chrome/browser/extensions/extension_service.h" |
18 #include "chrome/browser/prefs/pref_service.h" | 17 #include "chrome/browser/prefs/pref_service.h" |
19 #include "chrome/browser/prefs/scoped_user_pref_update.h" | 18 #include "chrome/browser/prefs/scoped_user_pref_update.h" |
(...skipping 18 matching lines...) Expand all Loading... |
38 #include "content/browser/tab_contents/navigation_controller.h" | 37 #include "content/browser/tab_contents/navigation_controller.h" |
39 #include "content/browser/tab_contents/navigation_entry.h" | 38 #include "content/browser/tab_contents/navigation_entry.h" |
40 #include "content/browser/tab_contents/tab_contents.h" | 39 #include "content/browser/tab_contents/tab_contents.h" |
41 #include "content/browser/tab_contents/tab_contents_view.h" | 40 #include "content/browser/tab_contents/tab_contents_view.h" |
42 #include "content/common/devtools_messages.h" | 41 #include "content/common/devtools_messages.h" |
43 #include "content/public/browser/content_browser_client.h" | 42 #include "content/public/browser/content_browser_client.h" |
44 #include "content/public/browser/notification_source.h" | 43 #include "content/public/browser/notification_source.h" |
45 #include "content/public/common/bindings_policy.h" | 44 #include "content/public/common/bindings_policy.h" |
46 #include "grit/generated_resources.h" | 45 #include "grit/generated_resources.h" |
47 | 46 |
48 typedef std::vector<DevToolsWindow*> DevToolsWindowList; | |
49 namespace { | |
50 base::LazyInstance<DevToolsWindowList, | |
51 base::LeakyLazyInstanceTraits<DevToolsWindowList> > | |
52 g_instances = LAZY_INSTANCE_INITIALIZER; | |
53 } // namespace | |
54 | |
55 const char DevToolsWindow::kDevToolsApp[] = "DevToolsApp"; | 47 const char DevToolsWindow::kDevToolsApp[] = "DevToolsApp"; |
56 | 48 |
57 // static | 49 // static |
58 void DevToolsWindow::RegisterUserPrefs(PrefService* prefs) { | 50 void DevToolsWindow::RegisterUserPrefs(PrefService* prefs) { |
59 prefs->RegisterBooleanPref(prefs::kDevToolsOpenDocked, | 51 prefs->RegisterBooleanPref(prefs::kDevToolsOpenDocked, |
60 true, | 52 true, |
61 PrefService::UNSYNCABLE_PREF); | 53 PrefService::UNSYNCABLE_PREF); |
62 } | 54 } |
63 | 55 |
64 // static | 56 // static |
65 TabContentsWrapper* DevToolsWindow::GetDevToolsContents( | 57 TabContentsWrapper* DevToolsWindow::GetDevToolsContents( |
66 TabContents* inspected_tab) { | 58 TabContents* inspected_tab) { |
67 if (!inspected_tab) | 59 if (!inspected_tab) |
68 return NULL; | 60 return NULL; |
69 | 61 |
70 DevToolsManager* manager = DevToolsManager::GetInstance(); | 62 DevToolsManager* manager = DevToolsManager::GetInstance(); |
| 63 if (!manager) |
| 64 return NULL; // Happens only in tests. |
| 65 |
71 DevToolsClientHost* client_host = manager-> | 66 DevToolsClientHost* client_host = manager-> |
72 GetDevToolsClientHostFor(inspected_tab->render_view_host()); | 67 GetDevToolsClientHostFor(inspected_tab->render_view_host()); |
73 DevToolsWindow* window = AsDevToolsWindow(client_host); | 68 DevToolsWindow* window = AsDevToolsWindow(client_host); |
74 if (!window || !window->is_docked()) | 69 if (!window || !window->is_docked()) |
75 return NULL; | 70 return NULL; |
76 return window->tab_contents(); | 71 return window->tab_contents(); |
77 } | 72 } |
78 | 73 |
79 // static | 74 // static |
| 75 DevToolsWindow* DevToolsWindow::FindDevToolsWindow( |
| 76 RenderViewHost* window_rvh) { |
| 77 DevToolsClientHost* client_host = |
| 78 DevToolsClientHost::FindOwnerClientHost(window_rvh); |
| 79 return client_host != NULL ? DevToolsWindow::AsDevToolsWindow(client_host) |
| 80 : NULL; |
| 81 } |
| 82 |
| 83 // static |
80 DevToolsWindow* DevToolsWindow::OpenDevToolsWindowForWorker( | 84 DevToolsWindow* DevToolsWindow::OpenDevToolsWindowForWorker( |
81 Profile* profile, | 85 Profile* profile, |
82 DevToolsAgentHost* worker_agent) { | 86 DevToolsAgentHost* worker_agent) { |
83 DevToolsWindow* window; | 87 DevToolsWindow* window; |
84 DevToolsClientHost* client = | 88 DevToolsClientHost* client = |
85 DevToolsManager::GetInstance()->GetDevToolsClientHostFor(worker_agent); | 89 DevToolsManager::GetInstance()->GetDevToolsClientHostFor(worker_agent); |
86 if (client) { | 90 if (client) { |
87 window = AsDevToolsWindow(client); | 91 window = AsDevToolsWindow(client); |
88 if (!window) | 92 if (!window) |
89 return NULL; | 93 return NULL; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 RenderViewHost* inspected_rvh, | 156 RenderViewHost* inspected_rvh, |
153 bool docked) | 157 bool docked) |
154 : RenderViewHostObserver(tab_contents->render_view_host()), | 158 : RenderViewHostObserver(tab_contents->render_view_host()), |
155 profile_(profile), | 159 profile_(profile), |
156 inspected_tab_(NULL), | 160 inspected_tab_(NULL), |
157 tab_contents_(tab_contents), | 161 tab_contents_(tab_contents), |
158 browser_(NULL), | 162 browser_(NULL), |
159 docked_(docked), | 163 docked_(docked), |
160 is_loaded_(false), | 164 is_loaded_(false), |
161 action_on_load_(DEVTOOLS_TOGGLE_ACTION_NONE) { | 165 action_on_load_(DEVTOOLS_TOGGLE_ACTION_NONE) { |
162 g_instances.Get().push_back(this); | |
163 // Wipe out page icon so that the default application icon is used. | 166 // Wipe out page icon so that the default application icon is used. |
164 NavigationEntry* entry = tab_contents_->controller().GetActiveEntry(); | 167 NavigationEntry* entry = tab_contents_->controller().GetActiveEntry(); |
165 entry->favicon().set_bitmap(SkBitmap()); | 168 entry->favicon().set_bitmap(SkBitmap()); |
166 entry->favicon().set_is_valid(true); | 169 entry->favicon().set_is_valid(true); |
167 | 170 |
168 // Register on-load actions. | 171 // Register on-load actions. |
169 registrar_.Add( | 172 registrar_.Add( |
170 this, | 173 this, |
171 content::NOTIFICATION_LOAD_STOP, | 174 content::NOTIFICATION_LOAD_STOP, |
172 content::Source<NavigationController>(&tab_contents_->controller())); | 175 content::Source<NavigationController>(&tab_contents_->controller())); |
173 registrar_.Add( | 176 registrar_.Add( |
174 this, | 177 this, |
175 content::NOTIFICATION_TAB_CLOSING, | 178 content::NOTIFICATION_TAB_CLOSING, |
176 content::Source<NavigationController>(&tab_contents_->controller())); | 179 content::Source<NavigationController>(&tab_contents_->controller())); |
177 registrar_.Add( | 180 registrar_.Add( |
178 this, | 181 this, |
179 chrome::NOTIFICATION_BROWSER_THEME_CHANGED, | 182 chrome::NOTIFICATION_BROWSER_THEME_CHANGED, |
180 content::Source<ThemeService>( | 183 content::Source<ThemeService>( |
181 ThemeServiceFactory::GetForProfile(profile_))); | 184 ThemeServiceFactory::GetForProfile(profile_))); |
182 // There is no inspected_rvh in case of shared workers. | 185 // There is no inspected_rvh in case of shared workers. |
183 if (inspected_rvh) { | 186 if (inspected_rvh) { |
184 TabContents* tab = inspected_rvh->delegate()->GetAsTabContents(); | 187 TabContents* tab = inspected_rvh->delegate()->GetAsTabContents(); |
185 if (tab) | 188 if (tab) |
186 inspected_tab_ = TabContentsWrapper::GetCurrentWrapperForContents(tab); | 189 inspected_tab_ = TabContentsWrapper::GetCurrentWrapperForContents(tab); |
187 } | 190 } |
188 } | 191 } |
189 | 192 |
190 DevToolsWindow::~DevToolsWindow() { | 193 DevToolsWindow::~DevToolsWindow() { |
191 DevToolsWindowList& instances = g_instances.Get(); | |
192 DevToolsWindowList::iterator it = std::find(instances.begin(), | |
193 instances.end(), | |
194 this); | |
195 DCHECK(it != instances.end()); | |
196 instances.erase(it); | |
197 } | 194 } |
198 | 195 |
199 void DevToolsWindow::SendMessageToClient(const IPC::Message& message) { | 196 void DevToolsWindow::SendMessageToClient(const IPC::Message& message) { |
200 RenderViewHost* target_host = tab_contents_->render_view_host(); | 197 RenderViewHost* target_host = tab_contents_->render_view_host(); |
201 IPC::Message* m = new IPC::Message(message); | 198 IPC::Message* m = new IPC::Message(message); |
202 m->set_routing_id(target_host->routing_id()); | 199 m->set_routing_id(target_host->routing_id()); |
203 target_host->Send(m); | 200 target_host->Send(m); |
204 } | 201 } |
205 | 202 |
206 void DevToolsWindow::InspectedTabClosing() { | 203 void DevToolsWindow::InspectedTabClosing() { |
(...skipping 20 matching lines...) Expand all Loading... |
227 void DevToolsWindow::TabReplaced(TabContents* new_tab) { | 224 void DevToolsWindow::TabReplaced(TabContents* new_tab) { |
228 TabContentsWrapper* new_tab_wrapper = | 225 TabContentsWrapper* new_tab_wrapper = |
229 TabContentsWrapper::GetCurrentWrapperForContents(new_tab); | 226 TabContentsWrapper::GetCurrentWrapperForContents(new_tab); |
230 DCHECK(new_tab_wrapper); | 227 DCHECK(new_tab_wrapper); |
231 if (!new_tab_wrapper) | 228 if (!new_tab_wrapper) |
232 return; | 229 return; |
233 DCHECK_EQ(profile_, new_tab_wrapper->profile()); | 230 DCHECK_EQ(profile_, new_tab_wrapper->profile()); |
234 inspected_tab_ = new_tab_wrapper; | 231 inspected_tab_ = new_tab_wrapper; |
235 } | 232 } |
236 | 233 |
| 234 RenderViewHost* DevToolsWindow::GetClientRenderViewHost() { |
| 235 return tab_contents_->render_view_host(); |
| 236 } |
| 237 |
237 void DevToolsWindow::Show(DevToolsToggleAction action) { | 238 void DevToolsWindow::Show(DevToolsToggleAction action) { |
238 if (docked_) { | 239 if (docked_) { |
239 Browser* inspected_browser; | 240 Browser* inspected_browser; |
240 int inspected_tab_index; | 241 int inspected_tab_index; |
241 // Tell inspected browser to update splitter and switch to inspected panel. | 242 // Tell inspected browser to update splitter and switch to inspected panel. |
242 if (!IsInspectedBrowserPopupOrPanel() && | 243 if (!IsInspectedBrowserPopupOrPanel() && |
243 FindInspectedBrowserAndTabIndex(&inspected_browser, | 244 FindInspectedBrowserAndTabIndex(&inspected_browser, |
244 &inspected_tab_index)) { | 245 &inspected_tab_index)) { |
245 BrowserWindow* inspected_window = inspected_browser->window(); | 246 BrowserWindow* inspected_window = inspected_browser->window(); |
246 tab_contents_->tab_contents()->set_delegate(this); | 247 tab_contents_->tab_contents()->set_delegate(this); |
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
638 window->Show(action); | 639 window->Show(action); |
639 else | 640 else |
640 manager->UnregisterDevToolsClientHostFor(inspected_rvh); | 641 manager->UnregisterDevToolsClientHostFor(inspected_rvh); |
641 | 642 |
642 return window; | 643 return window; |
643 } | 644 } |
644 | 645 |
645 // static | 646 // static |
646 DevToolsWindow* DevToolsWindow::AsDevToolsWindow( | 647 DevToolsWindow* DevToolsWindow::AsDevToolsWindow( |
647 DevToolsClientHost* client_host) { | 648 DevToolsClientHost* client_host) { |
648 if (!client_host || g_instances == NULL) | 649 if (!client_host) |
649 return NULL; | 650 return NULL; |
650 DevToolsWindowList& instances = g_instances.Get(); | 651 if (client_host->GetClientRenderViewHost() != NULL) |
651 for (DevToolsWindowList::iterator it = instances.begin(); | 652 return static_cast<DevToolsWindow*>(client_host); |
652 it != instances.end(); ++it) { | |
653 DevToolsClientHost* client = *it; | |
654 if (client == client_host) | |
655 return *it; | |
656 } | |
657 return NULL; | 653 return NULL; |
658 } | 654 } |
659 | 655 |
660 void DevToolsWindow::RenderViewHostDestroyed(RenderViewHost* rvh) { | 656 void DevToolsWindow::RenderViewHostDestroyed(RenderViewHost* rvh) { |
661 // Don't delete |this| here, do it on NOTIFICATION_TAB_CLOSING event. | 657 // Don't delete |this| here, do it on NOTIFICATION_TAB_CLOSING event. |
662 } | 658 } |
663 | 659 |
664 bool DevToolsWindow::OnMessageReceived(const IPC::Message& message) { | 660 bool DevToolsWindow::OnMessageReceived(const IPC::Message& message) { |
665 bool handled = true; | 661 bool handled = true; |
666 IPC_BEGIN_MESSAGE_MAP(DevToolsWindow, message) | 662 IPC_BEGIN_MESSAGE_MAP(DevToolsWindow, message) |
(...skipping 19 matching lines...) Expand all Loading... |
686 RequestSetDocked(false); | 682 RequestSetDocked(false); |
687 } | 683 } |
688 | 684 |
689 content::JavaScriptDialogCreator* DevToolsWindow::GetJavaScriptDialogCreator() { | 685 content::JavaScriptDialogCreator* DevToolsWindow::GetJavaScriptDialogCreator() { |
690 if (inspected_tab_ && inspected_tab_->tab_contents()->delegate()) { | 686 if (inspected_tab_ && inspected_tab_->tab_contents()->delegate()) { |
691 return inspected_tab_->tab_contents()->delegate()-> | 687 return inspected_tab_->tab_contents()->delegate()-> |
692 GetJavaScriptDialogCreator(); | 688 GetJavaScriptDialogCreator(); |
693 } | 689 } |
694 return TabContentsDelegate::GetJavaScriptDialogCreator(); | 690 return TabContentsDelegate::GetJavaScriptDialogCreator(); |
695 } | 691 } |
OLD | NEW |