Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / content / browser / devtools / devtools_http_handler_impl.h
1 // Copyright (c) 2012 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 CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_HTTP_HANDLER_IMPL_H_
6 #define CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_HTTP_HANDLER_IMPL_H_
7
8 #include <map>
9 #include <set>
10 #include <string>
11 #include <vector>
12
13 #include "base/memory/ref_counted.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "content/common/content_export.h"
16 #include "content/public/browser/devtools_agent_host.h"
17 #include "content/public/browser/devtools_http_handler.h"
18 #include "content/public/browser/devtools_http_handler_delegate.h"
19 #include "content/public/browser/devtools_manager_delegate.h"
20 #include "net/http/http_status_code.h"
21 #include "net/server/http_server.h"
22
23 namespace base {
24 class DictionaryValue;
25 class ListValue;
26 class Thread;
27 class Value;
28 }
29
30 namespace net {
31 class ServerSocketFactory;
32 class URLRequestContextGetter;
33 }
34
35 namespace content {
36
37 class DevToolsHttpHandlerImpl
38     : public DevToolsHttpHandler,
39       public base::RefCountedThreadSafe<DevToolsHttpHandlerImpl>,
40       public net::HttpServer::Delegate {
41  private:
42   friend class base::RefCountedThreadSafe<DevToolsHttpHandlerImpl>;
43   friend class DevToolsHttpHandler;
44
45   class BrowserTarget;
46
47   DevToolsHttpHandlerImpl(scoped_ptr<ServerSocketFactory> server_socket_factory,
48                           const std::string& frontend_url,
49                           DevToolsHttpHandlerDelegate* delegate,
50                           const base::FilePath& active_port_output_directory);
51   ~DevToolsHttpHandlerImpl() override;
52   void Start();
53
54   // DevToolsHttpHandler implementation.
55   void Stop() override;
56   GURL GetFrontendURL() override;
57
58   // net::HttpServer::Delegate implementation.
59   void OnConnect(int connection_id) override {}
60   void OnHttpRequest(int connection_id,
61                      const net::HttpServerRequestInfo& info) override;
62   void OnWebSocketRequest(int connection_id,
63                           const net::HttpServerRequestInfo& info) override;
64   void OnWebSocketMessage(int connection_id, const std::string& data) override;
65   void OnClose(int connection_id) override;
66
67   void OnJsonRequestUI(int connection_id,
68                        const net::HttpServerRequestInfo& info);
69   void OnThumbnailRequestUI(int connection_id, const GURL& page_url);
70   void OnDiscoveryPageRequestUI(int connection_id);
71
72   void OnWebSocketRequestUI(int connection_id,
73                             const net::HttpServerRequestInfo& info);
74   void OnWebSocketMessageUI(int connection_id, const std::string& data);
75   void OnCloseUI(int connection_id);
76
77   void ResetHandlerThread();
78   void ResetHandlerThreadAndRelease();
79
80   void OnTargetListReceived(
81       int connection_id,
82       const std::string& host,
83       const DevToolsManagerDelegate::TargetList& targets);
84
85   void OnHttpServerInitialized(const net::IPEndPoint& ip_address);
86
87   DevToolsTarget* GetTarget(const std::string& id);
88
89   void Init();
90   void Teardown();
91
92   void StartHandlerThread();
93   void StopHandlerThread();
94   void StopWithoutRelease();
95
96   void WriteActivePortToUserProfile();
97
98   void SendJson(int connection_id,
99                 net::HttpStatusCode status_code,
100                 base::Value* value,
101                 const std::string& message);
102   void Send200(int connection_id,
103                const std::string& data,
104                const std::string& mime_type);
105   void Send404(int connection_id);
106   void Send500(int connection_id,
107                const std::string& message);
108   void AcceptWebSocket(int connection_id,
109                        const net::HttpServerRequestInfo& request);
110
111   // Returns the front end url without the host at the beginning.
112   std::string GetFrontendURLInternal(const std::string target_id,
113                                      const std::string& host);
114
115   base::DictionaryValue* SerializeTarget(const DevToolsTarget& target,
116                                          const std::string& host);
117
118   // The thread used by the devtools handler to run server socket.
119   scoped_ptr<base::Thread> thread_;
120
121   std::string frontend_url_;
122   const scoped_ptr<ServerSocketFactory> server_socket_factory_;
123   scoped_ptr<net::HttpServer> server_;
124   scoped_ptr<net::IPEndPoint> server_ip_address_;
125   typedef std::map<int, DevToolsAgentHostClient*> ConnectionToClientMap;
126   ConnectionToClientMap connection_to_client_ui_;
127   const scoped_ptr<DevToolsHttpHandlerDelegate> delegate_;
128   const base::FilePath active_port_output_directory_;
129   typedef std::map<std::string, DevToolsTarget*> TargetMap;
130   TargetMap target_map_;
131   typedef std::map<int, BrowserTarget*> BrowserTargets;
132   BrowserTargets browser_targets_;
133   DISALLOW_COPY_AND_ASSIGN(DevToolsHttpHandlerImpl);
134 };
135
136 }  // namespace content
137
138 #endif  // CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_HTTP_HANDLER_IMPL_H_