12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_PROTOCOL_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_PROTOCOL_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h" 14bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "base/memory/ref_counted.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Utility classes for processing DevTools remote debugging messages. 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// https://developers.google.com/chrome-developer-tools/docs/debugger-protocol 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DevToolsProtocol { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::Callback<void(const std::string& message)> Notifier; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class Response; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch class Message : public base::RefCountedThreadSafe<Message> { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string domain() { return domain_; } 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string method() { return method_; } 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* params() { return params_.get(); } 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual std::string Serialize() = 0; 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 35bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch friend class base::RefCountedThreadSafe<Message>; 36bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch virtual ~Message(); 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Message(const std::string& method, 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::DictionaryValue* params); 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string domain_; 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string method_; 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::DictionaryValue> params_; 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Message); 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class Command : public Message { 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int id() { return id_; } 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual std::string Serialize() OVERRIDE; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Creates success response. Takes ownership of |result|. 55bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch scoped_refptr<Response> SuccessResponse(base::DictionaryValue* result); 56bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 57bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // Creates error response. 58bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch scoped_refptr<Response> InternalErrorResponse(const std::string& message); 59bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 60bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // Creates error response. 61bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch scoped_refptr<Response> InvalidParamResponse(const std::string& param); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 63bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // Creates error response. 64bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch scoped_refptr<Response> NoSuchMethodErrorResponse(); 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 66bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // Creates async response promise. 67bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch scoped_refptr<Response> AsyncResponsePromise(); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 69bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch protected: 70bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch virtual ~Command(); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class DevToolsProtocol; 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Command(int id, const std::string& method, 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* params); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int id_; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Command); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch class Response : public base::RefCountedThreadSafe<Response> { 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string Serialize(); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 86bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch bool is_async_promise() { return is_async_promise_; } 87bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 89bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch friend class base::RefCountedThreadSafe<Response>; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class Command; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class DevToolsProtocol; 92bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch virtual ~Response(); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Response(int id, base::DictionaryValue* result); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Response(int id, int error_code, const std::string& error_message); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int id_; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> result_; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int error_code_; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error_message_; 101bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch bool is_async_promise_; 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Response); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class Notification : public Message { 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual std::string Serialize() OVERRIDE; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class DevToolsProtocol; 113bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch virtual ~Notification(); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Takes ownership of |params|. 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Notification(const std::string& method, 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::DictionaryValue* params); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Notification); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class Handler { 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 124bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch typedef base::Callback<scoped_refptr<DevToolsProtocol::Response>( 125bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch scoped_refptr<DevToolsProtocol::Command> command)> CommandHandler; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~Handler(); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 129bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch virtual scoped_refptr<DevToolsProtocol::Response> HandleCommand( 130bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch scoped_refptr<DevToolsProtocol::Command> command); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetNotifier(const Notifier& notifier); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Handler(); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RegisterCommandHandler(const std::string& command, 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CommandHandler& handler); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends notification to the client. Takes ownership of |params|. 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SendNotification(const std::string& method, 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* params); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 144558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Sends message to client, the caller is presumed to properly 145558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // format the message. 146558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch void SendRawMessage(const std::string& message); 147558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::map<std::string, CommandHandler> CommandHandlers; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Notifier notifier_; 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CommandHandlers command_handlers_; 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Handler); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 157bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch static scoped_refptr<Command> ParseCommand(const std::string& json, 158bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch std::string* error_response); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 160bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch static scoped_refptr<Notification> ParseNotification( 161bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const std::string& json); 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 163bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch static scoped_refptr<Notification> CreateNotification( 164bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const std::string& method, base::DictionaryValue* params); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static base::DictionaryValue* ParseMessage(const std::string& json, 168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string* error_response); 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DevToolsProtocol() {} 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~DevToolsProtocol() {} 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_PROTOCOL_H_ 177