diff options
author | pfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-10 13:52:30 +0000 |
---|---|---|
committer | pfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-10 13:52:30 +0000 |
commit | 98f5f88b53f774cee109503b0225a5bfb9deb550 (patch) | |
tree | 32af75ae9784181c85e577327d8020192658c519 /chrome/browser/debugger/devtools_remote_service.cc | |
parent | 198d8d43c5ccff8d0d48bbd3fef31917aa9d3db6 (diff) | |
download | chromium_src-98f5f88b53f774cee109503b0225a5bfb9deb550.zip chromium_src-98f5f88b53f774cee109503b0225a5bfb9deb550.tar.gz chromium_src-98f5f88b53f774cee109503b0225a5bfb9deb550.tar.bz2 |
DevTools. Add V8 Application Remote Debugging Protocol support by apavlov. Original CL: http://codereview.chromium.org/56109
Review URL: http://codereview.chromium.org/66031
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@13502 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/debugger/devtools_remote_service.cc')
-rw-r--r-- | chrome/browser/debugger/devtools_remote_service.cc | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/chrome/browser/debugger/devtools_remote_service.cc b/chrome/browser/debugger/devtools_remote_service.cc new file mode 100644 index 0000000..4913f8b --- /dev/null +++ b/chrome/browser/debugger/devtools_remote_service.cc @@ -0,0 +1,103 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/json_reader.h" +#include "base/json_writer.h" +#include "base/scoped_ptr.h" +#include "base/values.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/debugger/devtools_manager.h" +#include "chrome/browser/debugger/devtools_protocol_handler.h" +#include "chrome/browser/debugger/devtools_remote_message.h" +#include "chrome/browser/debugger/devtools_remote_service.h" +#include "chrome/browser/debugger/inspectable_tab_proxy.h" +#include "chrome/browser/tab_contents/navigation_controller.h" +#include "chrome/browser/tab_contents/navigation_entry.h" +#include "chrome/common/devtools_messages.h" + +const std::string DevToolsRemoteServiceCommand::kPing = "ping"; +const std::string DevToolsRemoteServiceCommand::kVersion = "version"; +const std::string DevToolsRemoteServiceCommand::kListTabs = "list_tabs"; + +const std::wstring DevToolsRemoteService::kCommandWide = L"command"; +const std::wstring DevToolsRemoteService::kDataWide = L"data"; +const std::wstring DevToolsRemoteService::kResultWide = L"result"; +const std::string DevToolsRemoteService::kToolName = "DevToolsService"; + +DevToolsRemoteService::DevToolsRemoteService(DevToolsProtocolHandler* delegate) + : delegate_(delegate) {} + +DevToolsRemoteService::~DevToolsRemoteService() {} + +void DevToolsRemoteService::HandleMessage( + const DevToolsRemoteMessage& message) { + scoped_ptr<Value> request(JSONReader::Read(message.content(), false)); + if (request.get() == NULL) { + // Bad JSON + NOTREACHED(); + return; + } + DictionaryValue* json; + if (request->IsType(Value::TYPE_DICTIONARY)) { + json = static_cast<DictionaryValue*>(request.get()); + if (!json->HasKey(kCommandWide)) { + NOTREACHED(); // Broken protocol - no "command" specified + return; + } + } else { + NOTREACHED(); // Broken protocol - not a JS object + return; + } + ProcessJson(json, message); +} + +void DevToolsRemoteService::ProcessJson(DictionaryValue* json, + const DevToolsRemoteMessage& message) { + static const std::string kOkResponse = "ok"; // "Ping" response + static const std::string kVersion = "0.1"; // Current protocol version + std::string command; + DictionaryValue response; + + json->GetString(kCommandWide, &command); + response.SetString(kCommandWide, command); + + if (command == DevToolsRemoteServiceCommand::kPing) { + response.SetInteger(kResultWide, Result::kOk); + response.SetString(kDataWide, kOkResponse); + } else if (command == DevToolsRemoteServiceCommand::kVersion) { + response.SetInteger(kResultWide, Result::kOk); + response.SetString(kDataWide, kVersion); + } else if (command == DevToolsRemoteServiceCommand::kListTabs) { + ListValue* data = new ListValue(); + const InspectableTabProxy::ControllersMap& navcon_map = + delegate_->inspectable_tab_proxy()->controllers_map(true); + for (InspectableTabProxy::ControllersMap::const_iterator it = + navcon_map.begin(), end = navcon_map.end(); it != end; ++it) { + NavigationEntry* entry = it->second->GetActiveEntry(); + if (entry == NULL) { + continue; + } + if (entry->url().is_valid()) { + ListValue* tab = new ListValue(); + tab->Append(Value::CreateIntegerValue( + static_cast<int32>(it->second->session_id().id()))); + tab->Append(Value::CreateStringValue(entry->url().spec())); + data->Append(tab); + } + } + response.SetInteger(kResultWide, Result::kOk); + response.Set(kDataWide, data); + } else { + // Unknown protocol command. + NOTREACHED(); + response.SetInteger(kResultWide, Result::kUnknownCommand); + } + std::string response_json; + JSONWriter::Write(&response, false, &response_json); + scoped_ptr<DevToolsRemoteMessage> response_message( + DevToolsRemoteMessageBuilder::instance().Create(message.tool(), + message.destination(), + response_json)); + delegate_->Send(*response_message.get()); +} |