1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CONTENT_BROWSER_WEB_CONTENTS_NAVIGATION_ENTRY_IMPL_H_ 6 #define CONTENT_BROWSER_WEB_CONTENTS_NAVIGATION_ENTRY_IMPL_H_ 7 8 #include "base/basictypes.h" 9 #include "base/memory/ref_counted.h" 10 #include "content/browser/site_instance_impl.h" 11 #include "content/public/browser/favicon_status.h" 12 #include "content/public/browser/global_request_id.h" 13 #include "content/public/browser/navigation_entry.h" 14 #include "content/public/common/page_state.h" 15 #include "content/public/common/ssl_status.h" 16 17 namespace content { 18 19 class CONTENT_EXPORT NavigationEntryImpl 20 : public NON_EXPORTED_BASE(NavigationEntry) { 21 public: 22 static NavigationEntryImpl* FromNavigationEntry(NavigationEntry* entry); 23 24 // The value of bindings() before it is set during commit. 25 static int kInvalidBindings; 26 27 NavigationEntryImpl(); 28 NavigationEntryImpl(SiteInstanceImpl* instance, 29 int page_id, 30 const GURL& url, 31 const Referrer& referrer, 32 const string16& title, 33 PageTransition transition_type, 34 bool is_renderer_initiated); 35 virtual ~NavigationEntryImpl(); 36 37 // NavigationEntry implementation: 38 virtual int GetUniqueID() const OVERRIDE; 39 virtual PageType GetPageType() const OVERRIDE; 40 virtual void SetURL(const GURL& url) OVERRIDE; 41 virtual const GURL& GetURL() const OVERRIDE; 42 virtual void SetBaseURLForDataURL(const GURL& url) OVERRIDE; 43 virtual const GURL& GetBaseURLForDataURL() const OVERRIDE; 44 virtual void SetReferrer(const Referrer& referrer) OVERRIDE; 45 virtual const Referrer& GetReferrer() const OVERRIDE; 46 virtual void SetVirtualURL(const GURL& url) OVERRIDE; 47 virtual const GURL& GetVirtualURL() const OVERRIDE; 48 virtual void SetTitle(const string16& title) OVERRIDE; 49 virtual const string16& GetTitle() const OVERRIDE; 50 virtual void SetPageState(const PageState& state) OVERRIDE; 51 virtual const PageState& GetPageState() const OVERRIDE; 52 virtual void SetPageID(int page_id) OVERRIDE; 53 virtual int32 GetPageID() const OVERRIDE; 54 virtual const string16& GetTitleForDisplay( 55 const std::string& languages) const OVERRIDE; 56 virtual bool IsViewSourceMode() const OVERRIDE; 57 virtual void SetTransitionType(PageTransition transition_type) OVERRIDE; 58 virtual PageTransition GetTransitionType() const OVERRIDE; 59 virtual const GURL& GetUserTypedURL() const OVERRIDE; 60 virtual void SetHasPostData(bool has_post_data) OVERRIDE; 61 virtual bool GetHasPostData() const OVERRIDE; 62 virtual void SetPostID(int64 post_id) OVERRIDE; 63 virtual int64 GetPostID() const OVERRIDE; 64 virtual void SetBrowserInitiatedPostData( 65 const base::RefCountedMemory* data) OVERRIDE; 66 virtual const base::RefCountedMemory* 67 GetBrowserInitiatedPostData() const OVERRIDE; 68 virtual const FaviconStatus& GetFavicon() const OVERRIDE; 69 virtual FaviconStatus& GetFavicon() OVERRIDE; 70 virtual const SSLStatus& GetSSL() const OVERRIDE; 71 virtual SSLStatus& GetSSL() OVERRIDE; 72 virtual void SetOriginalRequestURL(const GURL& original_url) OVERRIDE; 73 virtual const GURL& GetOriginalRequestURL() const OVERRIDE; 74 virtual void SetIsOverridingUserAgent(bool override) OVERRIDE; 75 virtual bool GetIsOverridingUserAgent() const OVERRIDE; 76 virtual void SetTimestamp(base::Time timestamp) OVERRIDE; 77 virtual base::Time GetTimestamp() const OVERRIDE; 78 virtual void SetCanLoadLocalResources(bool allow) OVERRIDE; 79 virtual bool GetCanLoadLocalResources() const OVERRIDE; 80 virtual void SetFrameToNavigate(const std::string& frame_name) OVERRIDE; 81 virtual const std::string& GetFrameToNavigate() const OVERRIDE; 82 virtual void SetExtraData(const std::string& key, 83 const string16& data) OVERRIDE; 84 virtual bool GetExtraData(const std::string& key, 85 string16* data) const OVERRIDE; 86 virtual void ClearExtraData(const std::string& key) OVERRIDE; 87 88 void set_unique_id(int unique_id) { 89 unique_id_ = unique_id; 90 } 91 92 // The SiteInstance tells us how to share sub-processes. This is a reference 93 // counted pointer to a shared site instance. 94 // 95 // Note that the SiteInstance should usually not be changed after it is set, 96 // but this may happen if the NavigationEntry was cloned and needs to use a 97 // different SiteInstance. 98 void set_site_instance(SiteInstanceImpl* site_instance); 99 SiteInstanceImpl* site_instance() const { 100 return site_instance_.get(); 101 } 102 103 // Remember the set of bindings granted to this NavigationEntry at the time 104 // of commit, to ensure that we do not grant it additional bindings if we 105 // navigate back to it in the future. This can only be changed once. 106 void SetBindings(int bindings); 107 int bindings() const { 108 return bindings_; 109 } 110 111 void set_page_type(PageType page_type) { 112 page_type_ = page_type; 113 } 114 115 bool has_virtual_url() const { 116 return !virtual_url_.is_empty(); 117 } 118 119 bool update_virtual_url_with_url() const { 120 return update_virtual_url_with_url_; 121 } 122 void set_update_virtual_url_with_url(bool update) { 123 update_virtual_url_with_url_ = update; 124 } 125 126 // Extra headers (separated by \n) to send during the request. 127 void set_extra_headers(const std::string& extra_headers) { 128 extra_headers_ = extra_headers; 129 } 130 const std::string& extra_headers() const { 131 return extra_headers_; 132 } 133 134 // Whether this (pending) navigation is renderer-initiated. Resets to false 135 // for all types of navigations after commit. 136 void set_is_renderer_initiated(bool is_renderer_initiated) { 137 is_renderer_initiated_ = is_renderer_initiated; 138 } 139 bool is_renderer_initiated() const { 140 return is_renderer_initiated_; 141 } 142 143 void set_user_typed_url(const GURL& user_typed_url) { 144 user_typed_url_ = user_typed_url; 145 } 146 147 // Enumerations of the possible restore types. 148 enum RestoreType { 149 // Restore from the previous session. 150 RESTORE_LAST_SESSION_EXITED_CLEANLY, 151 RESTORE_LAST_SESSION_CRASHED, 152 153 // The entry has been restored from the current session. This is used when 154 // the user issues 'reopen closed tab'. 155 RESTORE_CURRENT_SESSION, 156 157 // The entry was not restored. 158 RESTORE_NONE 159 }; 160 161 // The RestoreType for this entry. This is set if the entry was retored. This 162 // is set to RESTORE_NONE once the entry is loaded. 163 void set_restore_type(RestoreType type) { 164 restore_type_ = type; 165 } 166 RestoreType restore_type() const { 167 return restore_type_; 168 } 169 170 void set_transferred_global_request_id( 171 const GlobalRequestID& transferred_global_request_id) { 172 transferred_global_request_id_ = transferred_global_request_id; 173 } 174 175 GlobalRequestID transferred_global_request_id() const { 176 return transferred_global_request_id_; 177 } 178 179 // Whether this (pending) navigation needs to replace current entry. 180 // Resets to false after commit. 181 bool should_replace_entry() const { 182 return should_replace_entry_; 183 } 184 185 void set_should_replace_entry(bool should_replace_entry) { 186 should_replace_entry_ = should_replace_entry; 187 } 188 189 void SetScreenshotPNGData(scoped_refptr<base::RefCountedBytes> png_data); 190 const scoped_refptr<base::RefCountedBytes> screenshot() const { 191 return screenshot_; 192 } 193 194 // Whether this (pending) navigation should clear the session history. Resets 195 // to false after commit. 196 bool should_clear_history_list() const { 197 return should_clear_history_list_; 198 } 199 void set_should_clear_history_list(bool should_clear_history_list) { 200 should_clear_history_list_ = should_clear_history_list; 201 } 202 203 private: 204 // WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING 205 // Session/Tab restore save portions of this class so that it can be recreated 206 // later. If you add a new field that needs to be persisted you'll have to 207 // update SessionService/TabRestoreService and Android WebView 208 // state_serializer.cc appropriately. 209 // WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING 210 211 // See the accessors above for descriptions. 212 int unique_id_; 213 scoped_refptr<SiteInstanceImpl> site_instance_; 214 // TODO(creis): Persist bindings_. http://crbug.com/173672. 215 int bindings_; 216 PageType page_type_; 217 GURL url_; 218 Referrer referrer_; 219 GURL virtual_url_; 220 bool update_virtual_url_with_url_; 221 string16 title_; 222 FaviconStatus favicon_; 223 PageState page_state_; 224 int32 page_id_; 225 SSLStatus ssl_; 226 PageTransition transition_type_; 227 GURL user_typed_url_; 228 bool has_post_data_; 229 int64 post_id_; 230 RestoreType restore_type_; 231 GURL original_request_url_; 232 bool is_overriding_user_agent_; 233 base::Time timestamp_; 234 235 // This member is not persisted with session restore because it is transient. 236 // If the post request succeeds, this field is cleared since the same 237 // information is stored in |content_state_| above. It is also only shallow 238 // copied with compiler provided copy constructor. 239 scoped_refptr<const base::RefCountedMemory> browser_initiated_post_data_; 240 241 // This is also a transient member (i.e. is not persisted with session 242 // restore). The screenshot of a page is taken when navigating away from the 243 // page. This screenshot is displayed during an overscroll-navigation 244 // gesture. |screenshot_| will be NULL when the screenshot is not available 245 // (e.g. after a session restore, or if taking the screenshot of a page 246 // failed). The UI is responsible for dealing with missing screenshots 247 // appropriately (e.g. display a placeholder image instead). 248 scoped_refptr<base::RefCountedBytes> screenshot_; 249 250 // This member is not persisted with session restore. 251 std::string extra_headers_; 252 253 // Used for specifying base URL for pages loaded via data URLs. Only used and 254 // persisted by Android WebView. 255 GURL base_url_for_data_url_; 256 257 // Whether the entry, while loading, was created for a renderer-initiated 258 // navigation. This dictates whether the URL should be displayed before the 259 // navigation commits. It is cleared on commit and not persisted. 260 bool is_renderer_initiated_; 261 262 // This is a cached version of the result of GetTitleForDisplay. It prevents 263 // us from having to do URL formatting on the URL every time the title is 264 // displayed. When the URL, virtual URL, or title is set, this should be 265 // cleared to force a refresh. 266 mutable string16 cached_display_title_; 267 268 // In case a navigation is transferred to a new RVH but the request has 269 // been generated in the renderer already, this identifies the old request so 270 // that it can be resumed. The old request is stored until the 271 // ResourceDispatcher receives the navigation from the renderer which 272 // carries this |transferred_global_request_id_| annotation. Once the request 273 // is transferred to the new process, this is cleared and the request 274 // continues as normal. 275 GlobalRequestID transferred_global_request_id_; 276 277 // This is set to true when this entry is being reloaded and due to changes in 278 // the state of the URL, it has to be reloaded in a different site instance. 279 // In such case, we must treat it as an existing navigation in the new site 280 // instance, instead of a new navigation. This value should not be persisted 281 // and is not needed after the entry commits. 282 // 283 // We also use this flag for cross-process redirect navigations, so that the 284 // browser will replace the current navigation entry (which is the page 285 // doing the redirect). 286 bool should_replace_entry_; 287 288 // This is set to true when this entry's navigation should clear the session 289 // history both on the renderer and browser side. The browser side history 290 // won't be cleared until the renderer has committed this navigation. This 291 // entry is not persisted by the session restore system, as it is always 292 // reset to false after commit. 293 bool should_clear_history_list_; 294 295 // Set when this entry should be able to access local file:// resources. This 296 // value is not needed after the entry commits and is not persisted. 297 bool can_load_local_resources_; 298 299 // If not empty, the name of the frame to navigate. This field is not 300 // persisted, because it is currently only used in tests. 301 std::string frame_to_navigate_; 302 303 // Used to store extra data to support browser features. This member is not 304 // persisted, unless specific data is taken out/put back in at save/restore 305 // time (see TabNavigation for an example of this). 306 std::map<std::string, string16> extra_data_; 307 308 // Copy and assignment is explicitly allowed for this class. 309 }; 310 311 } // namespace content 312 313 #endif // CONTENT_BROWSER_WEB_CONTENTS_NAVIGATION_ENTRY_IMPL_H_ 314