1 // Copyright 2013 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.
5 #ifndef CONTENT_BROWSER_FRAME_HOST_NAVIGATION_ENTRY_IMPL_H_
6 #define CONTENT_BROWSER_FRAME_HOST_NAVIGATION_ENTRY_IMPL_H_
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"
19 class CONTENT_EXPORT NavigationEntryImpl
20 : public NON_EXPORTED_BASE(NavigationEntry
) {
22 static NavigationEntryImpl
* FromNavigationEntry(NavigationEntry
* entry
);
24 // The value of bindings() before it is set during commit.
25 static int kInvalidBindings
;
27 NavigationEntryImpl();
28 NavigationEntryImpl(SiteInstanceImpl
* instance
,
31 const Referrer
& referrer
,
32 const base::string16
& title
,
33 PageTransition transition_type
,
34 bool is_renderer_initiated
);
35 virtual ~NavigationEntryImpl();
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 base::string16
& title
) OVERRIDE
;
49 virtual const base::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 base::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 base::string16
& data
) OVERRIDE
;
84 virtual bool GetExtraData(const std::string
& key
,
85 base::string16
* data
) const OVERRIDE
;
86 virtual void ClearExtraData(const std::string
& key
) OVERRIDE
;
87 virtual void SetHttpStatusCode(int http_status_code
) OVERRIDE
;
88 virtual int GetHttpStatusCode() const OVERRIDE
;
90 // Once a navigation entry is committed, we should no longer track several
91 // pieces of non-persisted state, as documented on the members below.
92 void ResetForCommit();
94 void set_unique_id(int unique_id
) {
95 unique_id_
= unique_id
;
98 // The SiteInstance tells us how to share sub-processes. This is a reference
99 // counted pointer to a shared site instance.
101 // Note that the SiteInstance should usually not be changed after it is set,
102 // but this may happen if the NavigationEntry was cloned and needs to use a
103 // different SiteInstance.
104 void set_site_instance(SiteInstanceImpl
* site_instance
);
105 SiteInstanceImpl
* site_instance() const {
106 return site_instance_
.get();
109 // Remember the set of bindings granted to this NavigationEntry at the time
110 // of commit, to ensure that we do not grant it additional bindings if we
111 // navigate back to it in the future. This can only be changed once.
112 void SetBindings(int bindings
);
113 int bindings() const {
117 void set_page_type(PageType page_type
) {
118 page_type_
= page_type
;
121 bool has_virtual_url() const {
122 return !virtual_url_
.is_empty();
125 bool update_virtual_url_with_url() const {
126 return update_virtual_url_with_url_
;
128 void set_update_virtual_url_with_url(bool update
) {
129 update_virtual_url_with_url_
= update
;
132 // Extra headers (separated by \n) to send during the request.
133 void set_extra_headers(const std::string
& extra_headers
) {
134 extra_headers_
= extra_headers
;
136 const std::string
& extra_headers() const {
137 return extra_headers_
;
140 // Whether this (pending) navigation is renderer-initiated. Resets to false
141 // for all types of navigations after commit.
142 void set_is_renderer_initiated(bool is_renderer_initiated
) {
143 is_renderer_initiated_
= is_renderer_initiated
;
145 bool is_renderer_initiated() const {
146 return is_renderer_initiated_
;
149 void set_user_typed_url(const GURL
& user_typed_url
) {
150 user_typed_url_
= user_typed_url
;
153 // Enumerations of the possible restore types.
155 // Restore from the previous session.
156 RESTORE_LAST_SESSION_EXITED_CLEANLY
,
157 RESTORE_LAST_SESSION_CRASHED
,
159 // The entry has been restored from the current session. This is used when
160 // the user issues 'reopen closed tab'.
161 RESTORE_CURRENT_SESSION
,
163 // The entry was not restored.
167 // The RestoreType for this entry. This is set if the entry was retored. This
168 // is set to RESTORE_NONE once the entry is loaded.
169 void set_restore_type(RestoreType type
) {
170 restore_type_
= type
;
172 RestoreType
restore_type() const {
173 return restore_type_
;
176 void set_transferred_global_request_id(
177 const GlobalRequestID
& transferred_global_request_id
) {
178 transferred_global_request_id_
= transferred_global_request_id
;
181 GlobalRequestID
transferred_global_request_id() const {
182 return transferred_global_request_id_
;
185 // Whether this (pending) navigation needs to replace current entry.
186 // Resets to false after commit.
187 bool should_replace_entry() const {
188 return should_replace_entry_
;
191 void set_should_replace_entry(bool should_replace_entry
) {
192 should_replace_entry_
= should_replace_entry
;
195 // Any redirects present in a pending entry when it is transferred from one
196 // process to another. Not valid after commit.
197 const std::vector
<GURL
>& redirect_chain() const {
198 return redirect_chain_
;
201 void set_redirect_chain(const std::vector
<GURL
>& redirect_chain
) {
202 redirect_chain_
= redirect_chain
;
205 void SetScreenshotPNGData(scoped_refptr
<base::RefCountedBytes
> png_data
);
206 const scoped_refptr
<base::RefCountedBytes
> screenshot() const {
210 // Whether this (pending) navigation should clear the session history. Resets
211 // to false after commit.
212 bool should_clear_history_list() const {
213 return should_clear_history_list_
;
215 void set_should_clear_history_list(bool should_clear_history_list
) {
216 should_clear_history_list_
= should_clear_history_list
;
219 // Indicates which FrameTreeNode to navigate. Currently only used if the
220 // --site-per-process flag is passed.
221 int64
frame_tree_node_id() const {
222 return frame_tree_node_id_
;
224 void set_frame_tree_node_id(int64 frame_tree_node_id
) {
225 frame_tree_node_id_
= frame_tree_node_id
;
229 // WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
230 // Session/Tab restore save portions of this class so that it can be recreated
231 // later. If you add a new field that needs to be persisted you'll have to
232 // update SessionService/TabRestoreService and Android WebView
233 // state_serializer.cc appropriately.
234 // WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
236 // See the accessors above for descriptions.
238 scoped_refptr
<SiteInstanceImpl
> site_instance_
;
239 // TODO(creis): Persist bindings_. http://crbug.com/173672.
245 bool update_virtual_url_with_url_
;
246 base::string16 title_
;
247 FaviconStatus favicon_
;
248 PageState page_state_
;
251 PageTransition transition_type_
;
252 GURL user_typed_url_
;
255 RestoreType restore_type_
;
256 GURL original_request_url_
;
257 bool is_overriding_user_agent_
;
258 base::Time timestamp_
;
259 int http_status_code_
;
261 // This member is not persisted with session restore because it is transient.
262 // If the post request succeeds, this field is cleared since the same
263 // information is stored in |content_state_| above. It is also only shallow
264 // copied with compiler provided copy constructor.
265 // Cleared in |ResetForCommit|.
266 scoped_refptr
<const base::RefCountedMemory
> browser_initiated_post_data_
;
268 // This is also a transient member (i.e. is not persisted with session
269 // restore). The screenshot of a page is taken when navigating away from the
270 // page. This screenshot is displayed during an overscroll-navigation
271 // gesture. |screenshot_| will be NULL when the screenshot is not available
272 // (e.g. after a session restore, or if taking the screenshot of a page
273 // failed). The UI is responsible for dealing with missing screenshots
274 // appropriately (e.g. display a placeholder image instead).
275 scoped_refptr
<base::RefCountedBytes
> screenshot_
;
277 // This member is not persisted with session restore.
278 std::string extra_headers_
;
280 // Used for specifying base URL for pages loaded via data URLs. Only used and
281 // persisted by Android WebView.
282 GURL base_url_for_data_url_
;
284 // Whether the entry, while loading, was created for a renderer-initiated
285 // navigation. This dictates whether the URL should be displayed before the
286 // navigation commits. It is cleared in |ResetForCommit| and not persisted.
287 bool is_renderer_initiated_
;
289 // This is a cached version of the result of GetTitleForDisplay. It prevents
290 // us from having to do URL formatting on the URL every time the title is
291 // displayed. When the URL, virtual URL, or title is set, this should be
292 // cleared to force a refresh.
293 mutable base::string16 cached_display_title_
;
295 // In case a navigation is transferred to a new RVH but the request has
296 // been generated in the renderer already, this identifies the old request so
297 // that it can be resumed. The old request is stored until the
298 // ResourceDispatcher receives the navigation from the renderer which
299 // carries this |transferred_global_request_id_| annotation. Once the request
300 // is transferred to the new process, this is cleared and the request
301 // continues as normal.
302 // Cleared in |ResetForCommit|.
303 GlobalRequestID transferred_global_request_id_
;
305 // This is set to true when this entry is being reloaded and due to changes in
306 // the state of the URL, it has to be reloaded in a different site instance.
307 // In such case, we must treat it as an existing navigation in the new site
308 // instance, instead of a new navigation. This value should not be persisted
309 // and is cleared in |ResetForCommit|.
311 // We also use this flag for cross-process redirect navigations, so that the
312 // browser will replace the current navigation entry (which is the page
313 // doing the redirect).
314 bool should_replace_entry_
;
316 // This is used when transferring a pending entry from one process to another.
317 // It is cleared in |ResetForCommit| and should not be persisted.
318 std::vector
<GURL
> redirect_chain_
;
320 // This is set to true when this entry's navigation should clear the session
321 // history both on the renderer and browser side. The browser side history
322 // won't be cleared until the renderer has committed this navigation. This
323 // entry is not persisted by the session restore system, as it is always
324 // cleared in |ResetForCommit|.
325 bool should_clear_history_list_
;
327 // Set when this entry should be able to access local file:// resources. This
328 // value is not needed after the entry commits and is not persisted.
329 bool can_load_local_resources_
;
331 // If not empty, the name of the frame to navigate. This field is not
332 // persisted, because it is currently only used in tests.
333 std::string frame_to_navigate_
;
335 // If not -1, this indicates which FrameTreeNode to navigate. This field is
336 // not persisted because it is experimental and only used when the
337 // --site-per-process flag is passed. It is cleared in |ResetForCommit|
338 // because we only use it while the navigation is pending.
339 // TODO(creis): Move this to FrameNavigationEntry.
340 int64 frame_tree_node_id_
;
342 // Used to store extra data to support browser features. This member is not
343 // persisted, unless specific data is taken out/put back in at save/restore
344 // time (see TabNavigation for an example of this).
345 std::map
<std::string
, base::string16
> extra_data_
;
347 // Copy and assignment is explicitly allowed for this class.
350 } // namespace content
352 #endif // CONTENT_BROWSER_FRAME_HOST_NAVIGATION_ENTRY_IMPL_H_