1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file. 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#ifndef CHROME_BROWSER_INSTANT_INSTANT_LOADER_H_ 6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#define CHROME_BROWSER_INSTANT_INSTANT_LOADER_H_ 7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#pragma once 8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/basictypes.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/string16.h" 12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/timer.h" 13731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/instant/instant_commit_type.h" 14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/search_engines/template_url_id.h" 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/instant_types.h" 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h" 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h" 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/page_transition_types.h" 19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "googleurl/src/gurl.h" 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h" 21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass InstantLoaderDelegate; 23731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass InstantLoaderManagerTest; 24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass TabContents; 25201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass TabContentsWrapper; 26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass TemplateURL; 27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// InstantLoader does the loading of a particular URL for InstantController. 29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// InstantLoader notifies its delegate, which is typically InstantController, of 30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// all interesting events. 31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// 32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// InstantLoader is created with a TemplateURLID. If non-zero InstantLoader 33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// first determines if the site actually supports instant. If it doesn't, the 34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// delegate is notified by way of |InstantLoaderDoesntSupportInstant|. 35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// 36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// If the TemplateURLID supplied to the constructor is zero, then the url is 37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// loaded as is. 384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass InstantLoader : public NotificationObserver { 39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public: 40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick InstantLoader(InstantLoaderDelegate* delegate, TemplateURLID id); 414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual ~InstantLoader(); 42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Invoked to load a URL. |tab_contents| is the TabContents the preview is 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // going to be shown on top of and potentially replace. Returns true if the 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // arguments differ from the last call to |Update|. 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool Update(TabContentsWrapper* tab_contents, 47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const TemplateURL* template_url, 48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const GURL& url, 49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick PageTransition::Type transition_type, 50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const string16& user_text, 51201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch bool verbatim, 52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen string16* suggested_text); 53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Sets the bounds of the omnibox (in screen coordinates). The bounds are 55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // remembered until the preview is committed or destroyed. This is only used 56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // when showing results for a search provider that supports instant. 57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void SetOmniboxBounds(const gfx::Rect& bounds); 58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Returns true if the mouse is down as the result of activating the preview 60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // content. 61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool IsMouseDownFromActivate(); 62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Releases the preview TabContents passing ownership to the caller. This is 64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // intended to be called when the preview TabContents is committed. This does 65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // not notify the delegate. 66201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch TabContentsWrapper* ReleasePreviewContents(InstantCommitType type); 67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Calls through to method of same name on delegate. 69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool ShouldCommitInstantOnMouseUp(); 70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void CommitInstantLoader(); 71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // NotificationObserver: 734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual void Observe(NotificationType type, 744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const NotificationSource& source, 75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const NotificationDetails& details) OVERRIDE; 764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // The preview TabContents; may be null. 78201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch TabContentsWrapper* preview_contents() const { 79201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return preview_contents_.get(); 80201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Returns true if the preview TabContents is ready to be shown. 83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool ready() const { return ready_; } 84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Returns true if the current load returned a 200. 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool http_status_ok() const { return http_status_ok_; } 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Returns true if the url needs to be reloaded. This is set to true for 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // downloads. 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool needs_reload() const { return needs_reload_; } 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const GURL& url() const { return url_; } 93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 94201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch bool verbatim() const { return verbatim_; } 95201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Are we showing instant results? 97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool is_showing_instant() const { return template_url_id_ != 0; } 98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // If we're showing instant this returns non-zero. 100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TemplateURLID template_url_id() const { return template_url_id_; } 101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // See description above field. 103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const string16& user_text() const { return user_text_; } 104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private: 106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick friend class InstantLoaderManagerTest; 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen friend class InstantTest; 108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen class FrameLoadObserver; 109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen class PaintObserverImpl; 110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen class TabContentsDelegateImpl; 111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Invoked when the page wants to update the suggested text. If |user_text_| 113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // starts with |suggested_text|, then the delegate is notified of the change, 114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // which results in updating the omnibox. 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void SetCompleteSuggestedText(const string16& suggested_text, 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen InstantCompleteBehavior behavior); 117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Invoked when the page paints. 119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void PreviewPainted(); 120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Invoked when the http status code changes. This may notify the delegate. 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void SetHTTPStatusOK(bool is_ok); 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Invoked to show the preview. This is invoked in two possible cases: when 125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // the renderer paints, or when an auth dialog is shown. This notifies the 126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // delegate the preview is ready to be shown. 127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void ShowPreview(); 128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Invoked once the page has finished loading and the script has been sent. 130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void PageFinishedLoading(); 131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Returns the bounds of the omnibox in terms of the preview tab contents. 133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gfx::Rect GetOmniboxBoundsInTermsOfPreview(); 134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Are we waiting for the preview page to finish loading? 136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool is_waiting_for_load() const { 137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return frame_load_observer_.get() != NULL; 138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 140731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Invoked if it the page doesn't really support instant when we thought it 141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // did. If |needs_reload| is true, the text changed since the first load and 142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // the page needs to be reloaded. 143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void PageDoesntSupportInstant(bool needs_reload); 144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 145201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Invokes |SetBoundsToPage(false)|. This is called from the timer. 146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void ProcessBoundsChange(); 147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 148201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Notifes the page of the omnibox bounds. If |force_if_loading| is true the 149201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // bounds are sent down even if we're waiting on the load, otherwise if we're 150201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // waiting on the load and |force_if_loading| is false this does nothing. 151201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch void SendBoundsToPage(bool force_if_loading); 152201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 153201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Creates and sets the preview TabContentsWrapper. 154201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch void CreatePreviewContents(TabContentsWrapper* tab_contents); 155201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick InstantLoaderDelegate* delegate_; 157731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // If we're showing instant results this is the ID of the TemplateURL driving 159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // the results. A value of 0 means there is no TemplateURL. 160201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const TemplateURLID template_url_id_; 161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // The url we're displaying. 163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GURL url_; 164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 165bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Delegate of the preview TabContents. Used to detect when the user does some 166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // gesture on the TabContents and the preview needs to be activated. 167bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen scoped_ptr<TabContentsDelegateImpl> preview_tab_contents_delegate_; 168bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 169bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // The preview TabContents; may be null. 170201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch scoped_ptr<TabContentsWrapper> preview_contents_; 171bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 172731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Is the preview_contents ready to be shown? 173731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool ready_; 174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Was the last status code a 200? 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool http_status_ok_; 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 178201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // The text the user typed in the omnibox, stripped of the leading ?, if any. 179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen string16 user_text_; 180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // The latest suggestion from the page. 182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen string16 complete_suggested_text_; 183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 184201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // The latest suggestion (suggested text less the user text). 185201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch string16 last_suggestion_; 186201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 187bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // See description above setter. 188bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gfx::Rect omnibox_bounds_; 189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 190731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Last bounds passed to the page. 191731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick gfx::Rect last_omnibox_bounds_; 192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 193731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_ptr<FrameLoadObserver> frame_load_observer_; 194bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Transition type of the match last passed to Update. 196bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen PageTransition::Type last_transition_type_; 197bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Timer used to update the bounds of the omnibox. 199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick base::OneShotTimer<InstantLoader> update_bounds_timer_; 200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 2014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Used to get notifications about renderers coming and going. 2024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch NotificationRegistrar registrar_; 2034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 204201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Last value of verbatim passed to |Update|. 205201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch bool verbatim_; 206201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // True if the page needs to be reloaded. 208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool needs_reload_; 209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DISALLOW_COPY_AND_ASSIGN(InstantLoader); 211bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif // CHROME_BROWSER_INSTANT_INSTANT_LOADER_H_ 214