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 CHROME_BROWSER_PRERENDER_PRERENDER_CONTENTS_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_PRERENDER_PRERENDER_CONTENTS_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_vector.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/observer_list.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_final_status.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_origin.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/referrer.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProcessMetrics; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewHost; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SessionStorageNamespace; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct HistoryAddPageArgs; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace net { 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class URLRequestContextGetter; 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace prerender { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderHandle; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderManager; 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class PrerenderResourceThrottle; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderContents : public content::NotificationObserver, 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public content::WebContentsObserver, 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public base::SupportsWeakPtr<PrerenderContents> { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PrerenderContents::Create uses the currently registered Factory to create 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the PrerenderContents. Factory is intended for testing. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Factory { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Factory() {} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Factory() {} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ownership is not transfered through this interface as prerender_manager, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // prerender_tracker, and profile are stored as weak pointers. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual PrerenderContents* CreatePrerenderContents( 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* prerender_manager, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::Referrer& referrer, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 experiment_id) = 0; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Factory); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class Observer { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Signals that the prerender has started running. 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPrerenderStart(PrerenderContents* contents) = 0; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Signals that the prerender has had its load event. 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPrerenderStopLoading(PrerenderContents* contents); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Signals that the prerender has had its 'DOMContentLoaded' event. 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnPrerenderDomContentLoaded(PrerenderContents* contents); 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Signals that the prerender has stopped running. A PrerenderContents with 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // an unset final status will always call OnPrerenderStop before being 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // destroyed. 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPrerenderStop(PrerenderContents* contents) = 0; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Signals that this prerender has just become a MatchComplete replacement. 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPrerenderCreatedMatchCompleteReplacement( 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderContents* contents, PrerenderContents* replacement); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Observer(); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~Observer() = 0; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates how this PrerenderContents relates to MatchComplete. This is to 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // figure out which histograms to use to record the FinalStatus, Match (record 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // all prerenders and control group prerenders) or MatchComplete (record 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // running prerenders only in the way they would have been recorded in the 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // control group). 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum MatchCompleteStatus { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A regular prerender which will be recorded both in Match and 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MatchComplete. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MATCH_COMPLETE_DEFAULT, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A prerender that used to be a regular prerender, but has since been 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // replaced by a MatchComplete dummy. Therefore, we will record this only 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for Match, but not for MatchComplete. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MATCH_COMPLETE_REPLACED, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A prerender that is a MatchComplete dummy replacing a regular prerender. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In the control group, our prerender never would have been canceled, so 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we record in MatchComplete but not Match. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MATCH_COMPLETE_REPLACEMENT, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A prerender that is a MatchComplete dummy, early in the process of being 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // created. This prerender should not fail. Record for MatchComplete, but 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not Match. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MATCH_COMPLETE_REPLACEMENT_PENDING, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PrerenderContents(); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All observers of a PrerenderContents are removed after the OnPrerenderStop 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // event is sent, so there is no need to call RemoveObserver() in the normal 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // use case. 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AddObserver(Observer* observer); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RemoveObserver(Observer* observer); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For MatchComplete correctness, create a dummy replacement prerender 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // contents to stand in for this prerender contents that (which we are about 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to destroy). 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderContents* CreateMatchCompleteReplacement(); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Init(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Factory* CreateFactory(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns a PrerenderContents from the given web_contents, if it's used for 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // prerendering. Otherwise returns NULL. Handles a NULL input for 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // convenience. 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static PrerenderContents* FromWebContents(content::WebContents* web_contents); 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start rendering the contents in the prerendered state. If 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |is_control_group| is true, this will go through some of the mechanics of 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // starting a prerender, without actually creating the RenderView. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |creator_child_id| is the id of the child process that caused the prerender 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to be created, and is needed so that the prerendered URLs can be sent to it 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so render-initiated navigations will swap in the prerendered page. |size| 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // indicates the rectangular dimensions that the prerendered page should be. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |session_storage_namespace| indicates the namespace that the prerendered 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page should be part of. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void StartPrerendering( 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int creator_child_id, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& size, 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::SessionStorageNamespace* session_storage_namespace, 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::URLRequestContextGetter* request_context); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verifies that the prerendering is not using too many resources, and kills 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it if not. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DestroyWhenUsingTooManyResources(); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* GetRenderViewHostMutable(); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::RenderViewHost* GetRenderViewHost() const; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderManager* prerender_manager() { return prerender_manager_; } 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 title() const { return title_; } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id() const { return page_id_; } 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& prerender_url() const { return prerender_url_; } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::Referrer& referrer() const { return referrer_; } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_stopped_loading() const { return has_stopped_loading_; } 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_finished_loading() const { return has_finished_loading_; } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerendering_has_started() const { return prerendering_has_started_; } 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchCompleteStatus match_complete_status() const { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return match_complete_status_; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_match_complete_status(MatchCompleteStatus status) { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match_complete_status_ = status; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the parameter to the value of the associated RenderViewHost's child id 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and returns a boolean indicating the validity of that id. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetChildId(int* child_id) const; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the parameter to the value of the associated RenderViewHost's route id 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and returns a boolean indicating the validity of that id. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetRouteId(int* route_id) const; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus final_status() const { return final_status_; } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin() const { return origin_; } 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 experiment_id() const { return experiment_id_; } 1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int child_id() const { return child_id_; } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks load_start_time() const { return load_start_time_; } 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates whether this prerendered page can be used for the provided 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |url| and |session_storage_namespace|. 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Matches( 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::SessionStorageNamespace* session_storage_namespace) const; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content::WebContentsObserver implementation. 208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void RenderFrameCreated( 209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RenderFrameHost* render_frame_host) OVERRIDE; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DidStopLoading( 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* render_view_host) OVERRIDE; 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DocumentLoadedInFrame( 213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* render_frame_host) OVERRIDE; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DidStartProvisionalLoadForFrame( 215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* render_frame_host, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& validated_url, 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_error_page, 218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool is_iframe_srcdoc) OVERRIDE; 219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void DidFinishLoad(content::RenderFrameHost* render_frame_host, 220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& validated_url) OVERRIDE; 2210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) virtual void DidNavigateMainFrame( 2220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const content::LoadCommittedDetails& details, 2230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const content::FrameNavigateParams& params) OVERRIDE; 2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void DidGetRedirectForResourceRequest( 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::RenderViewHost* render_view_host, 2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const content::ResourceRedirectDetails& details) OVERRIDE; 2278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content::NotificationObserver 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Checks that a URL may be prerendered, for one of the many redirections. If 2370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // the URL can not be prerendered - for example, it's an ftp URL - |this| will 2380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // be destroyed and false is returned. Otherwise, true is returned. 2390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) virtual bool CheckURL(const GURL& url); 2400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Adds an alias URL. If the URL can not be prerendered, |this| will be 2420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // destroyed and false is returned. 2430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) bool AddAliasURL(const GURL& url); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The prerender WebContents (may be NULL). 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* prerender_contents() const { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_contents_.get(); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* ReleasePrerenderContents(); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the final status, calls OnDestroy and adds |this| to the 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PrerenderManager's pending deletes list. 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Destroy(FinalStatus reason); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by the history tab helper with the information that it woudl have 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // added to the history service had this web contents not been used for 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // prerendering. 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DidNavigate(const history::HistoryAddPageArgs& add_page_args); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Applies all the URL history encountered during prerendering to the 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // new tab. 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CommitHistory(content::WebContents* tab); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Value* GetAsValue() const; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns whether a pending cross-site navigation is happening. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This could happen with renderer-issued navigations, such as a 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MouseEvent being dispatched by a link to a website installed as an app. 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsCrossSiteNavigationPending() const; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Marks prerender as used and releases any throttled resource requests. 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void PrepareForUse(); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::SessionStorageNamespace* GetSessionStorageNamespace() const; 2764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Cookie events 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) enum CookieEvent { 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) COOKIE_EVENT_SEND = 0, 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) COOKIE_EVENT_CHANGE = 1, 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) COOKIE_EVENT_MAX 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Record a cookie transaction for this prerender contents. 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // In the event of cookies being sent, |earliest_create_date| contains 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the time that the earliest of the cookies sent was created. 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void RecordCookieEvent(CookieEvent event, 28823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) bool is_main_frame_http_request, 28923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) bool is_third_party_cookie, 29023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) bool is_for_blocking_resource, 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time earliest_create_date); 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static const int kNumCookieStatuses; 29423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) static const int kNumCookieSendTypes; 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Called when a PrerenderResourceThrottle defers a request. If the prerender 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // is used it'll be resumed on the IO thread, otherwise they will get 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // cancelled automatically if prerendering is cancelled. 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void AddResourceThrottle( 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::WeakPtr<PrerenderResourceThrottle>& throttle); 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Increments the number of bytes fetched over the network for this prerender. 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void AddNetworkBytes(int64 bytes); 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents(PrerenderManager* prerender_manager, 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::Referrer& referrer, 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin, 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 experiment_id); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Set the final status for how the PrerenderContents was used. This 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // should only be called once, and should be called before the prerender 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // contents are destroyed. 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetFinalStatus(FinalStatus final_status); 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // These call out to methods on our Observers, using our observer_list_. Note 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // that NotifyPrerenderStop() also clears the observer list. 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void NotifyPrerenderStart(); 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void NotifyPrerenderStopLoading(); 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void NotifyPrerenderDomContentLoaded(); 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void NotifyPrerenderStop(); 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void NotifyPrerenderCreatedMatchCompleteReplacement( 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderContents* replacement); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called whenever a RenderViewHost is created for prerendering. Only called 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // once the RenderViewHost has a RenderView and RenderWidgetHostView. 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnRenderViewHostCreated( 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* new_render_view_host); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar& notification_registrar() { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return notification_registrar_; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerendering_has_been_cancelled() const { 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerendering_has_been_cancelled_; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WebContents* CreateWebContents( 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::SessionStorageNamespace* session_storage_namespace); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerendering_has_started_; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Time at which we started to load the URL. This is used to compute 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the time elapsed from initiating a prerender until the time the 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (potentially only partially) prerendered page is shown to the user. 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks load_start_time_; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // The prerendered WebContents; may be null. 351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<content::WebContents> prerender_contents_; 352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The session storage namespace id for use in matching. We must save it 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // rather than get it from the RenderViewHost since in the control group 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // we won't have a RenderViewHost. 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 session_storage_namespace_id_; 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The time at which we started prerendering, for the purpose of comparing 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // cookie creation times. 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time start_time_; 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class WebContentsDelegateImpl; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Needs to be able to call the constructor. 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class PrerenderContentsFactoryImpl; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the ProcessMetrics for the render process, if it exists. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ProcessMetrics* MaybeGetProcessMetrics(); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Message handlers. 3728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void OnCancelPrerenderForPrinting(); 3738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ObserverList<Observer> observer_list_; 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The prerender manager owning this object. 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* prerender_manager_; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The URL being prerendered. 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL prerender_url_; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The referrer. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Referrer referrer_; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The profile being used 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile_; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Information about the title and URL of the page that this class as a 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderViewHostDelegate has received from the RenderView. 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to apply to the new RenderViewHost delegate that might eventually 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // own the contained RenderViewHost when the prerendered page is shown 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in a WebContents. 393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 title_; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id_; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar notification_registrar_; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A vector of URLs that this prerendered page matches against. 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This array can contain more than element as a result of redirects, 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // such as HTTP redirects or javascript redirects. 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> alias_urls_; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_stopped_loading_; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True when the main frame has finished loading. 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_finished_loading_; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This must be the same value as the PrerenderTracker has recorded for 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |this|, when |this| has a RenderView. 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus final_status_; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The MatchComplete status of the prerender, indicating how it relates 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to being a MatchComplete dummy (see definition of MatchCompleteStatus 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // above). 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchCompleteStatus match_complete_status_; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tracks whether or not prerendering has been cancelled by calling Destroy. 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used solely to prevent double deletion. 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerendering_has_been_cancelled_; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Process Metrics of the render process associated with the 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderViewHost for this object. 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::ProcessMetrics> process_metrics_; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<WebContentsDelegateImpl> web_contents_delegate_; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These are -1 before a RenderView is created. 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int child_id_; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id_; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Origin for this prerender. 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin_; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Experiment during which this prerender is performed. 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 experiment_id_; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The process that created the child id. 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int creator_child_id_; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The size of the WebView from the launching page. 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size_; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<history::HistoryAddPageArgs> AddPageVector; 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Caches pages to be added to the history. 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPageVector add_page_vector_; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The alias session storage namespace for this prerender. 449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<content::SessionStorageNamespace> 450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) alias_session_storage_namespace; 451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Indicates what internal cookie events (see prerender_contents.cc) have 4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // occurred, using 1 bit for each possible InternalCookieEvent. 4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int cookie_status_; 4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 45623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Indicates whether existing cookies were sent for this prerender, and 45723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // whether they were third-party cookies, and whether they were for blocking 45823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // resources. See the enum CookieSendType in prerender_contents.cc 45923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int cookie_send_type_; 46023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Resources that are throttled, pending a prerender use. Can only access a 4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // throttle on the IO thread. 4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<base::WeakPtr<PrerenderResourceThrottle> > resource_throttles_; 4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // A running tally of the number of bytes this prerender has caused to be 4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // transferred over the network for resources. Updated with AddNetworkBytes. 4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 network_bytes_; 468a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PrerenderContents); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace prerender 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_PRERENDER_PRERENDER_CONTENTS_H_ 475