Index: content/browser/debugger/devtools_browser_target.cc |
diff --git a/content/browser/debugger/devtools_browser_target.cc b/content/browser/debugger/devtools_browser_target.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..95d57a9e79f99cba5694e7fc137261e879432236 |
--- /dev/null |
+++ b/content/browser/debugger/devtools_browser_target.cc |
@@ -0,0 +1,118 @@ |
+// Copyright (c) 2012 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 "content/browser/debugger/devtools_browser_target.h" |
+ |
+#include "base/json/json_reader.h" |
+#include "base/json/json_writer.h" |
+#include "base/logging.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/values.h" |
+ |
+ |
+namespace content { |
+ |
+DevToolsBrowserTarget::DevToolsBrowserTarget(int connection_id) |
+ : connection_id_(connection_id) { |
+} |
+ |
+DevToolsBrowserTarget::~DevToolsBrowserTarget() { |
+ for (HandlersMap::iterator i = handlers_.begin(); i != handlers_.end(); ++i) |
+ delete i->second; |
+} |
+ |
+void DevToolsBrowserTarget::RegisterHandler(Handler* handler) { |
+ std::string domain = handler->Domain(); |
+ DCHECK(handlers_.find(domain) == handlers_.end()); |
+ handlers_[domain] = handler; |
+} |
+ |
+std::string DevToolsBrowserTarget::HandleMessage(const std::string& data) { |
+ int error_code; |
+ std::string error_message; |
+ scoped_ptr<base::Value> command( |
+ base::JSONReader::ReadAndReturnError( |
+ data, 0, &error_code, &error_message)); |
+ |
+ if (!command || !command->IsType(base::Value::TYPE_DICTIONARY)) |
+ return SerializeErrorResponse( |
+ -1, CreateErrorObject(error_code, error_message)); |
+ |
+ int request_id; |
+ std::string domain; |
+ std::string method; |
+ base::DictionaryValue* command_dict = NULL; |
+ bool ok = true; |
+ ok &= command->GetAsDictionary(&command_dict); |
+ ok &= command_dict->GetInteger("id", &request_id); |
+ ok &= command_dict->GetString("method", &method); |
+ if (!ok) |
+ return SerializeErrorResponse( |
+ request_id, CreateErrorObject(-1, "Malformed request")); |
+ |
+ base::DictionaryValue* params = NULL; |
+ command_dict->GetDictionary("params", ¶ms); |
+ |
+ size_t pos = method.find("."); |
+ if (pos == std::string::npos) |
+ return SerializeErrorResponse( |
+ request_id, CreateErrorObject(-1, "Method unsupported")); |
+ |
+ domain = method.substr(0, pos); |
+ if (domain.empty() || handlers_.find(domain) == handlers_.end()) |
+ return SerializeErrorResponse( |
+ request_id, CreateErrorObject(-1, "Domain unsupported")); |
+ |
+ base::Value* error_object = NULL; |
+ base::Value* domain_result = handlers_[domain]->OnProtocolCommand( |
+ method, params, &error_object); |
+ |
+ if (error_object) |
+ return SerializeErrorResponse(request_id, error_object); |
+ |
+ if (!domain_result) |
+ return SerializeErrorResponse( |
+ request_id, CreateErrorObject(-1, "Invalid call")); |
+ |
+ DictionaryValue* response = new DictionaryValue(); |
+ response->Set("result", domain_result); |
+ return SerializeResponse(request_id, response); |
+} |
+ |
+std::string DevToolsBrowserTarget::SerializeErrorResponse( |
+ int request_id, base::Value* error_object) { |
+ scoped_ptr<base::DictionaryValue> error_response(new base::DictionaryValue()); |
+ error_response->SetInteger("id", request_id); |
+ error_response->Set("error", error_object); |
+ // Serialize response. |
+ std::string json_response; |
+ base::JSONWriter::WriteWithOptions(error_response.get(), |
+ base::JSONWriter::OPTIONS_PRETTY_PRINT, |
+ &json_response); |
+ return json_response; |
+} |
+ |
+base::Value* DevToolsBrowserTarget::CreateErrorObject( |
+ int error_code, const std::string& message) { |
+ base::DictionaryValue* error_object = new base::DictionaryValue(); |
+ error_object->SetInteger("code", error_code); |
+ error_object->SetString("message", message); |
+ return error_object; |
+} |
+ |
+std::string DevToolsBrowserTarget::SerializeResponse( |
+ int request_id, base::Value* response) { |
+ scoped_ptr<base::DictionaryValue> ret(new base::DictionaryValue()); |
+ ret->SetInteger("id", request_id); |
+ ret->Set("response", response); |
+ |
+ // Serialize response. |
+ std::string json_response; |
+ base::JSONWriter::WriteWithOptions(ret.get(), |
+ base::JSONWriter::OPTIONS_PRETTY_PRINT, |
+ &json_response); |
+ return json_response; |
+} |
+ |
+} // namespace content |