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 #include "content/browser/web_contents/navigation_entry_impl.h" 6 7 #include "base/metrics/histogram.h" 8 #include "base/strings/string_util.h" 9 #include "base/strings/utf_string_conversions.h" 10 #include "content/public/common/content_constants.h" 11 #include "content/public/common/url_constants.h" 12 #include "net/base/net_util.h" 13 #include "ui/base/text/text_elider.h" 14 15 // Use this to get a new unique ID for a NavigationEntry during construction. 16 // The returned ID is guaranteed to be nonzero (which is the "no ID" indicator). 17 static int GetUniqueIDInConstructor() { 18 static int unique_id_counter = 0; 19 return ++unique_id_counter; 20 } 21 22 namespace content { 23 24 int NavigationEntryImpl::kInvalidBindings = -1; 25 26 NavigationEntry* NavigationEntry::Create() { 27 return new NavigationEntryImpl(); 28 } 29 30 NavigationEntry* NavigationEntry::Create(const NavigationEntry& copy) { 31 return new NavigationEntryImpl(static_cast<const NavigationEntryImpl&>(copy)); 32 } 33 34 NavigationEntryImpl* NavigationEntryImpl::FromNavigationEntry( 35 NavigationEntry* entry) { 36 return static_cast<NavigationEntryImpl*>(entry); 37 } 38 39 NavigationEntryImpl::NavigationEntryImpl() 40 : unique_id_(GetUniqueIDInConstructor()), 41 site_instance_(NULL), 42 bindings_(kInvalidBindings), 43 page_type_(PAGE_TYPE_NORMAL), 44 update_virtual_url_with_url_(false), 45 page_id_(-1), 46 transition_type_(PAGE_TRANSITION_LINK), 47 has_post_data_(false), 48 post_id_(-1), 49 restore_type_(RESTORE_NONE), 50 is_overriding_user_agent_(false), 51 is_renderer_initiated_(false), 52 should_replace_entry_(false), 53 should_clear_history_list_(false), 54 can_load_local_resources_(false) { 55 } 56 57 NavigationEntryImpl::NavigationEntryImpl(SiteInstanceImpl* instance, 58 int page_id, 59 const GURL& url, 60 const Referrer& referrer, 61 const string16& title, 62 PageTransition transition_type, 63 bool is_renderer_initiated) 64 : unique_id_(GetUniqueIDInConstructor()), 65 site_instance_(instance), 66 bindings_(kInvalidBindings), 67 page_type_(PAGE_TYPE_NORMAL), 68 url_(url), 69 referrer_(referrer), 70 update_virtual_url_with_url_(false), 71 title_(title), 72 page_id_(page_id), 73 transition_type_(transition_type), 74 has_post_data_(false), 75 post_id_(-1), 76 restore_type_(RESTORE_NONE), 77 is_overriding_user_agent_(false), 78 is_renderer_initiated_(is_renderer_initiated), 79 should_replace_entry_(false), 80 should_clear_history_list_(false), 81 can_load_local_resources_(false) { 82 } 83 84 NavigationEntryImpl::~NavigationEntryImpl() { 85 } 86 87 int NavigationEntryImpl::GetUniqueID() const { 88 return unique_id_; 89 } 90 91 PageType NavigationEntryImpl::GetPageType() const { 92 return page_type_; 93 } 94 95 void NavigationEntryImpl::SetURL(const GURL& url) { 96 url_ = url; 97 cached_display_title_.clear(); 98 } 99 100 const GURL& NavigationEntryImpl::GetURL() const { 101 return url_; 102 } 103 104 void NavigationEntryImpl::SetBaseURLForDataURL(const GURL& url) { 105 base_url_for_data_url_ = url; 106 } 107 108 const GURL& NavigationEntryImpl::GetBaseURLForDataURL() const { 109 return base_url_for_data_url_; 110 } 111 112 void NavigationEntryImpl::SetReferrer(const Referrer& referrer) { 113 referrer_ = referrer; 114 } 115 116 const Referrer& NavigationEntryImpl::GetReferrer() const { 117 return referrer_; 118 } 119 120 void NavigationEntryImpl::SetVirtualURL(const GURL& url) { 121 virtual_url_ = (url == url_) ? GURL() : url; 122 cached_display_title_.clear(); 123 } 124 125 const GURL& NavigationEntryImpl::GetVirtualURL() const { 126 return virtual_url_.is_empty() ? url_ : virtual_url_; 127 } 128 129 void NavigationEntryImpl::SetTitle(const string16& title) { 130 title_ = title; 131 cached_display_title_.clear(); 132 } 133 134 const string16& NavigationEntryImpl::GetTitle() const { 135 return title_; 136 } 137 138 void NavigationEntryImpl::SetPageState(const PageState& state) { 139 page_state_ = state; 140 } 141 142 const PageState& NavigationEntryImpl::GetPageState() const { 143 return page_state_; 144 } 145 146 void NavigationEntryImpl::SetPageID(int page_id) { 147 page_id_ = page_id; 148 } 149 150 int32 NavigationEntryImpl::GetPageID() const { 151 return page_id_; 152 } 153 154 void NavigationEntryImpl::set_site_instance(SiteInstanceImpl* site_instance) { 155 site_instance_ = site_instance; 156 } 157 158 void NavigationEntryImpl::SetBindings(int bindings) { 159 // Ensure this is set to a valid value, and that it stays the same once set. 160 CHECK_NE(bindings, kInvalidBindings); 161 CHECK(bindings_ == kInvalidBindings || bindings_ == bindings); 162 bindings_ = bindings; 163 } 164 165 const string16& NavigationEntryImpl::GetTitleForDisplay( 166 const std::string& languages) const { 167 // Most pages have real titles. Don't even bother caching anything if this is 168 // the case. 169 if (!title_.empty()) 170 return title_; 171 172 // More complicated cases will use the URLs as the title. This result we will 173 // cache since it's more complicated to compute. 174 if (!cached_display_title_.empty()) 175 return cached_display_title_; 176 177 // Use the virtual URL first if any, and fall back on using the real URL. 178 string16 title; 179 if (!virtual_url_.is_empty()) { 180 title = net::FormatUrl(virtual_url_, languages); 181 } else if (!url_.is_empty()) { 182 title = net::FormatUrl(url_, languages); 183 } 184 185 // For file:// URLs use the filename as the title, not the full path. 186 if (url_.SchemeIsFile()) { 187 string16::size_type slashpos = title.rfind('/'); 188 if (slashpos != string16::npos) 189 title = title.substr(slashpos + 1); 190 } 191 192 ui::ElideString(title, kMaxTitleChars, &cached_display_title_); 193 return cached_display_title_; 194 } 195 196 bool NavigationEntryImpl::IsViewSourceMode() const { 197 return virtual_url_.SchemeIs(kViewSourceScheme); 198 } 199 200 void NavigationEntryImpl::SetTransitionType( 201 PageTransition transition_type) { 202 transition_type_ = transition_type; 203 } 204 205 PageTransition NavigationEntryImpl::GetTransitionType() const { 206 return transition_type_; 207 } 208 209 const GURL& NavigationEntryImpl::GetUserTypedURL() const { 210 return user_typed_url_; 211 } 212 213 void NavigationEntryImpl::SetHasPostData(bool has_post_data) { 214 has_post_data_ = has_post_data; 215 } 216 217 bool NavigationEntryImpl::GetHasPostData() const { 218 return has_post_data_; 219 } 220 221 void NavigationEntryImpl::SetPostID(int64 post_id) { 222 post_id_ = post_id; 223 } 224 225 int64 NavigationEntryImpl::GetPostID() const { 226 return post_id_; 227 } 228 229 void NavigationEntryImpl::SetBrowserInitiatedPostData( 230 const base::RefCountedMemory* data) { 231 browser_initiated_post_data_ = data; 232 } 233 234 const base::RefCountedMemory* 235 NavigationEntryImpl::GetBrowserInitiatedPostData() const { 236 return browser_initiated_post_data_.get(); 237 } 238 239 240 const FaviconStatus& NavigationEntryImpl::GetFavicon() const { 241 return favicon_; 242 } 243 244 FaviconStatus& NavigationEntryImpl::GetFavicon() { 245 return favicon_; 246 } 247 248 const SSLStatus& NavigationEntryImpl::GetSSL() const { 249 return ssl_; 250 } 251 252 SSLStatus& NavigationEntryImpl::GetSSL() { 253 return ssl_; 254 } 255 256 void NavigationEntryImpl::SetOriginalRequestURL(const GURL& original_url) { 257 original_request_url_ = original_url; 258 } 259 260 const GURL& NavigationEntryImpl::GetOriginalRequestURL() const { 261 return original_request_url_; 262 } 263 264 void NavigationEntryImpl::SetIsOverridingUserAgent(bool override) { 265 is_overriding_user_agent_ = override; 266 } 267 268 bool NavigationEntryImpl::GetIsOverridingUserAgent() const { 269 return is_overriding_user_agent_; 270 } 271 272 void NavigationEntryImpl::SetTimestamp(base::Time timestamp) { 273 timestamp_ = timestamp; 274 } 275 276 base::Time NavigationEntryImpl::GetTimestamp() const { 277 return timestamp_; 278 } 279 280 void NavigationEntryImpl::SetCanLoadLocalResources(bool allow) { 281 can_load_local_resources_ = allow; 282 } 283 284 bool NavigationEntryImpl::GetCanLoadLocalResources() const { 285 return can_load_local_resources_; 286 } 287 288 void NavigationEntryImpl::SetFrameToNavigate(const std::string& frame_name) { 289 frame_to_navigate_ = frame_name; 290 } 291 292 const std::string& NavigationEntryImpl::GetFrameToNavigate() const { 293 return frame_to_navigate_; 294 } 295 296 void NavigationEntryImpl::SetExtraData(const std::string& key, 297 const string16& data) { 298 extra_data_[key] = data; 299 } 300 301 bool NavigationEntryImpl::GetExtraData(const std::string& key, 302 string16* data) const { 303 std::map<std::string, string16>::const_iterator iter = extra_data_.find(key); 304 if (iter == extra_data_.end()) 305 return false; 306 *data = iter->second; 307 return true; 308 } 309 310 void NavigationEntryImpl::ClearExtraData(const std::string& key) { 311 extra_data_.erase(key); 312 } 313 314 void NavigationEntryImpl::SetScreenshotPNGData( 315 scoped_refptr<base::RefCountedBytes> png_data) { 316 screenshot_ = png_data; 317 if (screenshot_.get()) 318 UMA_HISTOGRAM_MEMORY_KB("Overscroll.ScreenshotSize", screenshot_->size()); 319 } 320 321 } // namespace content 322