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), 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition_type_(ui::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(); 600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch navigation.redirect_chain_ = entry.GetRedirectChain(); 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return navigation; 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SerializedNavigationEntry SerializedNavigationEntry::FromSyncData( 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int index, 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const sync_pb::TabNavigation& sync_data) { 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SerializedNavigationEntry navigation; 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.index_ = index; 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.unique_id_ = sync_data.unique_id(); 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation.referrer_ = content::Referrer( 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL(sync_data.referrer()), 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<blink::WebReferrerPolicy>(sync_data.referrer_policy())); 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.virtual_url_ = GURL(sync_data.virtual_url()); 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation.title_ = base::UTF8ToUTF16(sync_data.title()); 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) navigation.page_state_ = 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::PageState::CreateFromEncodedData(sync_data.state()); 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint32 transition = 0; 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (sync_data.has_page_transition()) { 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (sync_data.page_transition()) { 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_LINK: 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition = ui::PAGE_TRANSITION_LINK; 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_TYPED: 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition = ui::PAGE_TRANSITION_TYPED; 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_AUTO_BOOKMARK: 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition = ui::PAGE_TRANSITION_AUTO_BOOKMARK; 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME: 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition = ui::PAGE_TRANSITION_AUTO_SUBFRAME; 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_MANUAL_SUBFRAME: 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition = ui::PAGE_TRANSITION_MANUAL_SUBFRAME; 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_GENERATED: 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition = ui::PAGE_TRANSITION_GENERATED; 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_AUTO_TOPLEVEL: 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition = ui::PAGE_TRANSITION_AUTO_TOPLEVEL; 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_FORM_SUBMIT: 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition = ui::PAGE_TRANSITION_FORM_SUBMIT; 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_RELOAD: 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition = ui::PAGE_TRANSITION_RELOAD; 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_KEYWORD: 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition = ui::PAGE_TRANSITION_KEYWORD; 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransition_KEYWORD_GENERATED: 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition = ui::PAGE_TRANSITION_KEYWORD_GENERATED; 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition = ui::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: 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition |= ui::PAGE_TRANSITION_CLIENT_REDIRECT; 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case sync_pb::SyncEnums_PageTransitionRedirectType_SERVER_REDIRECT: 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition |= ui::PAGE_TRANSITION_SERVER_REDIRECT; 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (sync_data.navigation_forward_back()) 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition |= ui::PAGE_TRANSITION_FORWARD_BACK; 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (sync_data.navigation_from_address_bar()) 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition |= ui::PAGE_TRANSITION_FROM_ADDRESS_BAR; 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (sync_data.navigation_home_page()) 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition |= ui::PAGE_TRANSITION_HOME_PAGE; 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (sync_data.navigation_chain_start()) 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition |= ui::PAGE_TRANSITION_CHAIN_START; 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (sync_data.navigation_chain_end()) 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition |= ui::PAGE_TRANSITION_CHAIN_END; 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci navigation.transition_type_ = static_cast<ui::PageTransition>(transition); 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.timestamp_ = base::Time(); 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation.search_terms_ = base::UTF8ToUTF16(sync_data.search_terms()); 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (sync_data.has_favicon_url()) 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation.favicon_url_ = GURL(sync_data.favicon_url()); 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 149424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) navigation.http_status_code_ = sync_data.http_status_code(); 150424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation.Sanitize(); 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation.is_restored_ = true; 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return navigation; 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Helper used by SerializedNavigationEntry::WriteToPickle(). It writes |str| to 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |pickle|, if and only if |str| fits within (|max_bytes| - 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |*bytes_written|). |bytes_written| is incremented to reflect the 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// data written. 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(akalin): Unify this with the same function in 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// base_session_service.cc. 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WriteStringToPickle(Pickle* pickle, 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int* bytes_written, 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int max_bytes, 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& str) { 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_bytes = str.size() * sizeof(char); 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (*bytes_written + num_bytes < max_bytes) { 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *bytes_written += num_bytes; 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle->WriteString(str); 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle->WriteString(std::string()); 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// base::string16 version of WriteStringToPickle. 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(akalin): Unify this, too. 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WriteString16ToPickle(Pickle* pickle, 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int* bytes_written, 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int max_bytes, 186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& str) { 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int num_bytes = str.size() * sizeof(base::char16); 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (*bytes_written + num_bytes < max_bytes) { 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *bytes_written += num_bytes; 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle->WriteString16(str); 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pickle->WriteString16(base::string16()); 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A mask used for arbitrary boolean values needed to represent a 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// NavigationEntry. Currently only contains HAS_POST_DATA. 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// NOTE(akalin): We may want to just serialize |has_post_data_| 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// directly. Other bools (|is_overriding_user_agent_|) haven't been 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// added to this mask. 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum TypeMask { 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HAS_POST_DATA = 1 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Pickle order: 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// index_ 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// virtual_url_ 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// title_ 21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// page_state_ 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// transition_type_ 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Added on later: 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// type_mask (has_post_data_) 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// referrer_ 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// original_request_url_ 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// is_overriding_user_agent_ 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// timestamp_ 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// search_terms_ 224424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// http_status_code_ 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SerializedNavigationEntry::WriteToPickle(int max_size, 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Pickle* pickle) const { 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle->WriteInt(index_); 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int bytes_written = 0; 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WriteStringToPickle(pickle, &bytes_written, max_size, 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual_url_.spec()); 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WriteString16ToPickle(pickle, &bytes_written, max_size, title_); 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::PageState page_state = page_state_; 23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (has_post_data_) 23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page_state = page_state.RemovePasswordData(); 24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WriteStringToPickle(pickle, &bytes_written, max_size, 24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page_state.ToEncodedData()); 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle->WriteInt(transition_type_); 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const int type_mask = has_post_data_ ? HAS_POST_DATA : 0; 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle->WriteInt(type_mask); 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WriteStringToPickle( 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle, &bytes_written, max_size, 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) referrer_.url.is_valid() ? referrer_.url.spec() : std::string()); 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle->WriteInt(referrer_.policy); 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Save info required to override the user agent. 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WriteStringToPickle( 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle, &bytes_written, max_size, 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) original_request_url_.is_valid() ? 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) original_request_url_.spec() : std::string()); 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle->WriteBool(is_overriding_user_agent_); 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pickle->WriteInt64(timestamp_.ToInternalValue()); 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WriteString16ToPickle(pickle, &bytes_written, max_size, search_terms_); 264424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 265424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) pickle->WriteInt(http_status_code_); 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool SerializedNavigationEntry::ReadFromPickle(PickleIterator* iterator) { 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *this = SerializedNavigationEntry(); 27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string virtual_url_spec, page_state_data; 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int transition_type_int = 0; 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!iterator->ReadInt(&index_) || 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !iterator->ReadString(&virtual_url_spec) || 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !iterator->ReadString16(&title_) || 27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) !iterator->ReadString(&page_state_data) || 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !iterator->ReadInt(&transition_type_int)) 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual_url_ = GURL(virtual_url_spec); 27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page_state_ = content::PageState::CreateFromEncodedData(page_state_data); 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transition_type_ = ui::PageTransitionFromInt(transition_type_int); 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // type_mask did not always exist in the written stream. As such, we 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // don't fail if it can't be read. 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int type_mask = 0; 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool has_type_mask = iterator->ReadInt(&type_mask); 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (has_type_mask) { 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) has_post_data_ = type_mask & HAS_POST_DATA; 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the "referrer" property was added after type_mask to the written 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // stream. As such, we don't fail if it can't be read. 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string referrer_spec; 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!iterator->ReadString(&referrer_spec)) 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) referrer_spec = std::string(); 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The "referrer policy" property was added even later, so we fall back to 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the default policy if the property is not present. 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int policy_int; 297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebReferrerPolicy policy; 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (iterator->ReadInt(&policy_int)) 299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy = static_cast<blink::WebReferrerPolicy>(policy_int); 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy = blink::WebReferrerPolicyDefault; 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) referrer_ = content::Referrer(GURL(referrer_spec), policy); 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the original URL can't be found, leave it empty. 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string original_request_url_spec; 306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!iterator->ReadString(&original_request_url_spec)) 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) original_request_url_spec = std::string(); 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) original_request_url_ = GURL(original_request_url_spec); 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Default to not overriding the user agent if we don't have info. 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!iterator->ReadBool(&is_overriding_user_agent_)) 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_overriding_user_agent_ = false; 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int64 timestamp_internal_value = 0; 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (iterator->ReadInt64(×tamp_internal_value)) { 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) timestamp_ = base::Time::FromInternalValue(timestamp_internal_value); 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) timestamp_ = base::Time(); 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the search terms field can't be found, leave it empty. 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!iterator->ReadString16(&search_terms_)) 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) search_terms_.clear(); 324424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 325424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!iterator->ReadInt(&http_status_code_)) 326424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) http_status_code_ = 0; 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Sanitize(); 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_restored_ = true; 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<NavigationEntry> SerializedNavigationEntry::ToNavigationEntry( 337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int page_id, 338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::BrowserContext* browser_context) const { 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<NavigationEntry> entry( 340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::NavigationController::CreateNavigationEntry( 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual_url_, 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) referrer_, 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Use a transition type of reload so that we don't incorrectly 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // increase the typed count. 3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_RELOAD, 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The extra headers are not sync'ed across sessions. 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_context)); 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->SetTitle(title_); 35290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) entry->SetPageState(page_state_); 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->SetPageID(page_id); 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->SetHasPostData(has_post_data_); 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->SetPostID(post_id_); 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->SetOriginalRequestURL(original_request_url_); 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->SetIsOverridingUserAgent(is_overriding_user_agent_); 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->SetTimestamp(timestamp_); 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->SetExtraData(kSearchTermsKey, search_terms_); 360424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) entry->SetHttpStatusCode(http_status_code_); 3610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch entry->SetRedirectChain(redirect_chain_); 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 36390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // These fields should have default values. 36490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK_EQ(STATE_INVALID, blocked_state_); 36590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK_EQ(0u, content_pack_categories_.size()); 36690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return entry.Pass(); 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(zea): perhaps sync state (scroll position, form entries, etc.) as well? 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// See http://crbug.com/67068. 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)sync_pb::TabNavigation SerializedNavigationEntry::ToSyncData() const { 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::TabNavigation sync_data; 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_virtual_url(virtual_url_.spec()); 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_referrer(referrer_.url.spec()); 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sync_data.set_referrer_policy(referrer_.policy); 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sync_data.set_title(base::UTF16ToUTF8(title_)); 378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Page transition core. 3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci COMPILE_ASSERT(ui::PAGE_TRANSITION_LAST_CORE == 3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_KEYWORD_GENERATED, 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PageTransitionCoreBounds); 3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (ui::PageTransitionStripQualifier(transition_type_)) { 3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case ui::PAGE_TRANSITION_LINK: 385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_LINK); 387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case ui::PAGE_TRANSITION_TYPED: 389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_TYPED); 391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case ui::PAGE_TRANSITION_AUTO_BOOKMARK: 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_AUTO_BOOKMARK); 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case ui::PAGE_TRANSITION_AUTO_SUBFRAME: 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME); 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case ui::PAGE_TRANSITION_MANUAL_SUBFRAME: 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_MANUAL_SUBFRAME); 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case ui::PAGE_TRANSITION_GENERATED: 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_GENERATED); 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case ui::PAGE_TRANSITION_AUTO_TOPLEVEL: 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_AUTO_TOPLEVEL); 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case ui::PAGE_TRANSITION_FORM_SUBMIT: 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_FORM_SUBMIT); 415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case ui::PAGE_TRANSITION_RELOAD: 417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_RELOAD); 419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case ui::PAGE_TRANSITION_KEYWORD: 421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_KEYWORD); 423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case ui::PAGE_TRANSITION_KEYWORD_GENERATED: 425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_page_transition( 426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransition_KEYWORD_GENERATED); 427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Page transition qualifiers. 4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ui::PageTransitionIsRedirect(transition_type_)) { 4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (transition_type_ & ui::PAGE_TRANSITION_CLIENT_REDIRECT) { 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_redirect_type( 436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransitionRedirectType_CLIENT_REDIRECT); 4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else if (transition_type_ & ui::PAGE_TRANSITION_SERVER_REDIRECT) { 438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_redirect_type( 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_pb::SyncEnums_PageTransitionRedirectType_SERVER_REDIRECT); 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_navigation_forward_back( 4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (transition_type_ & ui::PAGE_TRANSITION_FORWARD_BACK) != 0); 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_navigation_from_address_bar( 4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (transition_type_ & ui::PAGE_TRANSITION_FROM_ADDRESS_BAR) != 0); 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_navigation_home_page( 4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (transition_type_ & ui::PAGE_TRANSITION_HOME_PAGE) != 0); 448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_navigation_chain_start( 4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (transition_type_ & ui::PAGE_TRANSITION_CHAIN_START) != 0); 450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_navigation_chain_end( 4511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (transition_type_ & ui::PAGE_TRANSITION_CHAIN_END) != 0); 452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_unique_id(unique_id_); 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_timestamp_msec(syncer::TimeToProtoTime(timestamp_)); 455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The full-resolution timestamp works as a global ID. 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_global_id(timestamp_.ToInternalValue()); 457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sync_data.set_search_terms(base::UTF16ToUTF8(search_terms_)); 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 460424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) sync_data.set_http_status_code(http_status_code_); 461424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (favicon_url_.is_valid()) 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_data.set_favicon_url(favicon_url_.spec()); 464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 46590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (blocked_state_ != STATE_INVALID) { 46690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) sync_data.set_blocked_state( 46790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static_cast<sync_pb::TabNavigation_BlockedState>(blocked_state_)); 46890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 46990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 47090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (std::set<std::string>::const_iterator it = 47190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content_pack_categories_.begin(); 47290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) it != content_pack_categories_.end(); ++it) { 47390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) sync_data.add_content_pack_categories(*it); 47490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 47590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Copy all redirect chain entries except the last URL (which should match 4770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // the virtual_url). 4780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (redirect_chain_.size() > 1) { // Single entry chains have no redirection. 4790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch size_t last_entry = redirect_chain_.size() - 1; 4800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch for (size_t i = 0; i < last_entry; i++) { 4810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch sync_pb::NavigationRedirect* navigation_redirect = 4820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch sync_data.add_navigation_redirect(); 4830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch navigation_redirect->set_url(redirect_chain_[i].spec()); 4840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 4850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // If the last URL didn't match the virtual_url, record it separately. 4860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (sync_data.virtual_url() != redirect_chain_[last_entry].spec()) { 4870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch sync_data.set_last_navigation_redirect_url( 4880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch redirect_chain_[last_entry].spec()); 4890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 4900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 4910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sync_data.set_is_restored(is_restored_); 4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return sync_data; 495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::vector<NavigationEntry*> SerializedNavigationEntry::ToNavigationEntries( 499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::vector<SerializedNavigationEntry>& navigations, 500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::BrowserContext* browser_context) { 501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int page_id = 0; 502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<NavigationEntry*> entries; 503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (std::vector<SerializedNavigationEntry>::const_iterator 504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) it = navigations.begin(); it != navigations.end(); ++it) { 505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entries.push_back( 506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) it->ToNavigationEntry(page_id, browser_context).release()); 507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++page_id; 508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return entries; 510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SerializedNavigationEntry::Sanitize() { 5135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::Referrer new_referrer = 5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::Referrer::SanitizeForRequest(virtual_url_, referrer_); 5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // No need to compare the policy, as it doesn't change during 5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // sanitization. If there has been a change, the referrer needs to be 5185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // stripped from the page state as well. 5195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (referrer_.url != new_referrer.url) { 5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) referrer_ = content::Referrer(); 5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) page_state_ = page_state_.RemoveReferrer(); 5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace sessions 526