// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "components/sessions/content/content_serialized_navigation_builder.h" #include "components/sessions/serialized_navigation_entry.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/favicon_status.h" #include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_entry.h" #include "content/public/common/page_state.h" #include "content/public/common/referrer.h" namespace sessions { // static SerializedNavigationEntry ContentSerializedNavigationBuilder::FromNavigationEntry( int index, const content::NavigationEntry& entry) { SerializedNavigationEntry navigation; navigation.index_ = index; navigation.unique_id_ = entry.GetUniqueID(); navigation.referrer_url_ = entry.GetReferrer().url; navigation.referrer_policy_ = entry.GetReferrer().policy; navigation.virtual_url_ = entry.GetVirtualURL(); navigation.title_ = entry.GetTitle(); navigation.encoded_page_state_ = entry.GetPageState().ToEncodedData(); navigation.transition_type_ = entry.GetTransitionType(); navigation.has_post_data_ = entry.GetHasPostData(); navigation.post_id_ = entry.GetPostID(); navigation.original_request_url_ = entry.GetOriginalRequestURL(); navigation.is_overriding_user_agent_ = entry.GetIsOverridingUserAgent(); navigation.timestamp_ = entry.GetTimestamp(); navigation.is_restored_ = entry.IsRestored(); entry.GetExtraData(kSearchTermsKey, &navigation.search_terms_); if (entry.GetFavicon().valid) navigation.favicon_url_ = entry.GetFavicon().url; navigation.http_status_code_ = entry.GetHttpStatusCode(); navigation.redirect_chain_ = entry.GetRedirectChain(); return navigation; } // static scoped_ptr ContentSerializedNavigationBuilder::ToNavigationEntry( const SerializedNavigationEntry* navigation, int page_id, content::BrowserContext* browser_context) { blink::WebReferrerPolicy policy = static_cast(navigation->referrer_policy_); scoped_ptr entry( content::NavigationController::CreateNavigationEntry( navigation->virtual_url_, content::Referrer::SanitizeForRequest( navigation->virtual_url_, content::Referrer(navigation->referrer_url_, policy)), // Use a transition type of reload so that we don't incorrectly // increase the typed count. ui::PAGE_TRANSITION_RELOAD, false, // The extra headers are not sync'ed across sessions. std::string(), browser_context)); entry->SetTitle(navigation->title_); entry->SetPageState(content::PageState::CreateFromEncodedData( navigation->encoded_page_state_)); entry->SetPageID(page_id); entry->SetHasPostData(navigation->has_post_data_); entry->SetPostID(navigation->post_id_); entry->SetOriginalRequestURL(navigation->original_request_url_); entry->SetIsOverridingUserAgent(navigation->is_overriding_user_agent_); entry->SetTimestamp(navigation->timestamp_); entry->SetExtraData(kSearchTermsKey, navigation->search_terms_); entry->SetHttpStatusCode(navigation->http_status_code_); entry->SetRedirectChain(navigation->redirect_chain_); // These fields should have default values. DCHECK_EQ(SerializedNavigationEntry::STATE_INVALID, navigation->blocked_state_); DCHECK_EQ(0u, navigation->content_pack_categories_.size()); return entry.Pass(); } // static ScopedVector ContentSerializedNavigationBuilder::ToNavigationEntries( const std::vector& navigations, content::BrowserContext* browser_context) { int page_id = 0; ScopedVector entries; for (std::vector::const_iterator it = navigations.begin(); it != navigations.end(); ++it) { entries.push_back( ToNavigationEntry(&(*it), page_id, browser_context).release()); ++page_id; } return entries.Pass(); } } // namespace sessions