1bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// found in the LICENSE file. 4bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 5bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "chrome/browser/devtools/devtools_protocol.h" 6bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 7bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "base/json/json_reader.h" 8bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "base/json/json_writer.h" 9bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 10bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochnamespace { 11bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochconst char kIdParam[] = "id"; 12bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochconst char kMethodParam[] = "method"; 13bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochconst char kParamsParam[] = "params"; 14c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochconst char kErrorParam[] = "error"; 15c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochconst char kErrorCodeParam[] = "code"; 16bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} // namespace 17bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 18bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochDevToolsProtocol::Message::~Message() { 19bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 20bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 21bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochDevToolsProtocol::Message::Message(const std::string& method, 22bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch base::DictionaryValue* params) 23bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch : method_(method), 24bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch params_(params ? params->DeepCopy() : NULL) { 25bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 26bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 27bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochDevToolsProtocol::Command::Command(int id, 28bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const std::string& method, 29bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch base::DictionaryValue* params) 30bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch : Message(method, params), 31bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch id_(id) { 32bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 33bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 34bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochDevToolsProtocol::Command::~Command() { 35bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 36bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 37bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochstd::string DevToolsProtocol::Command::Serialize() { 38bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch base::DictionaryValue command; 39bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch command.SetInteger(kIdParam, id_); 40bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch command.SetString(kMethodParam, method_); 41bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (params_) 42bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch command.Set(kParamsParam, params_->DeepCopy()); 43bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 44bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch std::string json_command; 45bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch base::JSONWriter::Write(&command, &json_command); 46bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return json_command; 47bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 48bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 49bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochDevToolsProtocol::Notification::~Notification() { 50bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 51bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 52bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochDevToolsProtocol::Notification::Notification(const std::string& method, 53bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch base::DictionaryValue* params) 54bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch : Message(method, params) { 55bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 56bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 57c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben MurdochDevToolsProtocol::Response::~Response() { 58c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch} 59c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 60c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben MurdochDevToolsProtocol::Response::Response(int id, int error_code) 61c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch : id_(id), 62c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch error_code_(error_code) { 63c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch} 64c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 65bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// static 66bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochDevToolsProtocol::Notification* DevToolsProtocol::ParseNotification( 67bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const std::string& json) { 68bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch scoped_ptr<base::Value> value(base::JSONReader::Read(json)); 69bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (!value || !value->IsType(Value::TYPE_DICTIONARY)) 70bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return NULL; 71bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 72bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch scoped_ptr<base::DictionaryValue> dict( 73bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch static_cast<base::DictionaryValue*>(value.release())); 74bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 75bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch std::string method; 76bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (!dict->GetString(kMethodParam, &method)) 77bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return NULL; 78bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 79bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch base::DictionaryValue* params = NULL; 80bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch dict->GetDictionary(kParamsParam, ¶ms); 81bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return new Notification(method, params); 82bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 83c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 84c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben MurdochDevToolsProtocol::Response* DevToolsProtocol::ParseResponse( 85c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch const std::string& json) { 86c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch scoped_ptr<base::Value> value(base::JSONReader::Read(json)); 87c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch if (!value || !value->IsType(Value::TYPE_DICTIONARY)) 88c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return NULL; 89c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 90c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch scoped_ptr<base::DictionaryValue> dict( 91c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch static_cast<base::DictionaryValue*>(value.release())); 92c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 93c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch int id; 94c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch if (!dict->GetInteger(kIdParam, &id)) 95c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return NULL; 96c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 97c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch int error_code = 0; 98c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch base::DictionaryValue* error_dict = NULL; 99c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch if (dict->GetDictionary(kErrorParam, &error_dict)) 100c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch error_dict->GetInteger(kErrorCodeParam, &error_code); 101c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return new Response(id, error_code); 102c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch} 103