OLD | NEW |
| (Empty) |
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 virtual void SetHttpStatusCode(int http_status_code) OVERRIDE; | |
88 virtual int GetHttpStatusCode() const OVERRIDE; | |
89 | |
90 void set_unique_id(int unique_id) { | |
91 unique_id_ = unique_id; | |
92 } | |
93 | |
94 // The SiteInstance tells us how to share sub-processes. This is a reference | |
95 // counted pointer to a shared site instance. | |
96 // | |
97 // Note that the SiteInstance should usually not be changed after it is set, | |
98 // but this may happen if the NavigationEntry was cloned and needs to use a | |
99 // different SiteInstance. | |
100 void set_site_instance(SiteInstanceImpl* site_instance); | |
101 SiteInstanceImpl* site_instance() const { | |
102 return site_instance_.get(); | |
103 } | |
104 | |
105 // Remember the set of bindings granted to this NavigationEntry at the time | |
106 // of commit, to ensure that we do not grant it additional bindings if we | |
107 // navigate back to it in the future. This can only be changed once. | |
108 void SetBindings(int bindings); | |
109 int bindings() const { | |
110 return bindings_; | |
111 } | |
112 | |
113 void set_page_type(PageType page_type) { | |
114 page_type_ = page_type; | |
115 } | |
116 | |
117 bool has_virtual_url() const { | |
118 return !virtual_url_.is_empty(); | |
119 } | |
120 | |
121 bool update_virtual_url_with_url() const { | |
122 return update_virtual_url_with_url_; | |
123 } | |
124 void set_update_virtual_url_with_url(bool update) { | |
125 update_virtual_url_with_url_ = update; | |
126 } | |
127 | |
128 // Extra headers (separated by \n) to send during the request. | |
129 void set_extra_headers(const std::string& extra_headers) { | |
130 extra_headers_ = extra_headers; | |
131 } | |
132 const std::string& extra_headers() const { | |
133 return extra_headers_; | |
134 } | |
135 | |
136 // Whether this (pending) navigation is renderer-initiated. Resets to false | |
137 // for all types of navigations after commit. | |
138 void set_is_renderer_initiated(bool is_renderer_initiated) { | |
139 is_renderer_initiated_ = is_renderer_initiated; | |
140 } | |
141 bool is_renderer_initiated() const { | |
142 return is_renderer_initiated_; | |
143 } | |
144 | |
145 void set_user_typed_url(const GURL& user_typed_url) { | |
146 user_typed_url_ = user_typed_url; | |
147 } | |
148 | |
149 // Enumerations of the possible restore types. | |
150 enum RestoreType { | |
151 // Restore from the previous session. | |
152 RESTORE_LAST_SESSION_EXITED_CLEANLY, | |
153 RESTORE_LAST_SESSION_CRASHED, | |
154 | |
155 // The entry has been restored from the current session. This is used when | |
156 // the user issues 'reopen closed tab'. | |
157 RESTORE_CURRENT_SESSION, | |
158 | |
159 // The entry was not restored. | |
160 RESTORE_NONE | |
161 }; | |
162 | |
163 // The RestoreType for this entry. This is set if the entry was retored. This | |
164 // is set to RESTORE_NONE once the entry is loaded. | |
165 void set_restore_type(RestoreType type) { | |
166 restore_type_ = type; | |
167 } | |
168 RestoreType restore_type() const { | |
169 return restore_type_; | |
170 } | |
171 | |
172 void set_transferred_global_request_id( | |
173 const GlobalRequestID& transferred_global_request_id) { | |
174 transferred_global_request_id_ = transferred_global_request_id; | |
175 } | |
176 | |
177 GlobalRequestID transferred_global_request_id() const { | |
178 return transferred_global_request_id_; | |
179 } | |
180 | |
181 // Whether this (pending) navigation needs to replace current entry. | |
182 // Resets to false after commit. | |
183 bool should_replace_entry() const { | |
184 return should_replace_entry_; | |
185 } | |
186 | |
187 void set_should_replace_entry(bool should_replace_entry) { | |
188 should_replace_entry_ = should_replace_entry; | |
189 } | |
190 | |
191 void SetScreenshotPNGData(scoped_refptr<base::RefCountedBytes> png_data); | |
192 const scoped_refptr<base::RefCountedBytes> screenshot() const { | |
193 return screenshot_; | |
194 } | |
195 | |
196 // Whether this (pending) navigation should clear the session history. Resets | |
197 // to false after commit. | |
198 bool should_clear_history_list() const { | |
199 return should_clear_history_list_; | |
200 } | |
201 void set_should_clear_history_list(bool should_clear_history_list) { | |
202 should_clear_history_list_ = should_clear_history_list; | |
203 } | |
204 | |
205 private: | |
206 // WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING | |
207 // Session/Tab restore save portions of this class so that it can be recreated | |
208 // later. If you add a new field that needs to be persisted you'll have to | |
209 // update SessionService/TabRestoreService and Android WebView | |
210 // state_serializer.cc appropriately. | |
211 // WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING | |
212 | |
213 // See the accessors above for descriptions. | |
214 int unique_id_; | |
215 scoped_refptr<SiteInstanceImpl> site_instance_; | |
216 // TODO(creis): Persist bindings_. http://crbug.com/173672. | |
217 int bindings_; | |
218 PageType page_type_; | |
219 GURL url_; | |
220 Referrer referrer_; | |
221 GURL virtual_url_; | |
222 bool update_virtual_url_with_url_; | |
223 string16 title_; | |
224 FaviconStatus favicon_; | |
225 PageState page_state_; | |
226 int32 page_id_; | |
227 SSLStatus ssl_; | |
228 PageTransition transition_type_; | |
229 GURL user_typed_url_; | |
230 bool has_post_data_; | |
231 int64 post_id_; | |
232 RestoreType restore_type_; | |
233 GURL original_request_url_; | |
234 bool is_overriding_user_agent_; | |
235 base::Time timestamp_; | |
236 int http_status_code_; | |
237 | |
238 // This member is not persisted with session restore because it is transient. | |
239 // If the post request succeeds, this field is cleared since the same | |
240 // information is stored in |content_state_| above. It is also only shallow | |
241 // copied with compiler provided copy constructor. | |
242 scoped_refptr<const base::RefCountedMemory> browser_initiated_post_data_; | |
243 | |
244 // This is also a transient member (i.e. is not persisted with session | |
245 // restore). The screenshot of a page is taken when navigating away from the | |
246 // page. This screenshot is displayed during an overscroll-navigation | |
247 // gesture. |screenshot_| will be NULL when the screenshot is not available | |
248 // (e.g. after a session restore, or if taking the screenshot of a page | |
249 // failed). The UI is responsible for dealing with missing screenshots | |
250 // appropriately (e.g. display a placeholder image instead). | |
251 scoped_refptr<base::RefCountedBytes> screenshot_; | |
252 | |
253 // This member is not persisted with session restore. | |
254 std::string extra_headers_; | |
255 | |
256 // Used for specifying base URL for pages loaded via data URLs. Only used and | |
257 // persisted by Android WebView. | |
258 GURL base_url_for_data_url_; | |
259 | |
260 // Whether the entry, while loading, was created for a renderer-initiated | |
261 // navigation. This dictates whether the URL should be displayed before the | |
262 // navigation commits. It is cleared on commit and not persisted. | |
263 bool is_renderer_initiated_; | |
264 | |
265 // This is a cached version of the result of GetTitleForDisplay. It prevents | |
266 // us from having to do URL formatting on the URL every time the title is | |
267 // displayed. When the URL, virtual URL, or title is set, this should be | |
268 // cleared to force a refresh. | |
269 mutable string16 cached_display_title_; | |
270 | |
271 // In case a navigation is transferred to a new RVH but the request has | |
272 // been generated in the renderer already, this identifies the old request so | |
273 // that it can be resumed. The old request is stored until the | |
274 // ResourceDispatcher receives the navigation from the renderer which | |
275 // carries this |transferred_global_request_id_| annotation. Once the request | |
276 // is transferred to the new process, this is cleared and the request | |
277 // continues as normal. | |
278 GlobalRequestID transferred_global_request_id_; | |
279 | |
280 // This is set to true when this entry is being reloaded and due to changes in | |
281 // the state of the URL, it has to be reloaded in a different site instance. | |
282 // In such case, we must treat it as an existing navigation in the new site | |
283 // instance, instead of a new navigation. This value should not be persisted | |
284 // and is not needed after the entry commits. | |
285 // | |
286 // We also use this flag for cross-process redirect navigations, so that the | |
287 // browser will replace the current navigation entry (which is the page | |
288 // doing the redirect). | |
289 bool should_replace_entry_; | |
290 | |
291 // This is set to true when this entry's navigation should clear the session | |
292 // history both on the renderer and browser side. The browser side history | |
293 // won't be cleared until the renderer has committed this navigation. This | |
294 // entry is not persisted by the session restore system, as it is always | |
295 // reset to false after commit. | |
296 bool should_clear_history_list_; | |
297 | |
298 // Set when this entry should be able to access local file:// resources. This | |
299 // value is not needed after the entry commits and is not persisted. | |
300 bool can_load_local_resources_; | |
301 | |
302 // If not empty, the name of the frame to navigate. This field is not | |
303 // persisted, because it is currently only used in tests. | |
304 std::string frame_to_navigate_; | |
305 | |
306 // Used to store extra data to support browser features. This member is not | |
307 // persisted, unless specific data is taken out/put back in at save/restore | |
308 // time (see TabNavigation for an example of this). | |
309 std::map<std::string, string16> extra_data_; | |
310 | |
311 // Copy and assignment is explicitly allowed for this class. | |
312 }; | |
313 | |
314 } // namespace content | |
315 | |
316 #endif // CONTENT_BROWSER_WEB_CONTENTS_NAVIGATION_ENTRY_IMPL_H_ | |
OLD | NEW |