15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_PUBLIC_BROWSER_DEVTOOLS_HTTP_HANDLER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_PUBLIC_BROWSER_DEVTOOLS_HTTP_HANDLER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/files/file_path.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ServerSocket;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestContextGetter;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DevToolsHttpHandlerDelegate;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is used for managing DevTools remote debugging server.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clients can connect to the specified ip:port and start debugging
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this browser.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DevToolsHttpHandler {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Factory of net::ServerSocket. This is to separate instantiating dev tools
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // and instantiating server socket.
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  class CONTENT_EXPORT ServerSocketFactory {
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   public:
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ServerSocketFactory(const std::string& address, int port, int backlog);
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    virtual ~ServerSocketFactory();
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Returns a new instance of ServerSocket or NULL if an error occurred.
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // It calls ServerSocket::ListenWithAddressAndPort() with address, port and
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // backlog passed to constructor.
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    virtual scoped_ptr<net::ServerSocket> CreateAndListen() const;
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   protected:
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Creates a server socket. ServerSocket::Listen() will be called soon
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // unless it returns NULL.
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    virtual scoped_ptr<net::ServerSocket> Create() const = 0;
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string address_;
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const int port_;
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const int backlog_;
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   private:
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DISALLOW_COPY_AND_ASSIGN(ServerSocketFactory);
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  };
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns true if the given protocol version is supported.
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CONTENT_EXPORT static bool IsSupportedProtocolVersion(
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const std::string& version);
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns frontend resource id for the given resource |name|.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CONTENT_EXPORT static int GetFrontendResourceId(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& name);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Takes ownership over |socket_factory| and |delegate|.
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // If |active_port_output_directory| is non-empty, it is assumed the
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // socket_factory was initialized with an ephemeral port (0). The
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // port selected by the OS will be written to a well-known file in
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // the output directory.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CONTENT_EXPORT static DevToolsHttpHandler* Start(
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      scoped_ptr<ServerSocketFactory> server_socket_factory,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& frontend_url,
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      DevToolsHttpHandlerDelegate* delegate,
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const base::FilePath& active_port_output_directory);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called from the main thread in order to stop protocol handler.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Automatically destroys the handler instance.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Stop() = 0;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Returns the URL for the address to debug |agent_host|.
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual GURL GetFrontendURL() = 0;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DevToolsHttpHandler() {}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_PUBLIC_BROWSER_DEVTOOLS_HTTP_HANDLER_H_
89