summaryrefslogtreecommitdiffstats
path: root/content/browser/frame_host/navigation_entry_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'content/browser/frame_host/navigation_entry_impl.cc')
-rw-r--r--content/browser/frame_host/navigation_entry_impl.cc342
1 files changed, 342 insertions, 0 deletions
diff --git a/content/browser/frame_host/navigation_entry_impl.cc b/content/browser/frame_host/navigation_entry_impl.cc
new file mode 100644
index 0000000..58dbaf4
--- /dev/null
+++ b/content/browser/frame_host/navigation_entry_impl.cc
@@ -0,0 +1,342 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/frame_host/navigation_entry_impl.h"
+
+#include "base/metrics/histogram.h"
+#include "base/strings/string_util.h"
+#include "base/strings/utf_string_conversions.h"
+#include "content/public/common/content_constants.h"
+#include "content/public/common/url_constants.h"
+#include "net/base/net_util.h"
+#include "ui/gfx/text_elider.h"
+
+// Use this to get a new unique ID for a NavigationEntry during construction.
+// The returned ID is guaranteed to be nonzero (which is the "no ID" indicator).
+static int GetUniqueIDInConstructor() {
+ static int unique_id_counter = 0;
+ return ++unique_id_counter;
+}
+
+namespace content {
+
+int NavigationEntryImpl::kInvalidBindings = -1;
+
+NavigationEntry* NavigationEntry::Create() {
+ return new NavigationEntryImpl();
+}
+
+NavigationEntry* NavigationEntry::Create(const NavigationEntry& copy) {
+ return new NavigationEntryImpl(static_cast<const NavigationEntryImpl&>(copy));
+}
+
+NavigationEntryImpl* NavigationEntryImpl::FromNavigationEntry(
+ NavigationEntry* entry) {
+ return static_cast<NavigationEntryImpl*>(entry);
+}
+
+NavigationEntryImpl::NavigationEntryImpl()
+ : unique_id_(GetUniqueIDInConstructor()),
+ site_instance_(NULL),
+ bindings_(kInvalidBindings),
+ page_type_(PAGE_TYPE_NORMAL),
+ update_virtual_url_with_url_(false),
+ page_id_(-1),
+ transition_type_(PAGE_TRANSITION_LINK),
+ has_post_data_(false),
+ post_id_(-1),
+ restore_type_(RESTORE_NONE),
+ is_overriding_user_agent_(false),
+ http_status_code_(0),
+ is_renderer_initiated_(false),
+ should_replace_entry_(false),
+ should_clear_history_list_(false),
+ can_load_local_resources_(false) {
+}
+
+NavigationEntryImpl::NavigationEntryImpl(SiteInstanceImpl* instance,
+ int page_id,
+ const GURL& url,
+ const Referrer& referrer,
+ const string16& title,
+ PageTransition transition_type,
+ bool is_renderer_initiated)
+ : unique_id_(GetUniqueIDInConstructor()),
+ site_instance_(instance),
+ bindings_(kInvalidBindings),
+ page_type_(PAGE_TYPE_NORMAL),
+ url_(url),
+ referrer_(referrer),
+ update_virtual_url_with_url_(false),
+ title_(title),
+ page_id_(page_id),
+ transition_type_(transition_type),
+ has_post_data_(false),
+ post_id_(-1),
+ restore_type_(RESTORE_NONE),
+ is_overriding_user_agent_(false),
+ http_status_code_(0),
+ is_renderer_initiated_(is_renderer_initiated),
+ should_replace_entry_(false),
+ should_clear_history_list_(false),
+ can_load_local_resources_(false) {
+}
+
+NavigationEntryImpl::~NavigationEntryImpl() {
+}
+
+int NavigationEntryImpl::GetUniqueID() const {
+ return unique_id_;
+}
+
+PageType NavigationEntryImpl::GetPageType() const {
+ return page_type_;
+}
+
+void NavigationEntryImpl::SetURL(const GURL& url) {
+ url_ = url;
+ cached_display_title_.clear();
+}
+
+const GURL& NavigationEntryImpl::GetURL() const {
+ return url_;
+}
+
+void NavigationEntryImpl::SetBaseURLForDataURL(const GURL& url) {
+ base_url_for_data_url_ = url;
+}
+
+const GURL& NavigationEntryImpl::GetBaseURLForDataURL() const {
+ return base_url_for_data_url_;
+}
+
+void NavigationEntryImpl::SetReferrer(const Referrer& referrer) {
+ referrer_ = referrer;
+}
+
+const Referrer& NavigationEntryImpl::GetReferrer() const {
+ return referrer_;
+}
+
+void NavigationEntryImpl::SetVirtualURL(const GURL& url) {
+ virtual_url_ = (url == url_) ? GURL() : url;
+ cached_display_title_.clear();
+}
+
+const GURL& NavigationEntryImpl::GetVirtualURL() const {
+ return virtual_url_.is_empty() ? url_ : virtual_url_;
+}
+
+void NavigationEntryImpl::SetTitle(const string16& title) {
+ title_ = title;
+ cached_display_title_.clear();
+}
+
+const string16& NavigationEntryImpl::GetTitle() const {
+ return title_;
+}
+
+void NavigationEntryImpl::SetPageState(const PageState& state) {
+ page_state_ = state;
+}
+
+const PageState& NavigationEntryImpl::GetPageState() const {
+ return page_state_;
+}
+
+void NavigationEntryImpl::SetPageID(int page_id) {
+ page_id_ = page_id;
+}
+
+int32 NavigationEntryImpl::GetPageID() const {
+ return page_id_;
+}
+
+void NavigationEntryImpl::set_site_instance(SiteInstanceImpl* site_instance) {
+ site_instance_ = site_instance;
+}
+
+void NavigationEntryImpl::SetBindings(int bindings) {
+ // Ensure this is set to a valid value, and that it stays the same once set.
+ CHECK_NE(bindings, kInvalidBindings);
+ CHECK(bindings_ == kInvalidBindings || bindings_ == bindings);
+ bindings_ = bindings;
+}
+
+const string16& NavigationEntryImpl::GetTitleForDisplay(
+ const std::string& languages) const {
+ // Most pages have real titles. Don't even bother caching anything if this is
+ // the case.
+ if (!title_.empty())
+ return title_;
+
+ // More complicated cases will use the URLs as the title. This result we will
+ // cache since it's more complicated to compute.
+ if (!cached_display_title_.empty())
+ return cached_display_title_;
+
+ // Use the virtual URL first if any, and fall back on using the real URL.
+ string16 title;
+ if (!virtual_url_.is_empty()) {
+ title = net::FormatUrl(virtual_url_, languages);
+ } else if (!url_.is_empty()) {
+ title = net::FormatUrl(url_, languages);
+ }
+
+ // For file:// URLs use the filename as the title, not the full path.
+ if (url_.SchemeIsFile()) {
+ string16::size_type slashpos = title.rfind('/');
+ if (slashpos != string16::npos)
+ title = title.substr(slashpos + 1);
+ }
+
+ gfx::ElideString(title, kMaxTitleChars, &cached_display_title_);
+ return cached_display_title_;
+}
+
+bool NavigationEntryImpl::IsViewSourceMode() const {
+ return virtual_url_.SchemeIs(kViewSourceScheme);
+}
+
+void NavigationEntryImpl::SetTransitionType(
+ PageTransition transition_type) {
+ transition_type_ = transition_type;
+}
+
+PageTransition NavigationEntryImpl::GetTransitionType() const {
+ return transition_type_;
+}
+
+const GURL& NavigationEntryImpl::GetUserTypedURL() const {
+ return user_typed_url_;
+}
+
+void NavigationEntryImpl::SetHasPostData(bool has_post_data) {
+ has_post_data_ = has_post_data;
+}
+
+bool NavigationEntryImpl::GetHasPostData() const {
+ return has_post_data_;
+}
+
+void NavigationEntryImpl::SetPostID(int64 post_id) {
+ post_id_ = post_id;
+}
+
+int64 NavigationEntryImpl::GetPostID() const {
+ return post_id_;
+}
+
+void NavigationEntryImpl::SetBrowserInitiatedPostData(
+ const base::RefCountedMemory* data) {
+ browser_initiated_post_data_ = data;
+}
+
+const base::RefCountedMemory*
+NavigationEntryImpl::GetBrowserInitiatedPostData() const {
+ return browser_initiated_post_data_.get();
+}
+
+
+const FaviconStatus& NavigationEntryImpl::GetFavicon() const {
+ return favicon_;
+}
+
+FaviconStatus& NavigationEntryImpl::GetFavicon() {
+ return favicon_;
+}
+
+const SSLStatus& NavigationEntryImpl::GetSSL() const {
+ return ssl_;
+}
+
+SSLStatus& NavigationEntryImpl::GetSSL() {
+ return ssl_;
+}
+
+void NavigationEntryImpl::SetOriginalRequestURL(const GURL& original_url) {
+ original_request_url_ = original_url;
+}
+
+const GURL& NavigationEntryImpl::GetOriginalRequestURL() const {
+ return original_request_url_;
+}
+
+void NavigationEntryImpl::SetIsOverridingUserAgent(bool override) {
+ is_overriding_user_agent_ = override;
+}
+
+bool NavigationEntryImpl::GetIsOverridingUserAgent() const {
+ return is_overriding_user_agent_;
+}
+
+void NavigationEntryImpl::SetTimestamp(base::Time timestamp) {
+ timestamp_ = timestamp;
+}
+
+base::Time NavigationEntryImpl::GetTimestamp() const {
+ return timestamp_;
+}
+
+void NavigationEntryImpl::SetHttpStatusCode(int http_status_code) {
+ http_status_code_ = http_status_code;
+}
+
+int NavigationEntryImpl::GetHttpStatusCode() const {
+ return http_status_code_;
+}
+
+void NavigationEntryImpl::SetCanLoadLocalResources(bool allow) {
+ can_load_local_resources_ = allow;
+}
+
+bool NavigationEntryImpl::GetCanLoadLocalResources() const {
+ return can_load_local_resources_;
+}
+
+void NavigationEntryImpl::SetFrameToNavigate(const std::string& frame_name) {
+ frame_to_navigate_ = frame_name;
+}
+
+const std::string& NavigationEntryImpl::GetFrameToNavigate() const {
+ return frame_to_navigate_;
+}
+
+void NavigationEntryImpl::SetExtraData(const std::string& key,
+ const string16& data) {
+ extra_data_[key] = data;
+}
+
+bool NavigationEntryImpl::GetExtraData(const std::string& key,
+ string16* data) const {
+ std::map<std::string, string16>::const_iterator iter = extra_data_.find(key);
+ if (iter == extra_data_.end())
+ return false;
+ *data = iter->second;
+ return true;
+}
+
+void NavigationEntryImpl::ClearExtraData(const std::string& key) {
+ extra_data_.erase(key);
+}
+
+void NavigationEntryImpl::ResetForCommit() {
+ // Any state that only matters when a navigation entry is pending should be
+ // cleared here.
+ SetBrowserInitiatedPostData(NULL);
+ set_is_renderer_initiated(false);
+ set_transferred_global_request_id(GlobalRequestID());
+ set_should_replace_entry(false);
+ redirect_chain_.clear();
+ set_should_clear_history_list(false);
+}
+
+void NavigationEntryImpl::SetScreenshotPNGData(
+ scoped_refptr<base::RefCountedBytes> png_data) {
+ screenshot_ = png_data;
+ if (screenshot_.get())
+ UMA_HISTOGRAM_MEMORY_KB("Overscroll.ScreenshotSize", screenshot_->size());
+}
+
+} // namespace content