summaryrefslogtreecommitdiffstats
path: root/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/devtools/chrome_devtools_manager_delegate.cc')
-rw-r--r--chrome/browser/devtools/chrome_devtools_manager_delegate.cc76
1 files changed, 75 insertions, 1 deletions
diff --git a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
index 9b1f08b..9eb641c 100644
--- a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
+++ b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
@@ -4,14 +4,40 @@
#include "chrome/browser/devtools/chrome_devtools_manager_delegate.h"
+#include "base/values.h"
+#include "chrome/browser/devtools/devtools_network_controller.h"
+#include "chrome/browser/devtools/devtools_protocol.h"
+#include "chrome/browser/devtools/devtools_protocol_constants.h"
#include "chrome/browser/devtools/devtools_window.h"
#include "chrome/browser/profiles/profile.h"
+#include "content/public/browser/browser_thread.h"
#include "content/public/browser/devtools_agent_host.h"
+#include "content/public/browser/devtools_manager.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/render_view_host.h"
+#include "content/public/browser/site_instance.h"
-ChromeDevToolsManagerDelegate::ChromeDevToolsManagerDelegate() {
+ChromeDevToolsManagerDelegate::ChromeDevToolsManagerDelegate()
+ : devtools_callback_(base::Bind(
+ &ChromeDevToolsManagerDelegate::OnDevToolsStateChanged,
+ base::Unretained(this))),
+ devtools_callback_registered_(false) {
+ // This constructor is invoked from DevToolsManagerImpl constructor, so it
+ // shouldn't call DevToolsManager::GetInstance()
}
ChromeDevToolsManagerDelegate::~ChromeDevToolsManagerDelegate() {
+ // This destructor is invoked from DevToolsManagerImpl destructor, so it
+ // shouldn't call DevToolsManager::GetInstance()
+}
+
+void ChromeDevToolsManagerDelegate::EnsureDevtoolsCallbackRegistered() {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ if (!devtools_callback_registered_) {
+ content::DevToolsManager::GetInstance()->AddAgentStateCallback(
+ devtools_callback_);
+ devtools_callback_registered_ = true;
+ }
}
void ChromeDevToolsManagerDelegate::Inspect(
@@ -30,5 +56,53 @@ void ChromeDevToolsManagerDelegate::Inspect(
base::DictionaryValue* ChromeDevToolsManagerDelegate::HandleCommand(
content::DevToolsAgentHost* agent_host,
base::DictionaryValue* command_dict) {
+ scoped_ptr<DevToolsProtocol::Command> command(
+ DevToolsProtocol::ParseCommand(command_dict));
+ if (!command)
+ return NULL;
+ const std::string method = command->method();
+ if (method == chrome::devtools::Network::emulateNetworkConditions::kName)
+ return EmulateNetworkConditions(agent_host, command.get())->Serialize();
return NULL;
}
+
+Profile* ChromeDevToolsManagerDelegate::GetProfile(
+ content::DevToolsAgentHost* agent_host) {
+ content::RenderViewHost* host = agent_host->GetRenderViewHost();
+ if (!host)
+ return NULL;
+ return Profile::FromBrowserContext(host->GetSiteInstance()->GetProcess()->
+ GetBrowserContext());
+}
+
+scoped_ptr<DevToolsProtocol::Response>
+ChromeDevToolsManagerDelegate::EmulateNetworkConditions(
+ content::DevToolsAgentHost* agent_host,
+ DevToolsProtocol::Command* command) {
+ base::DictionaryValue* params = command->params();
+ bool offline = false;
+ const char* offline_param =
+ chrome::devtools::Network::emulateNetworkConditions::kParamOffline;
+ if (!params || !params->GetBoolean(offline_param, &offline))
+ return command->InvalidParamResponse(offline_param);
+
+ EnsureDevtoolsCallbackRegistered();
+ UpdateNetworkState(agent_host, offline);
+ return command->SuccessResponse(NULL);
+}
+
+void ChromeDevToolsManagerDelegate::UpdateNetworkState(
+ content::DevToolsAgentHost* agent_host,
+ bool offline) {
+ Profile* profile = GetProfile(agent_host);
+ if (!profile)
+ return;
+ profile->GetDevToolsNetworkController()->SetNetworkState(
+ agent_host->GetId(), offline);
+}
+
+void ChromeDevToolsManagerDelegate::OnDevToolsStateChanged(
+ content::DevToolsAgentHost* agent_host,
+ bool attached) {
+ UpdateNetworkState(agent_host, false);
+}