| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/sessions/serialized_navigation_entry.h" | 5 #include "components/sessions/serialized_navigation_entry.h" |
| 6 | 6 |
| 7 #include "base/pickle.h" | 7 #include "base/pickle.h" |
| 8 #include "base/utf_string_conversions.h" | 8 #include "base/utf_string_conversions.h" |
| 9 #include "content/public/browser/favicon_status.h" | 9 #include "content/public/browser/favicon_status.h" |
| 10 #include "content/public/browser/navigation_controller.h" | 10 #include "content/public/browser/navigation_controller.h" |
| 11 #include "content/public/browser/navigation_entry.h" | 11 #include "content/public/browser/navigation_entry.h" |
| 12 #include "sync/protocol/session_specifics.pb.h" | 12 #include "sync/protocol/session_specifics.pb.h" |
| 13 #include "sync/util/time.h" | 13 #include "sync/util/time.h" |
| 14 #include "third_party/WebKit/Source/Platform/chromium/public/WebReferrerPolicy.h
" | 14 #include "third_party/WebKit/Source/Platform/chromium/public/WebReferrerPolicy.h
" |
| 15 #include "webkit/glue/glue_serialize.h" | |
| 16 | 15 |
| 17 using content::NavigationEntry; | 16 using content::NavigationEntry; |
| 18 | 17 |
| 19 namespace sessions { | 18 namespace sessions { |
| 20 | 19 |
| 21 const char kSearchTermsKey[] = "search_terms"; | 20 const char kSearchTermsKey[] = "search_terms"; |
| 22 | 21 |
| 23 SerializedNavigationEntry::SerializedNavigationEntry() | 22 SerializedNavigationEntry::SerializedNavigationEntry() |
| 24 : index_(-1), | 23 : index_(-1), |
| 25 unique_id_(0), | 24 unique_id_(0), |
| 26 transition_type_(content::PAGE_TRANSITION_TYPED), | 25 transition_type_(content::PAGE_TRANSITION_TYPED), |
| 27 has_post_data_(false), | 26 has_post_data_(false), |
| 28 post_id_(-1), | 27 post_id_(-1), |
| 29 is_overriding_user_agent_(false) {} | 28 is_overriding_user_agent_(false) {} |
| 30 | 29 |
| 31 SerializedNavigationEntry::~SerializedNavigationEntry() {} | 30 SerializedNavigationEntry::~SerializedNavigationEntry() {} |
| 32 | 31 |
| 33 // static | 32 // static |
| 34 SerializedNavigationEntry SerializedNavigationEntry::FromNavigationEntry( | 33 SerializedNavigationEntry SerializedNavigationEntry::FromNavigationEntry( |
| 35 int index, | 34 int index, |
| 36 const NavigationEntry& entry) { | 35 const NavigationEntry& entry) { |
| 37 SerializedNavigationEntry navigation; | 36 SerializedNavigationEntry navigation; |
| 38 navigation.index_ = index; | 37 navigation.index_ = index; |
| 39 navigation.unique_id_ = entry.GetUniqueID(); | 38 navigation.unique_id_ = entry.GetUniqueID(); |
| 40 navigation.referrer_ = entry.GetReferrer(); | 39 navigation.referrer_ = entry.GetReferrer(); |
| 41 navigation.virtual_url_ = entry.GetVirtualURL(); | 40 navigation.virtual_url_ = entry.GetVirtualURL(); |
| 42 navigation.title_ = entry.GetTitle(); | 41 navigation.title_ = entry.GetTitle(); |
| 43 navigation.content_state_ = entry.GetContentState(); | 42 navigation.page_state_ = entry.GetPageState(); |
| 44 navigation.transition_type_ = entry.GetTransitionType(); | 43 navigation.transition_type_ = entry.GetTransitionType(); |
| 45 navigation.has_post_data_ = entry.GetHasPostData(); | 44 navigation.has_post_data_ = entry.GetHasPostData(); |
| 46 navigation.post_id_ = entry.GetPostID(); | 45 navigation.post_id_ = entry.GetPostID(); |
| 47 navigation.original_request_url_ = entry.GetOriginalRequestURL(); | 46 navigation.original_request_url_ = entry.GetOriginalRequestURL(); |
| 48 navigation.is_overriding_user_agent_ = entry.GetIsOverridingUserAgent(); | 47 navigation.is_overriding_user_agent_ = entry.GetIsOverridingUserAgent(); |
| 49 navigation.timestamp_ = entry.GetTimestamp(); | 48 navigation.timestamp_ = entry.GetTimestamp(); |
| 50 // If you want to navigate a named frame in Chrome, you will first need to | 49 // If you want to navigate a named frame in Chrome, you will first need to |
| 51 // add support for persisting it. It is currently only used for layout tests. | 50 // add support for persisting it. It is currently only used for layout tests. |
| 52 CHECK(entry.GetFrameToNavigate().empty()); | 51 CHECK(entry.GetFrameToNavigate().empty()); |
| 53 entry.GetExtraData(kSearchTermsKey, &navigation.search_terms_); | 52 entry.GetExtraData(kSearchTermsKey, &navigation.search_terms_); |
| 54 if (entry.GetFavicon().valid) | 53 if (entry.GetFavicon().valid) |
| 55 navigation.favicon_url_ = entry.GetFavicon().url; | 54 navigation.favicon_url_ = entry.GetFavicon().url; |
| 56 | 55 |
| 57 return navigation; | 56 return navigation; |
| 58 } | 57 } |
| 59 | 58 |
| 60 SerializedNavigationEntry SerializedNavigationEntry::FromSyncData( | 59 SerializedNavigationEntry SerializedNavigationEntry::FromSyncData( |
| 61 int index, | 60 int index, |
| 62 const sync_pb::TabNavigation& sync_data) { | 61 const sync_pb::TabNavigation& sync_data) { |
| 63 SerializedNavigationEntry navigation; | 62 SerializedNavigationEntry navigation; |
| 64 navigation.index_ = index; | 63 navigation.index_ = index; |
| 65 navigation.unique_id_ = sync_data.unique_id(); | 64 navigation.unique_id_ = sync_data.unique_id(); |
| 66 navigation.referrer_ = | 65 navigation.referrer_ = |
| 67 content::Referrer(GURL(sync_data.referrer()), | 66 content::Referrer(GURL(sync_data.referrer()), |
| 68 WebKit::WebReferrerPolicyDefault); | 67 WebKit::WebReferrerPolicyDefault); |
| 69 navigation.virtual_url_ = GURL(sync_data.virtual_url()); | 68 navigation.virtual_url_ = GURL(sync_data.virtual_url()); |
| 70 navigation.title_ = UTF8ToUTF16(sync_data.title()); | 69 navigation.title_ = UTF8ToUTF16(sync_data.title()); |
| 71 navigation.content_state_ = sync_data.state(); | 70 navigation.page_state_ = |
| 71 content::PageState::CreateFromEncodedData(sync_data.state()); |
| 72 | 72 |
| 73 uint32 transition = 0; | 73 uint32 transition = 0; |
| 74 if (sync_data.has_page_transition()) { | 74 if (sync_data.has_page_transition()) { |
| 75 switch (sync_data.page_transition()) { | 75 switch (sync_data.page_transition()) { |
| 76 case sync_pb::SyncEnums_PageTransition_LINK: | 76 case sync_pb::SyncEnums_PageTransition_LINK: |
| 77 transition = content::PAGE_TRANSITION_LINK; | 77 transition = content::PAGE_TRANSITION_LINK; |
| 78 break; | 78 break; |
| 79 case sync_pb::SyncEnums_PageTransition_TYPED: | 79 case sync_pb::SyncEnums_PageTransition_TYPED: |
| 80 transition = content::PAGE_TRANSITION_TYPED; | 80 transition = content::PAGE_TRANSITION_TYPED; |
| 81 break; | 81 break; |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 HAS_POST_DATA = 1 | 193 HAS_POST_DATA = 1 |
| 194 }; | 194 }; |
| 195 | 195 |
| 196 } // namespace | 196 } // namespace |
| 197 | 197 |
| 198 // Pickle order: | 198 // Pickle order: |
| 199 // | 199 // |
| 200 // index_ | 200 // index_ |
| 201 // virtual_url_ | 201 // virtual_url_ |
| 202 // title_ | 202 // title_ |
| 203 // content_state_ | 203 // page_state_ |
| 204 // transition_type_ | 204 // transition_type_ |
| 205 // | 205 // |
| 206 // Added on later: | 206 // Added on later: |
| 207 // | 207 // |
| 208 // type_mask (has_post_data_) | 208 // type_mask (has_post_data_) |
| 209 // referrer_ | 209 // referrer_ |
| 210 // original_request_url_ | 210 // original_request_url_ |
| 211 // is_overriding_user_agent_ | 211 // is_overriding_user_agent_ |
| 212 // timestamp_ | 212 // timestamp_ |
| 213 // search_terms_ | 213 // search_terms_ |
| 214 | 214 |
| 215 void SerializedNavigationEntry::WriteToPickle(int max_size, | 215 void SerializedNavigationEntry::WriteToPickle(int max_size, |
| 216 Pickle* pickle) const { | 216 Pickle* pickle) const { |
| 217 pickle->WriteInt(index_); | 217 pickle->WriteInt(index_); |
| 218 | 218 |
| 219 int bytes_written = 0; | 219 int bytes_written = 0; |
| 220 | 220 |
| 221 WriteStringToPickle(pickle, &bytes_written, max_size, | 221 WriteStringToPickle(pickle, &bytes_written, max_size, |
| 222 virtual_url_.spec()); | 222 virtual_url_.spec()); |
| 223 | 223 |
| 224 WriteString16ToPickle(pickle, &bytes_written, max_size, title_); | 224 WriteString16ToPickle(pickle, &bytes_written, max_size, title_); |
| 225 | 225 |
| 226 std::string content_state = content_state_; | 226 content::PageState page_state = page_state_; |
| 227 if (has_post_data_) { | 227 if (has_post_data_) |
| 228 content_state = | 228 page_state = page_state.RemovePasswordData(); |
| 229 webkit_glue::RemovePasswordDataFromHistoryState(content_state); | 229 |
| 230 } | 230 WriteStringToPickle(pickle, &bytes_written, max_size, |
| 231 WriteStringToPickle(pickle, &bytes_written, max_size, content_state); | 231 page_state.ToEncodedData()); |
| 232 | 232 |
| 233 pickle->WriteInt(transition_type_); | 233 pickle->WriteInt(transition_type_); |
| 234 | 234 |
| 235 const int type_mask = has_post_data_ ? HAS_POST_DATA : 0; | 235 const int type_mask = has_post_data_ ? HAS_POST_DATA : 0; |
| 236 pickle->WriteInt(type_mask); | 236 pickle->WriteInt(type_mask); |
| 237 | 237 |
| 238 WriteStringToPickle( | 238 WriteStringToPickle( |
| 239 pickle, &bytes_written, max_size, | 239 pickle, &bytes_written, max_size, |
| 240 referrer_.url.is_valid() ? referrer_.url.spec() : std::string()); | 240 referrer_.url.is_valid() ? referrer_.url.spec() : std::string()); |
| 241 | 241 |
| 242 pickle->WriteInt(referrer_.policy); | 242 pickle->WriteInt(referrer_.policy); |
| 243 | 243 |
| 244 // Save info required to override the user agent. | 244 // Save info required to override the user agent. |
| 245 WriteStringToPickle( | 245 WriteStringToPickle( |
| 246 pickle, &bytes_written, max_size, | 246 pickle, &bytes_written, max_size, |
| 247 original_request_url_.is_valid() ? | 247 original_request_url_.is_valid() ? |
| 248 original_request_url_.spec() : std::string()); | 248 original_request_url_.spec() : std::string()); |
| 249 pickle->WriteBool(is_overriding_user_agent_); | 249 pickle->WriteBool(is_overriding_user_agent_); |
| 250 pickle->WriteInt64(timestamp_.ToInternalValue()); | 250 pickle->WriteInt64(timestamp_.ToInternalValue()); |
| 251 | 251 |
| 252 WriteString16ToPickle(pickle, &bytes_written, max_size, search_terms_); | 252 WriteString16ToPickle(pickle, &bytes_written, max_size, search_terms_); |
| 253 } | 253 } |
| 254 | 254 |
| 255 bool SerializedNavigationEntry::ReadFromPickle(PickleIterator* iterator) { | 255 bool SerializedNavigationEntry::ReadFromPickle(PickleIterator* iterator) { |
| 256 *this = SerializedNavigationEntry(); | 256 *this = SerializedNavigationEntry(); |
| 257 std::string virtual_url_spec; | 257 std::string virtual_url_spec, page_state_data; |
| 258 int transition_type_int = 0; | 258 int transition_type_int = 0; |
| 259 if (!iterator->ReadInt(&index_) || | 259 if (!iterator->ReadInt(&index_) || |
| 260 !iterator->ReadString(&virtual_url_spec) || | 260 !iterator->ReadString(&virtual_url_spec) || |
| 261 !iterator->ReadString16(&title_) || | 261 !iterator->ReadString16(&title_) || |
| 262 !iterator->ReadString(&content_state_) || | 262 !iterator->ReadString(&page_state_data) || |
| 263 !iterator->ReadInt(&transition_type_int)) | 263 !iterator->ReadInt(&transition_type_int)) |
| 264 return false; | 264 return false; |
| 265 virtual_url_ = GURL(virtual_url_spec); | 265 virtual_url_ = GURL(virtual_url_spec); |
| 266 page_state_ = content::PageState::CreateFromEncodedData(page_state_data); |
| 266 transition_type_ = static_cast<content::PageTransition>(transition_type_int); | 267 transition_type_ = static_cast<content::PageTransition>(transition_type_int); |
| 267 | 268 |
| 268 // type_mask did not always exist in the written stream. As such, we | 269 // type_mask did not always exist in the written stream. As such, we |
| 269 // don't fail if it can't be read. | 270 // don't fail if it can't be read. |
| 270 int type_mask = 0; | 271 int type_mask = 0; |
| 271 bool has_type_mask = iterator->ReadInt(&type_mask); | 272 bool has_type_mask = iterator->ReadInt(&type_mask); |
| 272 | 273 |
| 273 if (has_type_mask) { | 274 if (has_type_mask) { |
| 274 has_post_data_ = type_mask & HAS_POST_DATA; | 275 has_post_data_ = type_mask & HAS_POST_DATA; |
| 275 // the "referrer" property was added after type_mask to the written | 276 // the "referrer" property was added after type_mask to the written |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 321 referrer_, | 322 referrer_, |
| 322 // Use a transition type of reload so that we don't incorrectly | 323 // Use a transition type of reload so that we don't incorrectly |
| 323 // increase the typed count. | 324 // increase the typed count. |
| 324 content::PAGE_TRANSITION_RELOAD, | 325 content::PAGE_TRANSITION_RELOAD, |
| 325 false, | 326 false, |
| 326 // The extra headers are not sync'ed across sessions. | 327 // The extra headers are not sync'ed across sessions. |
| 327 std::string(), | 328 std::string(), |
| 328 browser_context)); | 329 browser_context)); |
| 329 | 330 |
| 330 entry->SetTitle(title_); | 331 entry->SetTitle(title_); |
| 331 entry->SetContentState(content_state_); | 332 entry->SetPageState(page_state_); |
| 332 entry->SetPageID(page_id); | 333 entry->SetPageID(page_id); |
| 333 entry->SetHasPostData(has_post_data_); | 334 entry->SetHasPostData(has_post_data_); |
| 334 entry->SetPostID(post_id_); | 335 entry->SetPostID(post_id_); |
| 335 entry->SetOriginalRequestURL(original_request_url_); | 336 entry->SetOriginalRequestURL(original_request_url_); |
| 336 entry->SetIsOverridingUserAgent(is_overriding_user_agent_); | 337 entry->SetIsOverridingUserAgent(is_overriding_user_agent_); |
| 337 entry->SetTimestamp(timestamp_); | 338 entry->SetTimestamp(timestamp_); |
| 338 entry->SetExtraData(kSearchTermsKey, search_terms_); | 339 entry->SetExtraData(kSearchTermsKey, search_terms_); |
| 339 | 340 |
| 340 return entry.Pass(); | 341 return entry.Pass(); |
| 341 } | 342 } |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 445 for (std::vector<SerializedNavigationEntry>::const_iterator | 446 for (std::vector<SerializedNavigationEntry>::const_iterator |
| 446 it = navigations.begin(); it != navigations.end(); ++it) { | 447 it = navigations.begin(); it != navigations.end(); ++it) { |
| 447 entries.push_back( | 448 entries.push_back( |
| 448 it->ToNavigationEntry(page_id, browser_context).release()); | 449 it->ToNavigationEntry(page_id, browser_context).release()); |
| 449 ++page_id; | 450 ++page_id; |
| 450 } | 451 } |
| 451 return entries; | 452 return entries; |
| 452 } | 453 } |
| 453 | 454 |
| 454 } // namespace sessions | 455 } // namespace sessions |
| OLD | NEW |