| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_PRERENDER_PRERENDER_RESOURCE_HANDLER_H_ |
| #define CHROME_BROWSER_PRERENDER_PRERENDER_RESOURCE_HANDLER_H_ |
| #pragma once |
| |
| #include <string> |
| |
| #include "base/callback.h" |
| #include "chrome/browser/prerender/prerender_manager.h" |
| #include "content/browser/renderer_host/resource_handler.h" |
| |
| class ChromeURLRequestContext; |
| namespace net { |
| class URLRequest; |
| } |
| |
| namespace prerender { |
| |
| // The PrerenderResourceHandler initiates prerendering of web pages |
| // under the following conditions: |
| // - The profile which initiated the request allows prerendering. |
| // - The initial request is a GET for a PREFETCH resource type. |
| // - The final URL (after redirects) has a scheme of http or https. |
| // - The response status code is a 200. |
| // - The MIME type of the response (sniffed or explicit) is text/html. |
| class PrerenderResourceHandler : public ResourceHandler { |
| public: |
| // Creates a new PrerenderResourceHandler if appropriate for the |
| // given |request| and |context|, otherwise NULL is returned. The |
| // caller is resposible for deleting the returned handler. |
| // |
| // |next_handler| is the backup handler that this handler delegates to |
| // for the majority of the commands, and must be non-NULL. |
| static PrerenderResourceHandler* MaybeCreate( |
| const net::URLRequest& request, |
| ChromeURLRequestContext* context, |
| ResourceHandler* next_handler, |
| bool is_from_prerender, int child_id, int route_id); |
| |
| // OnResponseStarted will ask the |prerender_manager_| to start |
| // prerendering the requested resource if it is of an appropriate |
| // content type. The next handler is still invoked. |
| virtual bool OnResponseStarted(int request_id, |
| ResourceResponse* response); |
| |
| // The following methods simply delegate to the next_handler. |
| virtual bool OnUploadProgress(int request_id, |
| uint64 position, |
| uint64 size); |
| virtual bool OnRequestRedirected(int request_id, const GURL& url, |
| ResourceResponse* response, |
| bool* defer); |
| virtual bool OnWillStart(int request_id, const GURL& url, bool* defer); |
| |
| virtual bool OnWillRead(int request_id, |
| net::IOBuffer** buf, |
| int* buf_size, |
| int min_size); |
| |
| virtual bool OnReadCompleted(int request_id, int* bytes_read); |
| |
| virtual bool OnResponseCompleted(int request_id, |
| const net::URLRequestStatus& status, |
| const std::string& security_info); |
| |
| virtual void OnRequestClosed(); |
| |
| private: |
| friend class PrerenderResourceHandlerTest; |
| typedef Callback5<const std::pair<int, int>&, |
| const GURL&, |
| const std::vector<GURL>&, |
| const GURL&, |
| bool>::Type PrerenderCallback; |
| |
| PrerenderResourceHandler(const net::URLRequest& request, |
| ResourceHandler* next_handler, |
| PrerenderManager* prerender_manager, |
| bool make_pending, int child_id, int route_id); |
| |
| // This constructor is only used from unit tests. |
| PrerenderResourceHandler(const net::URLRequest& request, |
| ResourceHandler* next_handler, |
| PrerenderCallback* callback); |
| |
| virtual ~PrerenderResourceHandler(); |
| |
| void RunCallbackFromUIThread(const std::pair<int, int>& child_route_id_pair, |
| const GURL& url, |
| const std::vector<GURL>& alias_urls, |
| const GURL& referrer, |
| bool make_pending); |
| void StartPrerender(const std::pair<int, int>& child_route_id_pair, |
| const GURL& url, |
| const std::vector<GURL>& alias_urls, |
| const GURL& referrer, |
| bool make_pending); |
| |
| // The set of URLs that are aliases to the URL to be prerendered, |
| // as a result of redirects, including the final URL. |
| std::vector<GURL> alias_urls_; |
| GURL url_; |
| scoped_refptr<ResourceHandler> next_handler_; |
| scoped_refptr<PrerenderManager> prerender_manager_; |
| scoped_ptr<PrerenderCallback> prerender_callback_; |
| |
| // Used to obtain the referrer, but only after any redirections occur, as they |
| // can result in the referrer being cleared. |
| const net::URLRequest& request_; |
| |
| int child_id_; |
| int route_id_; |
| |
| // True if we want to make this a pending prerender for later |
| bool make_pending_; |
| |
| DISALLOW_COPY_AND_ASSIGN(PrerenderResourceHandler); |
| }; |
| |
| } // namespace prerender |
| |
| #endif // CHROME_BROWSER_PRERENDER_PRERENDER_RESOURCE_HANDLER_H_ |