11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#ifndef CONTENT_BROWSER_FRAME_HOST_NAVIGATION_ENTRY_IMPL_H_
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define CONTENT_BROWSER_FRAME_HOST_NAVIGATION_ENTRY_IMPL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/site_instance_impl.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/favicon_status.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/global_request_id.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/common/page_state.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/ssl_status.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT NavigationEntryImpl
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public NON_EXPORTED_BASE(NavigationEntry) {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static NavigationEntryImpl* FromNavigationEntry(NavigationEntry* entry);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The value of bindings() before it is set during commit.
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static int kInvalidBindings;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntryImpl();
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntryImpl(SiteInstanceImpl* instance,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      int page_id,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const GURL& url,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const Referrer& referrer,
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                      const base::string16& title,
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      ui::PageTransition transition_type,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      bool is_renderer_initiated);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~NavigationEntryImpl();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NavigationEntry implementation:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetUniqueID() const OVERRIDE;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PageType GetPageType() const OVERRIDE;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetURL(const GURL& url) OVERRIDE;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const GURL& GetURL() const OVERRIDE;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetBaseURLForDataURL(const GURL& url) OVERRIDE;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const GURL& GetBaseURLForDataURL() const OVERRIDE;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetReferrer(const Referrer& referrer) OVERRIDE;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const Referrer& GetReferrer() const OVERRIDE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetVirtualURL(const GURL& url) OVERRIDE;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const GURL& GetVirtualURL() const OVERRIDE;
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void SetTitle(const base::string16& title) OVERRIDE;
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual const base::string16& GetTitle() const OVERRIDE;
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void SetPageState(const PageState& state) OVERRIDE;
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual const PageState& GetPageState() const OVERRIDE;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetPageID(int page_id) OVERRIDE;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int32 GetPageID() const OVERRIDE;
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual const base::string16& GetTitleForDisplay(
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& languages) const OVERRIDE;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsViewSourceMode() const OVERRIDE;
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void SetTransitionType(ui::PageTransition transition_type) OVERRIDE;
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ui::PageTransition GetTransitionType() const OVERRIDE;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const GURL& GetUserTypedURL() const OVERRIDE;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetHasPostData(bool has_post_data) OVERRIDE;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetHasPostData() const OVERRIDE;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetPostID(int64 post_id) OVERRIDE;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int64 GetPostID() const OVERRIDE;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetBrowserInitiatedPostData(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::RefCountedMemory* data) OVERRIDE;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const base::RefCountedMemory*
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetBrowserInitiatedPostData() const OVERRIDE;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const FaviconStatus& GetFavicon() const OVERRIDE;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual FaviconStatus& GetFavicon() OVERRIDE;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const SSLStatus& GetSSL() const OVERRIDE;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SSLStatus& GetSSL() OVERRIDE;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetOriginalRequestURL(const GURL& original_url) OVERRIDE;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const GURL& GetOriginalRequestURL() const OVERRIDE;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetIsOverridingUserAgent(bool override) OVERRIDE;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetIsOverridingUserAgent() const OVERRIDE;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetTimestamp(base::Time timestamp) OVERRIDE;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual base::Time GetTimestamp() const OVERRIDE;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetCanLoadLocalResources(bool allow) OVERRIDE;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetCanLoadLocalResources() const OVERRIDE;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetFrameToNavigate(const std::string& frame_name) OVERRIDE;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const std::string& GetFrameToNavigate() const OVERRIDE;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetExtraData(const std::string& key,
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            const base::string16& data) OVERRIDE;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool GetExtraData(const std::string& key,
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            base::string16* data) const OVERRIDE;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ClearExtraData(const std::string& key) OVERRIDE;
87424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void SetHttpStatusCode(int http_status_code) OVERRIDE;
88424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual int GetHttpStatusCode() const OVERRIDE;
890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void SetRedirectChain(const std::vector<GURL>& redirects) OVERRIDE;
900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual const std::vector<GURL>& GetRedirectChain() const OVERRIDE;
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool IsRestored() const OVERRIDE;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Once a navigation entry is committed, we should no longer track several
941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // pieces of non-persisted state, as documented on the members below.
951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void ResetForCommit();
961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_unique_id(int unique_id) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unique_id_ = unique_id;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The SiteInstance tells us how to share sub-processes. This is a reference
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // counted pointer to a shared site instance.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that the SiteInstance should usually not be changed after it is set,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // but this may happen if the NavigationEntry was cloned and needs to use a
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // different SiteInstance.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_site_instance(SiteInstanceImpl* site_instance);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SiteInstanceImpl* site_instance() const {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return site_instance_.get();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remember the set of bindings granted to this NavigationEntry at the time
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // of commit, to ensure that we do not grant it additional bindings if we
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // navigate back to it in the future.  This can only be changed once.
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetBindings(int bindings);
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int bindings() const {
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return bindings_;
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_page_type(PageType page_type) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    page_type_ = page_type;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_virtual_url() const {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return !virtual_url_.is_empty();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool update_virtual_url_with_url() const {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return update_virtual_url_with_url_;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_update_virtual_url_with_url(bool update) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    update_virtual_url_with_url_ = update;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extra headers (separated by \n) to send during the request.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_extra_headers(const std::string& extra_headers) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extra_headers_ = extra_headers;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& extra_headers() const {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return extra_headers_;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether this (pending) navigation is renderer-initiated.  Resets to false
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for all types of navigations after commit.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_is_renderer_initiated(bool is_renderer_initiated) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_renderer_initiated_ = is_renderer_initiated;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_renderer_initiated() const {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return is_renderer_initiated_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_user_typed_url(const GURL& user_typed_url) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    user_typed_url_ = user_typed_url;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enumerations of the possible restore types.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum RestoreType {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Restore from the previous session.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RESTORE_LAST_SESSION_EXITED_CLEANLY,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RESTORE_LAST_SESSION_CRASHED,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The entry has been restored from the current session. This is used when
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the user issues 'reopen closed tab'.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RESTORE_CURRENT_SESSION,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The entry was not restored.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RESTORE_NONE
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The RestoreType for this entry. This is set if the entry was retored. This
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is set to RESTORE_NONE once the entry is loaded.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_restore_type(RestoreType type) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    restore_type_ = type;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RestoreType restore_type() const {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return restore_type_;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_transferred_global_request_id(
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GlobalRequestID& transferred_global_request_id) {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    transferred_global_request_id_ = transferred_global_request_id;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GlobalRequestID transferred_global_request_id() const {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return transferred_global_request_id_;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether this (pending) navigation needs to replace current entry.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resets to false after commit.
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool should_replace_entry() const {
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return should_replace_entry_;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_should_replace_entry(bool should_replace_entry) {
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    should_replace_entry_ = should_replace_entry;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetScreenshotPNGData(scoped_refptr<base::RefCountedBytes> png_data);
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const scoped_refptr<base::RefCountedBytes> screenshot() const {
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return screenshot_;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Whether this (pending) navigation should clear the session history. Resets
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // to false after commit.
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool should_clear_history_list() const {
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return should_clear_history_list_;
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void set_should_clear_history_list(bool should_clear_history_list) {
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    should_clear_history_list_ = should_clear_history_list;
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Indicates which FrameTreeNode to navigate.  Currently only used if the
213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // --site-per-process flag is passed.
214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int64 frame_tree_node_id() const {
215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return frame_tree_node_id_;
216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void set_frame_tree_node_id(int64 frame_tree_node_id) {
218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    frame_tree_node_id_ = frame_tree_node_id;
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Session/Tab restore save portions of this class so that it can be recreated
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // later. If you add a new field that needs to be persisted you'll have to
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // update SessionService/TabRestoreService and Android WebView
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // state_serializer.cc appropriately.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See the accessors above for descriptions.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int unique_id_;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstanceImpl> site_instance_;
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(creis): Persist bindings_. http://crbug.com/173672.
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int bindings_;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PageType page_type_;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Referrer referrer_;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL virtual_url_;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool update_virtual_url_with_url_;
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 title_;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FaviconStatus favicon_;
24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PageState page_state_;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 page_id_;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLStatus ssl_;
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::PageTransition transition_type_;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL user_typed_url_;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_post_data_;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 post_id_;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RestoreType restore_type_;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL original_request_url_;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_overriding_user_agent_;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time timestamp_;
252424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  int http_status_code_;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This member is not persisted with session restore because it is transient.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the post request succeeds, this field is cleared since the same
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // information is stored in |content_state_| above. It is also only shallow
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // copied with compiler provided copy constructor.
2581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Cleared in |ResetForCommit|.
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<const base::RefCountedMemory> browser_initiated_post_data_;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This is also a transient member (i.e. is not persisted with session
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // restore). The screenshot of a page is taken when navigating away from the
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // page. This screenshot is displayed during an overscroll-navigation
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // gesture. |screenshot_| will be NULL when the screenshot is not available
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (e.g. after a session restore, or if taking the screenshot of a page
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // failed). The UI is responsible for dealing with missing screenshots
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // appropriately (e.g. display a placeholder image instead).
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> screenshot_;
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This member is not persisted with session restore.
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string extra_headers_;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Used for specifying base URL for pages loaded via data URLs. Only used and
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // persisted by Android WebView.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL base_url_for_data_url_;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether the entry, while loading, was created for a renderer-initiated
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigation.  This dictates whether the URL should be displayed before the
2791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // navigation commits.  It is cleared in |ResetForCommit| and not persisted.
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_renderer_initiated_;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is a cached version of the result of GetTitleForDisplay. It prevents
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // us from having to do URL formatting on the URL every time the title is
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // displayed. When the URL, virtual URL, or title is set, this should be
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cleared to force a refresh.
286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  mutable base::string16 cached_display_title_;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In case a navigation is transferred to a new RVH but the request has
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // been generated in the renderer already, this identifies the old request so
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that it can be resumed. The old request is stored until the
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ResourceDispatcher receives the navigation from the renderer which
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // carries this |transferred_global_request_id_| annotation. Once the request
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is transferred to the new process, this is cleared and the request
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // continues as normal.
2951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Cleared in |ResetForCommit|.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GlobalRequestID transferred_global_request_id_;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is set to true when this entry is being reloaded and due to changes in
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the state of the URL, it has to be reloaded in a different site instance.
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In such case, we must treat it as an existing navigation in the new site
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // instance, instead of a new navigation. This value should not be persisted
3021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // and is cleared in |ResetForCommit|.
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We also use this flag for cross-process redirect navigations, so that the
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // browser will replace the current navigation entry (which is the page
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // doing the redirect).
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool should_replace_entry_;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // This is used when transferring a pending entry from one process to another.
3100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // We also send this data through session sync for offline analysis.
3110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // It is preserved after commit but should not be persisted.
3121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::vector<GURL> redirect_chain_;
3131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // This is set to true when this entry's navigation should clear the session
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // history both on the renderer and browser side. The browser side history
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // won't be cleared until the renderer has committed this navigation. This
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // entry is not persisted by the session restore system, as it is always
3181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // cleared in |ResetForCommit|.
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool should_clear_history_list_;
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set when this entry should be able to access local file:// resources. This
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // value is not needed after the entry commits and is not persisted.
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool can_load_local_resources_;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If not empty, the name of the frame to navigate. This field is not
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // persisted, because it is currently only used in tests.
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string frame_to_navigate_;
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // If not -1, this indicates which FrameTreeNode to navigate.  This field is
330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // not persisted because it is experimental and only used when the
331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // --site-per-process flag is passed.  It is cleared in |ResetForCommit|
332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // because we only use it while the navigation is pending.
333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // TODO(creis): Move this to FrameNavigationEntry.
334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int64 frame_tree_node_id_;
335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Used to store extra data to support browser features. This member is not
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // persisted, unless specific data is taken out/put back in at save/restore
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // time (see TabNavigation for an example of this).
339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::map<std::string, base::string16> extra_data_;
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copy and assignment is explicitly allowed for this class.
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif  // CONTENT_BROWSER_FRAME_HOST_NAVIGATION_ENTRY_IMPL_H_
347