• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_DEBUGGER_DEVTOOLS_REMOTE_MESSAGE_H_
6 #define CHROME_BROWSER_DEBUGGER_DEVTOOLS_REMOTE_MESSAGE_H_
7 #pragma once
8 
9 #include <string>
10 
11 #include "base/basictypes.h"
12 #include "base/hash_tables.h"
13 
14 // Contains DevTools protocol message header names
15 // and the Flags header bit field constants.
16 struct DevToolsRemoteMessageHeaders {
17   // The content length in decimal.
18   static const char kContentLength[];
19   // The tool that should handle the message.
20   static const char kTool[];
21   // The destination (inspected) object identifier (if any), like a TabID.
22   static const char kDestination[];
23 };
24 
25 // Represents a Chrome remote debugging protocol message transferred
26 // over the wire between the remote debugger and a Chrome instance.
27 // Consider using DevToolsRemoteMessageBuilder (see end of this file) for easy
28 // construction of outbound (Chrome -> remote debugger) messages.
29 class DevToolsRemoteMessage {
30  public:
31   typedef base::hash_map<std::string, std::string> HeaderMap;
32 
33   // Use this as the second parameter in a |GetHeader| call to use
34   // an empty string as the default value.
35   static const char kEmptyValue[];
36 
37   // Constructs an empty message with no content or headers.
38   DevToolsRemoteMessage();
39   DevToolsRemoteMessage(const HeaderMap& headers, const std::string& content);
40   virtual ~DevToolsRemoteMessage();
41 
headers()42   const HeaderMap& headers() const {
43     return header_map_;
44   }
45 
content()46   const std::string& content() const {
47     return content_;
48   }
49 
content_length()50   int content_length() const {
51     return content_.size();
52   }
53 
tool()54   const std::string tool() const {
55     return GetHeaderWithEmptyDefault(DevToolsRemoteMessageHeaders::kTool);
56   }
57 
destination()58   const std::string destination() const {
59     return GetHeaderWithEmptyDefault(
60         DevToolsRemoteMessageHeaders::kDestination);
61   }
62 
63   // Returns the header value providing default_value if the header is absent.
64   const std::string GetHeader(const std::string& header_name,
65                               const std::string& default_value) const;
66 
67   // Returns the header value providing an empty string if the header is absent.
68   const std::string GetHeaderWithEmptyDefault(
69       const std::string& header_name) const;
70 
71   // Returns a string representation of the message useful for the transfer to
72   // the remote debugger.
73   const std::string ToString() const;
74 
75  private:
76   HeaderMap header_map_;
77   std::string content_;
78   // Cannot DISALLOW_COPY_AND_ASSIGN(DevToolsRemoteMessage) since it is passed
79   // as an IPC message argument and needs to be copied.
80 };
81 
82 // Facilitates easy construction of outbound (Chrome -> remote debugger)
83 // DevToolsRemote messages.
84 class DevToolsRemoteMessageBuilder {
85  public:
86   // A singleton instance getter.
87   static DevToolsRemoteMessageBuilder& instance();
88   // Creates a message given the certain header values and a payload.
89   DevToolsRemoteMessage* Create(const std::string& tool,
90                                 const std::string& destination,
91                                 const std::string& payload);
92 
93  private:
DevToolsRemoteMessageBuilder()94   DevToolsRemoteMessageBuilder() {}
~DevToolsRemoteMessageBuilder()95   virtual ~DevToolsRemoteMessageBuilder() {}
96   DISALLOW_COPY_AND_ASSIGN(DevToolsRemoteMessageBuilder);
97 };
98 
99 #endif  // CHROME_BROWSER_DEBUGGER_DEVTOOLS_REMOTE_MESSAGE_H_
100