Home | History | Annotate | Download | only in frame_host
      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 
     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();
     93 
     94   void set_unique_id(int unique_id) {
     95     unique_id_ = unique_id;
     96   }
     97 
     98   // The SiteInstance tells us how to share sub-processes. This is a reference
     99   // counted pointer to a shared site instance.
    100   //
    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();
    107   }
    108 
    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 {
    114     return bindings_;
    115   }
    116 
    117   void set_page_type(PageType page_type) {
    118     page_type_ = page_type;
    119   }
    120 
    121   bool has_virtual_url() const {
    122     return !virtual_url_.is_empty();
    123   }
    124 
    125   bool update_virtual_url_with_url() const {
    126     return update_virtual_url_with_url_;
    127   }
    128   void set_update_virtual_url_with_url(bool update) {
    129     update_virtual_url_with_url_ = update;
    130   }
    131 
    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;
    135   }
    136   const std::string& extra_headers() const {
    137     return extra_headers_;
    138   }
    139 
    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;
    144   }
    145   bool is_renderer_initiated() const {
    146     return is_renderer_initiated_;
    147   }
    148 
    149   void set_user_typed_url(const GURL& user_typed_url) {
    150     user_typed_url_ = user_typed_url;
    151   }
    152 
    153   // Enumerations of the possible restore types.
    154   enum RestoreType {
    155     // Restore from the previous session.
    156     RESTORE_LAST_SESSION_EXITED_CLEANLY,
    157     RESTORE_LAST_SESSION_CRASHED,
    158 
    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,
    162 
    163     // The entry was not restored.
    164     RESTORE_NONE
    165   };
    166 
    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;
    171   }
    172   RestoreType restore_type() const {
    173     return restore_type_;
    174   }
    175 
    176   void set_transferred_global_request_id(
    177       const GlobalRequestID& transferred_global_request_id) {
    178     transferred_global_request_id_ = transferred_global_request_id;
    179   }
    180 
    181   GlobalRequestID transferred_global_request_id() const {
    182     return transferred_global_request_id_;
    183   }
    184 
    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_;
    189   }
    190 
    191   void set_should_replace_entry(bool should_replace_entry) {
    192     should_replace_entry_ = should_replace_entry;
    193   }
    194 
    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_;
    199   }
    200 
    201   void set_redirect_chain(const std::vector<GURL>& redirect_chain) {
    202     redirect_chain_ = redirect_chain;
    203   }
    204 
    205   void SetScreenshotPNGData(scoped_refptr<base::RefCountedBytes> png_data);
    206   const scoped_refptr<base::RefCountedBytes> screenshot() const {
    207     return screenshot_;
    208   }
    209 
    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_;
    214   }
    215   void set_should_clear_history_list(bool should_clear_history_list) {
    216     should_clear_history_list_ = should_clear_history_list;
    217   }
    218 
    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_;
    223   }
    224   void set_frame_tree_node_id(int64 frame_tree_node_id) {
    225     frame_tree_node_id_ = frame_tree_node_id;
    226   }
    227 
    228  private:
    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
    235 
    236   // See the accessors above for descriptions.
    237   int unique_id_;
    238   scoped_refptr<SiteInstanceImpl> site_instance_;
    239   // TODO(creis): Persist bindings_. http://crbug.com/173672.
    240   int bindings_;
    241   PageType page_type_;
    242   GURL url_;
    243   Referrer referrer_;
    244   GURL virtual_url_;
    245   bool update_virtual_url_with_url_;
    246   base::string16 title_;
    247   FaviconStatus favicon_;
    248   PageState page_state_;
    249   int32 page_id_;
    250   SSLStatus ssl_;
    251   PageTransition transition_type_;
    252   GURL user_typed_url_;
    253   bool has_post_data_;
    254   int64 post_id_;
    255   RestoreType restore_type_;
    256   GURL original_request_url_;
    257   bool is_overriding_user_agent_;
    258   base::Time timestamp_;
    259   int http_status_code_;
    260 
    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_;
    267 
    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_;
    276 
    277   // This member is not persisted with session restore.
    278   std::string extra_headers_;
    279 
    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_;
    283 
    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_;
    288 
    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_;
    294 
    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_;
    304 
    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|.
    310   //
    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_;
    315 
    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_;
    319 
    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_;
    326 
    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_;
    330 
    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_;
    334 
    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_;
    341 
    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_;
    346 
    347   // Copy and assignment is explicitly allowed for this class.
    348 };
    349 
    350 }  // namespace content
    351 
    352 #endif  // CONTENT_BROWSER_FRAME_HOST_NAVIGATION_ENTRY_IMPL_H_
    353