serialized_navigation_entry.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/sessions/serialized_navigation_entry.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/pickle.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/favicon_status.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/navigation_controller.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/navigation_entry.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "sync/protocol/session_specifics.pb.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "sync/util/time.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebReferrerPolicy.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using content::NavigationEntry; 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace sessions { 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kSearchTermsKey[] = "search_terms"; 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SerializedNavigationEntry::SerializedNavigationEntry() 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : index_(-1), 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unique_id_(0), 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transition_type_(content::PAGE_TRANSITION_TYPED), 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) has_post_data_(false), 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) post_id_(-1), 2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) is_overriding_user_agent_(false), 29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) http_status_code_(0), 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_restored_(false), 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) blocked_state_(STATE_INVALID) {} 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SerializedNavigationEntry::~SerializedNavigationEntry() {} 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SerializedNavigationEntry SerializedNavigationEntry::FromNavigationEntry( 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int index, 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const NavigationEntry& entry) { 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SerializedNavigationEntry navigation; 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.index_ = index; 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.unique_id_ = entry.GetUniqueID(); 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.referrer_ = entry.GetReferrer(); 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.virtual_url_ = entry.GetVirtualURL(); 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.title_ = entry.GetTitle(); 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) navigation.page_state_ = entry.GetPageState(); 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.transition_type_ = entry.GetTransitionType(); 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.has_post_data_ = entry.GetHasPostData(); 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.post_id_ = entry.GetPostID(); 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.original_request_url_ = entry.GetOriginalRequestURL(); 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.is_overriding_user_agent_ = entry.GetIsOverridingUserAgent(); 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.timestamp_ = entry.GetTimestamp(); 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation.is_restored_ = entry.IsRestored(); 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If you want to navigate a named frame in Chrome, you will first need to 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // add support for persisting it. It is currently only used for layout tests. 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CHECK(entry.GetFrameToNavigate().empty()); 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry.GetExtraData(kSearchTermsKey, &navigation.search_terms_); 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (entry.GetFavicon().valid) 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.favicon_url_ = entry.GetFavicon().url; 59424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) navigation.http_status_code_ = entry.GetHttpStatusCode(); 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return navigation; 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SerializedNavigationEntry SerializedNavigationEntry::FromSyncData( 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int index, 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const sync_pb::TabNavigation& sync_data) { 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SerializedNavigationEntry navigation; 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.index_ = index; 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.unique_id_ = sync_data.unique_id(); 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation.referrer_ = content::Referrer( 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL(sync_data.referrer()), 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<blink::WebReferrerPolicy>(sync_data.referrer_policy())); 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.virtual_url_ = GURL(sync_data.virtual_url()); 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation.title_ = base::UTF8ToUTF16(sync_data.title()); 7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) navigation.page_state_ = 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::PageState::CreateFromEncodedData(sync_data.state()); 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint32 transition = 0; 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (sync_data.has_page_transition()) { 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (sync_data.page_transition()) { 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_LINK: 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transition = content::PAGE_TRANSITION_LINK; 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_TYPED: 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transition = content::PAGE_TRANSITION_TYPED; 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_AUTO_BOOKMARK: 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transition = content::PAGE_TRANSITION_AUTO_BOOKMARK; 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME: 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transition = content::PAGE_TRANSITION_AUTO_SUBFRAME; 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_MANUAL_SUBFRAME: 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transition = content::PAGE_TRANSITION_MANUAL_SUBFRAME; 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_GENERATED: 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transition = content::PAGE_TRANSITION_GENERATED; 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_AUTO_TOPLEVEL: 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transition = content::PAGE_TRANSITION_AUTO_TOPLEVEL; 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_FORM_SUBMIT: 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transition = content::PAGE_TRANSITION_FORM_SUBMIT; 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_RELOAD: 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transition = content::PAGE_TRANSITION_RELOAD; 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_KEYWORD: 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transition = content::PAGE_TRANSITION_KEYWORD; 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_KEYWORD_GENERATED: 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transition = 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::PAGE_TRANSITION_KEYWORD_GENERATED; 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transition = content::PAGE_TRANSITION_LINK; 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (sync_data.has_redirect_type()) { 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (sync_data.redirect_type()) { 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransitionRedirectType_CLIENT_REDIRECT: 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transition |= content::PAGE_TRANSITION_CLIENT_REDIRECT; 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransitionRedirectType_SERVER_REDIRECT: 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transition |= content::PAGE_TRANSITION_SERVER_REDIRECT; 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (sync_data.navigation_forward_back()) 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transition |= content::PAGE_TRANSITION_FORWARD_BACK; 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (sync_data.navigation_from_address_bar()) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transition |= content::PAGE_TRANSITION_FROM_ADDRESS_BAR; 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (sync_data.navigation_home_page()) 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transition |= content::PAGE_TRANSITION_HOME_PAGE; 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (sync_data.navigation_chain_start()) 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transition |= content::PAGE_TRANSITION_CHAIN_START; 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (sync_data.navigation_chain_end()) 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transition |= content::PAGE_TRANSITION_CHAIN_END; 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.transition_type_ = 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static_cast<content::PageTransition>(transition); 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.timestamp_ = base::Time(); 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation.search_terms_ = base::UTF8ToUTF16(sync_data.search_terms()); 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (sync_data.has_favicon_url()) 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.favicon_url_ = GURL(sync_data.favicon_url()); 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 150424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) navigation.http_status_code_ = sync_data.http_status_code(); 151424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // We shouldn't sync session data for managed users down at the moment. 15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!sync_data.has_blocked_state()); 15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK_EQ(0, sync_data.content_pack_categories_size()); 15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation.Sanitize(); 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation.is_restored_ = true; 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return navigation; 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Helper used by SerializedNavigationEntry::WriteToPickle(). It writes |str| to 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |pickle|, if and only if |str| fits within (|max_bytes| - 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |*bytes_written|). |bytes_written| is incremented to reflect the 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// data written. 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(akalin): Unify this with the same function in 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// base_session_service.cc. 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WriteStringToPickle(Pickle* pickle, 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int* bytes_written, 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int max_bytes, 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& str) { 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_bytes = str.size() * sizeof(char); 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (*bytes_written + num_bytes < max_bytes) { 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *bytes_written += num_bytes; 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle->WriteString(str); 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle->WriteString(std::string()); 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// base::string16 version of WriteStringToPickle. 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(akalin): Unify this, too. 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WriteString16ToPickle(Pickle* pickle, 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int* bytes_written, 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int max_bytes, 191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& str) { 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int num_bytes = str.size() * sizeof(base::char16); 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (*bytes_written + num_bytes < max_bytes) { 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *bytes_written += num_bytes; 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle->WriteString16(str); 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pickle->WriteString16(base::string16()); 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A mask used for arbitrary boolean values needed to represent a 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// NavigationEntry. Currently only contains HAS_POST_DATA. 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// NOTE(akalin): We may want to just serialize |has_post_data_| 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// directly. Other bools (|is_overriding_user_agent_|) haven't been 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// added to this mask. 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum TypeMask { 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HAS_POST_DATA = 1 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Pickle order: 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// index_ 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// virtual_url_ 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// title_ 21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// page_state_ 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// transition_type_ 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Added on later: 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// type_mask (has_post_data_) 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// referrer_ 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// original_request_url_ 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// is_overriding_user_agent_ 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// timestamp_ 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// search_terms_ 229424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// http_status_code_ 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SerializedNavigationEntry::WriteToPickle(int max_size, 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Pickle* pickle) const { 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle->WriteInt(index_); 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int bytes_written = 0; 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WriteStringToPickle(pickle, &bytes_written, max_size, 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual_url_.spec()); 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WriteString16ToPickle(pickle, &bytes_written, max_size, title_); 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::PageState page_state = page_state_; 24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (has_post_data_) 24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page_state = page_state.RemovePasswordData(); 24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WriteStringToPickle(pickle, &bytes_written, max_size, 24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page_state.ToEncodedData()); 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle->WriteInt(transition_type_); 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const int type_mask = has_post_data_ ? HAS_POST_DATA : 0; 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle->WriteInt(type_mask); 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WriteStringToPickle( 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle, &bytes_written, max_size, 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) referrer_.url.is_valid() ? referrer_.url.spec() : std::string()); 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle->WriteInt(referrer_.policy); 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Save info required to override the user agent. 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WriteStringToPickle( 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle, &bytes_written, max_size, 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) original_request_url_.is_valid() ? 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) original_request_url_.spec() : std::string()); 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle->WriteBool(is_overriding_user_agent_); 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle->WriteInt64(timestamp_.ToInternalValue()); 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WriteString16ToPickle(pickle, &bytes_written, max_size, search_terms_); 269424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 270424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) pickle->WriteInt(http_status_code_); 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool SerializedNavigationEntry::ReadFromPickle(PickleIterator* iterator) { 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *this = SerializedNavigationEntry(); 27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string virtual_url_spec, page_state_data; 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int transition_type_int = 0; 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!iterator->ReadInt(&index_) || 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !iterator->ReadString(&virtual_url_spec) || 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !iterator->ReadString16(&title_) || 28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) !iterator->ReadString(&page_state_data) || 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !iterator->ReadInt(&transition_type_int)) 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual_url_ = GURL(virtual_url_spec); 28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page_state_ = content::PageState::CreateFromEncodedData(page_state_data); 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transition_type_ = static_cast<content::PageTransition>(transition_type_int); 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // type_mask did not always exist in the written stream. As such, we 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // don't fail if it can't be read. 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int type_mask = 0; 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool has_type_mask = iterator->ReadInt(&type_mask); 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (has_type_mask) { 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) has_post_data_ = type_mask & HAS_POST_DATA; 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the "referrer" property was added after type_mask to the written 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // stream. As such, we don't fail if it can't be read. 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string referrer_spec; 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!iterator->ReadString(&referrer_spec)) 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) referrer_spec = std::string(); 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The "referrer policy" property was added even later, so we fall back to 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the default policy if the property is not present. 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int policy_int; 302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebReferrerPolicy policy; 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (iterator->ReadInt(&policy_int)) 304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy = static_cast<blink::WebReferrerPolicy>(policy_int); 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy = blink::WebReferrerPolicyDefault; 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) referrer_ = content::Referrer(GURL(referrer_spec), policy); 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the original URL can't be found, leave it empty. 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string original_request_url_spec; 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!iterator->ReadString(&original_request_url_spec)) 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) original_request_url_spec = std::string(); 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) original_request_url_ = GURL(original_request_url_spec); 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Default to not overriding the user agent if we don't have info. 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!iterator->ReadBool(&is_overriding_user_agent_)) 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_overriding_user_agent_ = false; 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int64 timestamp_internal_value = 0; 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (iterator->ReadInt64(×tamp_internal_value)) { 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) timestamp_ = base::Time::FromInternalValue(timestamp_internal_value); 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) timestamp_ = base::Time(); 324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the search terms field can't be found, leave it empty. 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!iterator->ReadString16(&search_terms_)) 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) search_terms_.clear(); 329424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 330424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!iterator->ReadInt(&http_status_code_)) 331424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) http_status_code_ = 0; 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Sanitize(); 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_restored_ = true; 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<NavigationEntry> SerializedNavigationEntry::ToNavigationEntry( 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int page_id, 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::BrowserContext* browser_context) const { 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<NavigationEntry> entry( 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::NavigationController::CreateNavigationEntry( 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual_url_, 347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) referrer_, 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Use a transition type of reload so that we don't incorrectly 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // increase the typed count. 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::PAGE_TRANSITION_RELOAD, 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The extra headers are not sync'ed across sessions. 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_context)); 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->SetTitle(title_); 35790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) entry->SetPageState(page_state_); 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->SetPageID(page_id); 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->SetHasPostData(has_post_data_); 360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->SetPostID(post_id_); 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->SetOriginalRequestURL(original_request_url_); 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->SetIsOverridingUserAgent(is_overriding_user_agent_); 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->SetTimestamp(timestamp_); 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->SetExtraData(kSearchTermsKey, search_terms_); 365424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) entry->SetHttpStatusCode(http_status_code_); 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 36790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // These fields should have default values. 36890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK_EQ(STATE_INVALID, blocked_state_); 36990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK_EQ(0u, content_pack_categories_.size()); 37090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return entry.Pass(); 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(zea): perhaps sync state (scroll position, form entries, etc.) as well? 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// See http://crbug.com/67068. 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)sync_pb::TabNavigation SerializedNavigationEntry::ToSyncData() const { 377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::TabNavigation sync_data; 378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_virtual_url(virtual_url_.spec()); 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_referrer(referrer_.url.spec()); 3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sync_data.set_referrer_policy(referrer_.policy); 3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sync_data.set_title(base::UTF16ToUTF8(title_)); 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Page transition core. 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) COMPILE_ASSERT(content::PAGE_TRANSITION_LAST_CORE == 385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::PAGE_TRANSITION_KEYWORD_GENERATED, 386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PageTransitionCoreBounds); 387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (PageTransitionStripQualifier(transition_type_)) { 388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case content::PAGE_TRANSITION_LINK: 389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_LINK); 391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case content::PAGE_TRANSITION_TYPED: 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_TYPED); 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case content::PAGE_TRANSITION_AUTO_BOOKMARK: 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_AUTO_BOOKMARK); 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case content::PAGE_TRANSITION_AUTO_SUBFRAME: 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME); 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case content::PAGE_TRANSITION_MANUAL_SUBFRAME: 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_MANUAL_SUBFRAME); 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case content::PAGE_TRANSITION_GENERATED: 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_GENERATED); 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case content::PAGE_TRANSITION_AUTO_TOPLEVEL: 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_AUTO_TOPLEVEL); 415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case content::PAGE_TRANSITION_FORM_SUBMIT: 417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_FORM_SUBMIT); 419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case content::PAGE_TRANSITION_RELOAD: 421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_RELOAD); 423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case content::PAGE_TRANSITION_KEYWORD: 425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_KEYWORD); 427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case content::PAGE_TRANSITION_KEYWORD_GENERATED: 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_KEYWORD_GENERATED); 431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Page transition qualifiers. 437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (PageTransitionIsRedirect(transition_type_)) { 438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (transition_type_ & content::PAGE_TRANSITION_CLIENT_REDIRECT) { 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_redirect_type( 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransitionRedirectType_CLIENT_REDIRECT); 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (transition_type_ & content::PAGE_TRANSITION_SERVER_REDIRECT) { 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_redirect_type( 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransitionRedirectType_SERVER_REDIRECT); 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_navigation_forward_back( 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (transition_type_ & content::PAGE_TRANSITION_FORWARD_BACK) != 0); 448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_navigation_from_address_bar( 449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (transition_type_ & content::PAGE_TRANSITION_FROM_ADDRESS_BAR) != 0); 450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_navigation_home_page( 451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (transition_type_ & content::PAGE_TRANSITION_HOME_PAGE) != 0); 452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_navigation_chain_start( 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (transition_type_ & content::PAGE_TRANSITION_CHAIN_START) != 0); 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_navigation_chain_end( 455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (transition_type_ & content::PAGE_TRANSITION_CHAIN_END) != 0); 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_unique_id(unique_id_); 458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_timestamp_msec(syncer::TimeToProtoTime(timestamp_)); 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The full-resolution timestamp works as a global ID. 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_global_id(timestamp_.ToInternalValue()); 461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sync_data.set_search_terms(base::UTF16ToUTF8(search_terms_)); 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 464424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) sync_data.set_http_status_code(http_status_code_); 465424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (favicon_url_.is_valid()) 467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_favicon_url(favicon_url_.spec()); 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 46990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (blocked_state_ != STATE_INVALID) { 47090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) sync_data.set_blocked_state( 47190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static_cast<sync_pb::TabNavigation_BlockedState>(blocked_state_)); 47290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 47390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 47490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (std::set<std::string>::const_iterator it = 47590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content_pack_categories_.begin(); 47690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) it != content_pack_categories_.end(); ++it) { 47790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) sync_data.add_content_pack_categories(*it); 47890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 47990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sync_data.set_is_restored(is_restored_); 4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return sync_data; 483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::vector<NavigationEntry*> SerializedNavigationEntry::ToNavigationEntries( 487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::vector<SerializedNavigationEntry>& navigations, 488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::BrowserContext* browser_context) { 489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int page_id = 0; 490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<NavigationEntry*> entries; 491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (std::vector<SerializedNavigationEntry>::const_iterator 492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) it = navigations.begin(); it != navigations.end(); ++it) { 493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entries.push_back( 494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) it->ToNavigationEntry(page_id, browser_context).release()); 495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++page_id; 496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return entries; 498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SerializedNavigationEntry::Sanitize() { 5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Store original referrer so we can later see whether it was actually 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // changed during sanitization, and we need to strip the referrer from the 5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // page state as well. 5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::Referrer old_referrer = referrer_; 5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!referrer_.url.SchemeIsHTTPOrHTTPS()) 5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) referrer_ = content::Referrer(); 5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (referrer_.policy) { 5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case blink::WebReferrerPolicyNever: 5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) referrer_.url = GURL(); 5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case blink::WebReferrerPolicyAlways: 5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case blink::WebReferrerPolicyOrigin: 5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) referrer_.url = referrer_.url.GetWithEmptyPath(); 5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case blink::WebReferrerPolicyDefault: 5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Fall through. 5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default: 5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) referrer_.policy = blink::WebReferrerPolicyDefault; 5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (referrer_.url.SchemeIsSecure() && !virtual_url_.SchemeIsSecure()) 5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) referrer_.url = GURL(); 5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (referrer_.url != old_referrer.url || 5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) referrer_.policy != old_referrer.policy) { 5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) referrer_ = content::Referrer(); 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) page_state_ = page_state_.RemoveReferrer(); 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace sessions 533