OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/chrome_devtools_manager_delegate.h" | 5 #include "chrome/browser/devtools/chrome_devtools_manager_delegate.h" |
6 | 6 |
| 7 #include "base/values.h" |
| 8 #include "chrome/browser/devtools/devtools_network_controller.h" |
| 9 #include "chrome/browser/devtools/devtools_protocol.h" |
| 10 #include "chrome/browser/devtools/devtools_protocol_constants.h" |
7 #include "chrome/browser/devtools/devtools_window.h" | 11 #include "chrome/browser/devtools/devtools_window.h" |
8 #include "chrome/browser/profiles/profile.h" | 12 #include "chrome/browser/profiles/profile.h" |
| 13 #include "content/public/browser/browser_thread.h" |
9 #include "content/public/browser/devtools_agent_host.h" | 14 #include "content/public/browser/devtools_agent_host.h" |
| 15 #include "content/public/browser/devtools_manager.h" |
| 16 #include "content/public/browser/render_process_host.h" |
| 17 #include "content/public/browser/render_view_host.h" |
| 18 #include "content/public/browser/site_instance.h" |
10 | 19 |
11 ChromeDevToolsManagerDelegate::ChromeDevToolsManagerDelegate() { | 20 ChromeDevToolsManagerDelegate::ChromeDevToolsManagerDelegate() |
| 21 : devtools_callback_(base::Bind( |
| 22 &ChromeDevToolsManagerDelegate::OnDevToolsStateChanged, |
| 23 base::Unretained(this))), |
| 24 devtools_callback_registered_(false) { |
| 25 // This constructor is invoked from DevToolsManagerImpl constructor, so it |
| 26 // shouldn't call DevToolsManager::GetInstance() |
12 } | 27 } |
13 | 28 |
14 ChromeDevToolsManagerDelegate::~ChromeDevToolsManagerDelegate() { | 29 ChromeDevToolsManagerDelegate::~ChromeDevToolsManagerDelegate() { |
| 30 // This destructor is invoked from DevToolsManagerImpl destructor, so it |
| 31 // shouldn't call DevToolsManager::GetInstance() |
| 32 } |
| 33 |
| 34 void ChromeDevToolsManagerDelegate::EnsureDevtoolsCallbackRegistered() { |
| 35 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 36 if (!devtools_callback_registered_) { |
| 37 content::DevToolsManager::GetInstance()->AddAgentStateCallback( |
| 38 devtools_callback_); |
| 39 devtools_callback_registered_ = true; |
| 40 } |
15 } | 41 } |
16 | 42 |
17 void ChromeDevToolsManagerDelegate::Inspect( | 43 void ChromeDevToolsManagerDelegate::Inspect( |
18 content::BrowserContext* browser_context, | 44 content::BrowserContext* browser_context, |
19 content::DevToolsAgentHost* agent_host) { | 45 content::DevToolsAgentHost* agent_host) { |
20 if (!agent_host->IsWorker()) { | 46 if (!agent_host->IsWorker()) { |
21 // TODO(horo): Support other types of DevToolsAgentHost when necessary. | 47 // TODO(horo): Support other types of DevToolsAgentHost when necessary. |
22 NOTREACHED() << "Inspect() only supports workers."; | 48 NOTREACHED() << "Inspect() only supports workers."; |
23 } | 49 } |
24 #if !defined(OS_ANDROID) | 50 #if !defined(OS_ANDROID) |
25 if (Profile* profile = Profile::FromBrowserContext(browser_context)) | 51 if (Profile* profile = Profile::FromBrowserContext(browser_context)) |
26 DevToolsWindow::OpenDevToolsWindowForWorker(profile, agent_host); | 52 DevToolsWindow::OpenDevToolsWindowForWorker(profile, agent_host); |
27 #endif | 53 #endif |
28 } | 54 } |
29 | 55 |
30 base::DictionaryValue* ChromeDevToolsManagerDelegate::HandleCommand( | 56 base::DictionaryValue* ChromeDevToolsManagerDelegate::HandleCommand( |
31 content::DevToolsAgentHost* agent_host, | 57 content::DevToolsAgentHost* agent_host, |
32 base::DictionaryValue* command_dict) { | 58 base::DictionaryValue* command_dict) { |
| 59 scoped_ptr<DevToolsProtocol::Command> command( |
| 60 DevToolsProtocol::ParseCommand(command_dict)); |
| 61 if (!command) |
| 62 return NULL; |
| 63 const std::string method = command->method(); |
| 64 if (method == chrome::devtools::Network::emulateNetworkConditions::kName) |
| 65 return EmulateNetworkConditions(agent_host, command.get())->Serialize(); |
33 return NULL; | 66 return NULL; |
34 } | 67 } |
| 68 |
| 69 Profile* ChromeDevToolsManagerDelegate::GetProfile( |
| 70 content::DevToolsAgentHost* agent_host) { |
| 71 content::RenderViewHost* host = agent_host->GetRenderViewHost(); |
| 72 if (!host) |
| 73 return NULL; |
| 74 return Profile::FromBrowserContext(host->GetSiteInstance()->GetProcess()-> |
| 75 GetBrowserContext()); |
| 76 } |
| 77 |
| 78 scoped_ptr<DevToolsProtocol::Response> |
| 79 ChromeDevToolsManagerDelegate::EmulateNetworkConditions( |
| 80 content::DevToolsAgentHost* agent_host, |
| 81 DevToolsProtocol::Command* command) { |
| 82 base::DictionaryValue* params = command->params(); |
| 83 bool offline = false; |
| 84 const char* offline_param = |
| 85 chrome::devtools::Network::emulateNetworkConditions::kParamOffline; |
| 86 if (!params || !params->GetBoolean(offline_param, &offline)) |
| 87 return command->InvalidParamResponse(offline_param); |
| 88 |
| 89 EnsureDevtoolsCallbackRegistered(); |
| 90 UpdateNetworkState(agent_host, offline); |
| 91 return command->SuccessResponse(NULL); |
| 92 } |
| 93 |
| 94 void ChromeDevToolsManagerDelegate::UpdateNetworkState( |
| 95 content::DevToolsAgentHost* agent_host, |
| 96 bool offline) { |
| 97 Profile* profile = GetProfile(agent_host); |
| 98 if (!profile) |
| 99 return; |
| 100 profile->GetDevToolsNetworkController()->SetNetworkState( |
| 101 agent_host->GetId(), offline); |
| 102 } |
| 103 |
| 104 void ChromeDevToolsManagerDelegate::OnDevToolsStateChanged( |
| 105 content::DevToolsAgentHost* agent_host, |
| 106 bool attached) { |
| 107 UpdateNetworkState(agent_host, false); |
| 108 } |
OLD | NEW |