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