172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file.
472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#ifndef CHROME_BROWSER_PRERENDER_PRERENDER_RESOURCE_HANDLER_H_
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define CHROME_BROWSER_PRERENDER_PRERENDER_RESOURCE_HANDLER_H_
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#pragma once
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <string>
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/callback.h"
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/prerender/prerender_manager.h"
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/resource_handler.h"
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass ChromeURLRequestContext;
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace net {
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass URLRequest;
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace prerender {
21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// The PrerenderResourceHandler initiates prerendering of web pages
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// under the following conditions:
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//   - The profile which initiated the request allows prerendering.
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//   - The initial request is a GET for a PREFETCH resource type.
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//   - The final URL (after redirects) has a scheme of http or https.
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//   - The response status code is a 200.
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//   - The MIME type of the response (sniffed or explicit) is text/html.
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass PrerenderResourceHandler : public ResourceHandler {
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Creates a new PrerenderResourceHandler if appropriate for the
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // given |request| and |context|, otherwise NULL is returned. The
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // caller is resposible for deleting the returned handler.
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  //
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // |next_handler| is the backup handler that this handler delegates to
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // for the majority of the commands, and must be non-NULL.
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static PrerenderResourceHandler* MaybeCreate(
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const net::URLRequest& request,
3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ChromeURLRequestContext* context,
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ResourceHandler* next_handler,
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      bool is_from_prerender, int child_id, int route_id);
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // OnResponseStarted will ask the |prerender_manager_| to start
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // prerendering the requested resource if it is of an appropriate
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // content type. The next handler is still invoked.
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool OnResponseStarted(int request_id,
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                 ResourceResponse* response);
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // The following methods simply delegate to the next_handler.
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool OnUploadProgress(int request_id,
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                uint64 position,
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                uint64 size);
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool OnRequestRedirected(int request_id, const GURL& url,
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                   ResourceResponse* response,
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                   bool* defer);
5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool OnWillStart(int request_id, const GURL& url, bool* defer);
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool OnWillRead(int request_id,
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                          net::IOBuffer** buf,
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                          int* buf_size,
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                          int min_size);
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool OnReadCompleted(int request_id, int* bytes_read);
6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool OnResponseCompleted(int request_id,
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                   const net::URLRequestStatus& status,
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                   const std::string& security_info);
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void OnRequestClosed();
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  friend class PrerenderResourceHandlerTest;
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  typedef Callback5<const std::pair<int, int>&,
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    const GURL&,
75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                    const std::vector<GURL>&,
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    const GURL&,
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    bool>::Type PrerenderCallback;
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PrerenderResourceHandler(const net::URLRequest& request,
80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                           ResourceHandler* next_handler,
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           PrerenderManager* prerender_manager,
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           bool make_pending, int child_id, int route_id);
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // This constructor is only used from unit tests.
85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PrerenderResourceHandler(const net::URLRequest& request,
86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                           ResourceHandler* next_handler,
8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                           PrerenderCallback* callback);
88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~PrerenderResourceHandler();
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void RunCallbackFromUIThread(const std::pair<int, int>& child_route_id_pair,
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                               const GURL& url,
93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                               const std::vector<GURL>& alias_urls,
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                               const GURL& referrer,
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                               bool make_pending);
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void StartPrerender(const std::pair<int, int>& child_route_id_pair,
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      const GURL& url,
98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                      const std::vector<GURL>& alias_urls,
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      const GURL& referrer,
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      bool make_pending);
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // The set of URLs that are aliases to the URL to be prerendered,
103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // as a result of redirects, including the final URL.
10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::vector<GURL> alias_urls_;
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  GURL url_;
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_refptr<ResourceHandler> next_handler_;
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_refptr<PrerenderManager> prerender_manager_;
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<PrerenderCallback> prerender_callback_;
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Used to obtain the referrer, but only after any redirections occur, as they
111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // can result in the referrer being cleared.
112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const net::URLRequest& request_;
113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int child_id_;
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int route_id_;
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // True if we want to make this a pending prerender for later
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool make_pending_;
119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(PrerenderResourceHandler);
12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}  // namespace prerender
124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif  // CHROME_BROWSER_PRERENDER_PRERENDER_RESOURCE_HANDLER_H_
126