1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include <cstddef> 6 #include <string> 7 8 #include "base/basictypes.h" 9 #include "base/memory/scoped_ptr.h" 10 #include "base/pickle.h" 11 #include "base/strings/string16.h" 12 #include "base/strings/string_number_conversions.h" 13 #include "base/strings/utf_string_conversions.h" 14 #include "base/time/time.h" 15 #include "chrome/browser/search/search.h" 16 #include "chrome/browser/sessions/session_types.h" 17 #include "components/sessions/serialized_navigation_entry_test_helper.h" 18 #include "content/public/browser/favicon_status.h" 19 #include "content/public/browser/navigation_entry.h" 20 #include "content/public/common/page_transition_types.h" 21 #include "content/public/common/referrer.h" 22 #include "sync/protocol/session_specifics.pb.h" 23 #include "sync/util/time.h" 24 #include "testing/gtest/include/gtest/gtest.h" 25 #include "third_party/WebKit/public/platform/WebReferrerPolicy.h" 26 #include "url/gurl.h" 27 28 namespace { 29 30 const int kIndex = 3; 31 const int kUniqueID = 50; 32 const content::Referrer kReferrer = 33 content::Referrer(GURL("http://www.referrer.com"), 34 WebKit::WebReferrerPolicyAlways); 35 const GURL kVirtualURL("http://www.virtual-url.com"); 36 const string16 kTitle = ASCIIToUTF16("title"); 37 const content::PageState kPageState = 38 content::PageState::CreateFromEncodedData("page state"); 39 const content::PageTransition kTransitionType = 40 static_cast<content::PageTransition>( 41 content::PAGE_TRANSITION_AUTO_SUBFRAME | 42 content::PAGE_TRANSITION_HOME_PAGE | 43 content::PAGE_TRANSITION_CLIENT_REDIRECT); 44 const bool kHasPostData = true; 45 const int64 kPostID = 100; 46 const GURL kOriginalRequestURL("http://www.original-request.com"); 47 const bool kIsOverridingUserAgent = true; 48 const base::Time kTimestamp = syncer::ProtoTimeToTime(100); 49 const string16 kSearchTerms = ASCIIToUTF16("my search terms"); 50 const GURL kFaviconURL("http://virtual-url.com/favicon.ico"); 51 52 const int kPageID = 10; 53 54 // Create a NavigationEntry from the constants above. 55 scoped_ptr<content::NavigationEntry> MakeNavigationEntryForTest() { 56 scoped_ptr<content::NavigationEntry> navigation_entry( 57 content::NavigationEntry::Create()); 58 navigation_entry->SetReferrer(kReferrer); 59 navigation_entry->SetVirtualURL(kVirtualURL); 60 navigation_entry->SetTitle(kTitle); 61 navigation_entry->SetPageState(kPageState); 62 navigation_entry->SetTransitionType(kTransitionType); 63 navigation_entry->SetHasPostData(kHasPostData); 64 navigation_entry->SetPostID(kPostID); 65 navigation_entry->SetOriginalRequestURL(kOriginalRequestURL); 66 navigation_entry->SetIsOverridingUserAgent(kIsOverridingUserAgent); 67 navigation_entry->SetTimestamp(kTimestamp); 68 navigation_entry->SetExtraData(sessions::kSearchTermsKey, kSearchTerms); 69 navigation_entry->GetFavicon().valid = true; 70 navigation_entry->GetFavicon().url = kFaviconURL; 71 return navigation_entry.Pass(); 72 } 73 74 // Create a sync_pb::TabNavigation from the constants above. 75 sync_pb::TabNavigation MakeSyncDataForTest() { 76 sync_pb::TabNavigation sync_data; 77 sync_data.set_virtual_url(kVirtualURL.spec()); 78 sync_data.set_referrer(kReferrer.url.spec()); 79 sync_data.set_title(UTF16ToUTF8(kTitle)); 80 sync_data.set_state(kPageState.ToEncodedData()); 81 sync_data.set_page_transition( 82 sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME); 83 sync_data.set_unique_id(kUniqueID); 84 sync_data.set_timestamp_msec(syncer::TimeToProtoTime(kTimestamp)); 85 sync_data.set_redirect_type(sync_pb::SyncEnums::CLIENT_REDIRECT); 86 sync_data.set_navigation_home_page(true); 87 sync_data.set_search_terms(UTF16ToUTF8(kSearchTerms)); 88 sync_data.set_favicon_url(kFaviconURL.spec()); 89 return sync_data; 90 } 91 92 // Create a typical SessionTab protocol buffer and set an existing 93 // SessionTab from it. The data from the protocol buffer should 94 // clobber the existing data. 95 TEST(SessionTab, FromSyncData) { 96 sync_pb::SessionTab sync_data; 97 sync_data.set_tab_id(5); 98 sync_data.set_window_id(10); 99 sync_data.set_tab_visual_index(13); 100 sync_data.set_current_navigation_index(3); 101 sync_data.set_pinned(true); 102 sync_data.set_extension_app_id("app_id"); 103 for (int i = 0; i < 5; ++i) { 104 sync_pb::TabNavigation* navigation = sync_data.add_navigation(); 105 navigation->set_virtual_url("http://foo/" + base::IntToString(i)); 106 navigation->set_referrer("referrer"); 107 navigation->set_title("title"); 108 navigation->set_page_transition(sync_pb::SyncEnums_PageTransition_TYPED); 109 } 110 111 SessionTab tab; 112 tab.window_id.set_id(100); 113 tab.tab_id.set_id(100); 114 tab.tab_visual_index = 100; 115 tab.current_navigation_index = 1000; 116 tab.pinned = false; 117 tab.extension_app_id = "fake"; 118 tab.user_agent_override = "fake"; 119 tab.timestamp = base::Time::FromInternalValue(100); 120 tab.navigations.resize(100); 121 tab.session_storage_persistent_id = "fake"; 122 123 tab.SetFromSyncData(sync_data, base::Time::FromInternalValue(5u)); 124 EXPECT_EQ(10, tab.window_id.id()); 125 EXPECT_EQ(5, tab.tab_id.id()); 126 EXPECT_EQ(13, tab.tab_visual_index); 127 EXPECT_EQ(3, tab.current_navigation_index); 128 EXPECT_TRUE(tab.pinned); 129 EXPECT_EQ("app_id", tab.extension_app_id); 130 EXPECT_TRUE(tab.user_agent_override.empty()); 131 EXPECT_EQ(5u, tab.timestamp.ToInternalValue()); 132 ASSERT_EQ(5u, tab.navigations.size()); 133 for (int i = 0; i < 5; ++i) { 134 EXPECT_EQ(i, tab.navigations[i].index()); 135 EXPECT_EQ(GURL("referrer"), tab.navigations[i].referrer().url); 136 EXPECT_EQ(string16(ASCIIToUTF16("title")), tab.navigations[i].title()); 137 EXPECT_EQ(content::PAGE_TRANSITION_TYPED, 138 tab.navigations[i].transition_type()); 139 EXPECT_EQ(GURL("http://foo/" + base::IntToString(i)), 140 tab.navigations[i].virtual_url()); 141 } 142 EXPECT_TRUE(tab.session_storage_persistent_id.empty()); 143 } 144 145 TEST(SessionTab, ToSyncData) { 146 SessionTab tab; 147 tab.window_id.set_id(10); 148 tab.tab_id.set_id(5); 149 tab.tab_visual_index = 13; 150 tab.current_navigation_index = 3; 151 tab.pinned = true; 152 tab.extension_app_id = "app_id"; 153 tab.user_agent_override = "fake"; 154 tab.timestamp = base::Time::FromInternalValue(100); 155 for (int i = 0; i < 5; ++i) { 156 tab.navigations.push_back( 157 sessions::SerializedNavigationEntryTestHelper::CreateNavigation( 158 "http://foo/" + base::IntToString(i), "title")); 159 } 160 tab.session_storage_persistent_id = "fake"; 161 162 const sync_pb::SessionTab& sync_data = tab.ToSyncData(); 163 EXPECT_EQ(5, sync_data.tab_id()); 164 EXPECT_EQ(10, sync_data.window_id()); 165 EXPECT_EQ(13, sync_data.tab_visual_index()); 166 EXPECT_EQ(3, sync_data.current_navigation_index()); 167 EXPECT_TRUE(sync_data.pinned()); 168 EXPECT_EQ("app_id", sync_data.extension_app_id()); 169 ASSERT_EQ(5, sync_data.navigation_size()); 170 for (int i = 0; i < 5; ++i) { 171 EXPECT_EQ(tab.navigations[i].virtual_url().spec(), 172 sync_data.navigation(i).virtual_url()); 173 EXPECT_EQ(UTF16ToUTF8(tab.navigations[i].title()), 174 sync_data.navigation(i).title()); 175 } 176 EXPECT_FALSE(sync_data.has_favicon()); 177 EXPECT_FALSE(sync_data.has_favicon_type()); 178 EXPECT_FALSE(sync_data.has_favicon_source()); 179 } 180 181 } // namespace 182