| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 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 "android_webview/native/state_serializer.h" | |
| 6 | |
| 7 #include <memory> | |
| 8 #include <string> | |
| 9 | |
| 10 #include "base/pickle.h" | |
| 11 #include "base/strings/utf_string_conversions.h" | |
| 12 #include "base/time/time.h" | |
| 13 #include "content/public/browser/content_browser_client.h" | |
| 14 #include "content/public/browser/navigation_entry.h" | |
| 15 #include "content/public/common/content_client.h" | |
| 16 #include "content/public/common/page_state.h" | |
| 17 #include "testing/gtest/include/gtest/gtest.h" | |
| 18 #include "url/gurl.h" | |
| 19 | |
| 20 using std::string; | |
| 21 | |
| 22 namespace android_webview { | |
| 23 | |
| 24 namespace { | |
| 25 | |
| 26 std::unique_ptr<content::NavigationEntry> CreateNavigationEntry() { | |
| 27 std::unique_ptr<content::NavigationEntry> entry( | |
| 28 content::NavigationEntry::Create()); | |
| 29 | |
| 30 const GURL url("http://url"); | |
| 31 const GURL virtual_url("http://virtual_url"); | |
| 32 content::Referrer referrer; | |
| 33 referrer.url = GURL("http://referrer_url"); | |
| 34 referrer.policy = blink::kWebReferrerPolicyOrigin; | |
| 35 const base::string16 title(base::UTF8ToUTF16("title")); | |
| 36 const content::PageState page_state = | |
| 37 content::PageState::CreateFromEncodedData("completely bogus state"); | |
| 38 const bool has_post_data = true; | |
| 39 const GURL original_request_url("http://original_request_url"); | |
| 40 const GURL base_url_for_data_url("http://base_url"); | |
| 41 const string data_url_as_string("data:text/html;charset=utf-8;base64,"); | |
| 42 const bool is_overriding_user_agent = true; | |
| 43 const base::Time timestamp = base::Time::FromInternalValue(12345); | |
| 44 const int http_status_code = 404; | |
| 45 | |
| 46 entry->SetURL(url); | |
| 47 entry->SetVirtualURL(virtual_url); | |
| 48 entry->SetReferrer(referrer); | |
| 49 entry->SetTitle(title); | |
| 50 entry->SetPageState(page_state); | |
| 51 entry->SetHasPostData(has_post_data); | |
| 52 entry->SetOriginalRequestURL(original_request_url); | |
| 53 entry->SetBaseURLForDataURL(base_url_for_data_url); | |
| 54 { | |
| 55 scoped_refptr<base::RefCountedString> s = new base::RefCountedString(); | |
| 56 s->data().assign(data_url_as_string); | |
| 57 entry->SetDataURLAsString(s); | |
| 58 } | |
| 59 entry->SetIsOverridingUserAgent(is_overriding_user_agent); | |
| 60 entry->SetTimestamp(timestamp); | |
| 61 entry->SetHttpStatusCode(http_status_code); | |
| 62 return entry; | |
| 63 } | |
| 64 | |
| 65 } // namespace | |
| 66 | |
| 67 TEST(AndroidWebViewStateSerializerTest, TestHeaderSerialization) { | |
| 68 base::Pickle pickle; | |
| 69 bool result = internal::WriteHeaderToPickle(&pickle); | |
| 70 EXPECT_TRUE(result); | |
| 71 | |
| 72 base::PickleIterator iterator(pickle); | |
| 73 uint32_t version = internal::RestoreHeaderFromPickle(&iterator); | |
| 74 EXPECT_GT(version, 0U); | |
| 75 } | |
| 76 | |
| 77 TEST(AndroidWebViewStateSerializerTest, TestLegacyVersionHeaderSerialization) { | |
| 78 base::Pickle pickle; | |
| 79 bool result = internal::WriteHeaderToPickle( | |
| 80 internal::AW_STATE_VERSION_INITIAL, &pickle); | |
| 81 EXPECT_TRUE(result); | |
| 82 | |
| 83 base::PickleIterator iterator(pickle); | |
| 84 uint32_t version = internal::RestoreHeaderFromPickle(&iterator); | |
| 85 EXPECT_EQ(version, internal::AW_STATE_VERSION_INITIAL); | |
| 86 } | |
| 87 | |
| 88 TEST(AndroidWebViewStateSerializerTest, | |
| 89 TestUnsupportedVersionHeaderSerialization) { | |
| 90 base::Pickle pickle; | |
| 91 bool result = internal::WriteHeaderToPickle(20000101, &pickle); | |
| 92 EXPECT_TRUE(result); | |
| 93 | |
| 94 base::PickleIterator iterator(pickle); | |
| 95 uint32_t version = internal::RestoreHeaderFromPickle(&iterator); | |
| 96 EXPECT_EQ(version, 0U); | |
| 97 } | |
| 98 | |
| 99 TEST(AndroidWebViewStateSerializerTest, TestNavigationEntrySerialization) { | |
| 100 // This is required for NavigationEntry::Create. | |
| 101 content::ContentClient content_client; | |
| 102 content::SetContentClient(&content_client); | |
| 103 content::ContentBrowserClient browser_client; | |
| 104 content::SetBrowserClientForTesting(&browser_client); | |
| 105 | |
| 106 std::unique_ptr<content::NavigationEntry> entry(CreateNavigationEntry()); | |
| 107 | |
| 108 base::Pickle pickle; | |
| 109 bool result = internal::WriteNavigationEntryToPickle(*entry, &pickle); | |
| 110 EXPECT_TRUE(result); | |
| 111 | |
| 112 std::unique_ptr<content::NavigationEntry> copy( | |
| 113 content::NavigationEntry::Create()); | |
| 114 base::PickleIterator iterator(pickle); | |
| 115 result = internal::RestoreNavigationEntryFromPickle(&iterator, copy.get()); | |
| 116 EXPECT_TRUE(result); | |
| 117 | |
| 118 EXPECT_EQ(entry->GetURL(), copy->GetURL()); | |
| 119 EXPECT_EQ(entry->GetVirtualURL(), copy->GetVirtualURL()); | |
| 120 EXPECT_EQ(entry->GetReferrer().url, copy->GetReferrer().url); | |
| 121 EXPECT_EQ(entry->GetReferrer().policy, copy->GetReferrer().policy); | |
| 122 EXPECT_EQ(entry->GetTitle(), copy->GetTitle()); | |
| 123 EXPECT_EQ(entry->GetPageState(), copy->GetPageState()); | |
| 124 EXPECT_EQ(entry->GetHasPostData(), copy->GetHasPostData()); | |
| 125 EXPECT_EQ(entry->GetOriginalRequestURL(), copy->GetOriginalRequestURL()); | |
| 126 EXPECT_EQ(entry->GetBaseURLForDataURL(), copy->GetBaseURLForDataURL()); | |
| 127 EXPECT_EQ(entry->GetDataURLAsString()->data(), | |
| 128 copy->GetDataURLAsString()->data()); | |
| 129 EXPECT_EQ(entry->GetIsOverridingUserAgent(), | |
| 130 copy->GetIsOverridingUserAgent()); | |
| 131 EXPECT_EQ(entry->GetTimestamp(), copy->GetTimestamp()); | |
| 132 EXPECT_EQ(entry->GetHttpStatusCode(), copy->GetHttpStatusCode()); | |
| 133 } | |
| 134 | |
| 135 TEST(AndroidWebViewStateSerializerTest, | |
| 136 TestLegacyNavigationEntrySerialization) { | |
| 137 // This is required for NavigationEntry::Create. | |
| 138 content::ContentClient content_client; | |
| 139 content::SetContentClient(&content_client); | |
| 140 content::ContentBrowserClient browser_client; | |
| 141 content::SetBrowserClientForTesting(&browser_client); | |
| 142 | |
| 143 std::unique_ptr<content::NavigationEntry> entry(CreateNavigationEntry()); | |
| 144 | |
| 145 base::Pickle pickle; | |
| 146 bool result = internal::WriteNavigationEntryToPickle( | |
| 147 internal::AW_STATE_VERSION_INITIAL, *entry, &pickle); | |
| 148 EXPECT_TRUE(result); | |
| 149 | |
| 150 std::unique_ptr<content::NavigationEntry> copy( | |
| 151 content::NavigationEntry::Create()); | |
| 152 base::PickleIterator iterator(pickle); | |
| 153 result = internal::RestoreNavigationEntryFromPickle( | |
| 154 internal::AW_STATE_VERSION_INITIAL, &iterator, copy.get()); | |
| 155 EXPECT_TRUE(result); | |
| 156 | |
| 157 EXPECT_EQ(entry->GetURL(), copy->GetURL()); | |
| 158 EXPECT_EQ(entry->GetVirtualURL(), copy->GetVirtualURL()); | |
| 159 EXPECT_EQ(entry->GetReferrer().url, copy->GetReferrer().url); | |
| 160 EXPECT_EQ(entry->GetReferrer().policy, copy->GetReferrer().policy); | |
| 161 EXPECT_EQ(entry->GetTitle(), copy->GetTitle()); | |
| 162 EXPECT_EQ(entry->GetPageState(), copy->GetPageState()); | |
| 163 EXPECT_EQ(entry->GetHasPostData(), copy->GetHasPostData()); | |
| 164 EXPECT_EQ(entry->GetOriginalRequestURL(), copy->GetOriginalRequestURL()); | |
| 165 EXPECT_EQ(entry->GetBaseURLForDataURL(), copy->GetBaseURLForDataURL()); | |
| 166 // DataURL not supported by 20130814 format | |
| 167 EXPECT_FALSE(copy->GetDataURLAsString()); | |
| 168 EXPECT_EQ(entry->GetIsOverridingUserAgent(), | |
| 169 copy->GetIsOverridingUserAgent()); | |
| 170 EXPECT_EQ(entry->GetTimestamp(), copy->GetTimestamp()); | |
| 171 EXPECT_EQ(entry->GetHttpStatusCode(), copy->GetHttpStatusCode()); | |
| 172 } | |
| 173 | |
| 174 TEST(AndroidWebViewStateSerializerTest, TestEmptyDataURLSerialization) { | |
| 175 // This is required for NavigationEntry::Create. | |
| 176 content::ContentClient content_client; | |
| 177 content::SetContentClient(&content_client); | |
| 178 content::ContentBrowserClient browser_client; | |
| 179 content::SetBrowserClientForTesting(&browser_client); | |
| 180 | |
| 181 std::unique_ptr<content::NavigationEntry> entry( | |
| 182 content::NavigationEntry::Create()); | |
| 183 EXPECT_FALSE(entry->GetDataURLAsString()); | |
| 184 | |
| 185 base::Pickle pickle; | |
| 186 bool result = internal::WriteNavigationEntryToPickle(*entry, &pickle); | |
| 187 EXPECT_TRUE(result); | |
| 188 | |
| 189 std::unique_ptr<content::NavigationEntry> copy( | |
| 190 content::NavigationEntry::Create()); | |
| 191 base::PickleIterator iterator(pickle); | |
| 192 result = internal::RestoreNavigationEntryFromPickle(&iterator, copy.get()); | |
| 193 EXPECT_TRUE(result); | |
| 194 EXPECT_FALSE(entry->GetDataURLAsString()); | |
| 195 } | |
| 196 | |
| 197 TEST(AndroidWebViewStateSerializerTest, TestHugeDataURLSerialization) { | |
| 198 // This is required for NavigationEntry::Create. | |
| 199 content::ContentClient content_client; | |
| 200 content::SetContentClient(&content_client); | |
| 201 content::ContentBrowserClient browser_client; | |
| 202 content::SetBrowserClientForTesting(&browser_client); | |
| 203 | |
| 204 std::unique_ptr<content::NavigationEntry> entry( | |
| 205 content::NavigationEntry::Create()); | |
| 206 string huge_data_url(1024 * 1024 * 20 - 1, 'd'); | |
| 207 huge_data_url.replace(0, strlen(url::kDataScheme), url::kDataScheme); | |
| 208 { | |
| 209 scoped_refptr<base::RefCountedString> s = new base::RefCountedString(); | |
| 210 s->data().assign(huge_data_url); | |
| 211 entry->SetDataURLAsString(s); | |
| 212 } | |
| 213 | |
| 214 base::Pickle pickle; | |
| 215 bool result = internal::WriteNavigationEntryToPickle(*entry, &pickle); | |
| 216 EXPECT_TRUE(result); | |
| 217 | |
| 218 std::unique_ptr<content::NavigationEntry> copy( | |
| 219 content::NavigationEntry::Create()); | |
| 220 base::PickleIterator iterator(pickle); | |
| 221 result = internal::RestoreNavigationEntryFromPickle(&iterator, copy.get()); | |
| 222 EXPECT_TRUE(result); | |
| 223 EXPECT_EQ(huge_data_url, copy->GetDataURLAsString()->data()); | |
| 224 } | |
| 225 | |
| 226 } // namespace android_webview | |
| OLD | NEW |