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