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