Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(658)

Side by Side Diff: components/omnibox/browser/physical_web_provider_unittest.cc

Issue 2266083002: Avoid DCHECK failure for chrome:// URLs in autocomplete suggestions (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix OmniboxViewViewsTest.CloseOmniboxPopupOnTextDrag Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/omnibox/browser/physical_web_provider.h" 5 #include "components/omnibox/browser/physical_web_provider.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <string> 8 #include <string>
9 9
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 TestSchemeClassifier scheme_classifier_; 84 TestSchemeClassifier scheme_classifier_;
85 }; 85 };
86 86
87 class PhysicalWebProviderTest : public testing::Test { 87 class PhysicalWebProviderTest : public testing::Test {
88 protected: 88 protected:
89 PhysicalWebProviderTest() : provider_(NULL) {} 89 PhysicalWebProviderTest() : provider_(NULL) {}
90 ~PhysicalWebProviderTest() override {} 90 ~PhysicalWebProviderTest() override {}
91 91
92 void SetUp() override { 92 void SetUp() override {
93 client_.reset(new FakeAutocompleteProviderClient()); 93 client_.reset(new FakeAutocompleteProviderClient());
94 provider_ = PhysicalWebProvider::Create(client_.get()); 94 provider_ = PhysicalWebProvider::Create(client_.get(), NULL);
Peter Kasting 2016/09/01 22:06:36 Nit: nullptr
mattreynolds 2016/09/02 00:29:08 Done.
95 } 95 }
96 96
97 void TearDown() override { 97 void TearDown() override {
98 provider_ = NULL; 98 provider_ = NULL;
99 } 99 }
100 100
101 // Create a dummy metadata list with |metadata_count| items. Each item is 101 // Create a dummy metadata list with |metadata_count| items. Each item is
102 // populated with a unique scanned URL and page metadata. 102 // populated with a unique scanned URL and page metadata.
103 static std::unique_ptr<base::ListValue> CreateMetadata( 103 static std::unique_ptr<base::ListValue> CreateMetadata(
104 size_t metadata_count) { 104 size_t metadata_count) {
105 auto metadata_list = base::MakeUnique<base::ListValue>(); 105 auto metadata_list = base::MakeUnique<base::ListValue>();
106 for (size_t i = 0; i < metadata_count; ++i) { 106 for (size_t i = 0; i < metadata_count; ++i) {
107 std::string item_id = base::SizeTToString(i); 107 std::string item_id = base::SizeTToString(i);
108 std::string url = "https://example.com/" + item_id; 108 std::string url = "https://example.com/" + item_id;
109 auto metadata_item = base::MakeUnique<base::DictionaryValue>(); 109 auto metadata_item = base::MakeUnique<base::DictionaryValue>();
110 metadata_item->SetString("scannedUrl", url); 110 metadata_item->SetString("scannedUrl", url);
111 metadata_item->SetString("resolvedUrl", url); 111 metadata_item->SetString("resolvedUrl", url);
112 metadata_item->SetString("icon", url); 112 metadata_item->SetString("icon", url);
113 metadata_item->SetString("title", "Example title " + item_id); 113 metadata_item->SetString("title", "Example title " + item_id);
114 metadata_item->SetString("description", "Example description " + item_id); 114 metadata_item->SetString("description", "Example description " + item_id);
115 metadata_list->Append(std::move(metadata_item)); 115 metadata_list->Append(std::move(metadata_item));
116 } 116 }
117 return metadata_list; 117 return metadata_list;
118 } 118 }
119 119
120 // Construct an AutocompleteInput to represent tapping the omnibox from the
121 // new tab page.
122 static AutocompleteInput CreateInputForNTP() {
123 return AutocompleteInput(base::string16(), base::string16::npos,
124 std::string(), GURL(),
Peter Kasting 2016/09/01 22:06:36 Nit: All lines of args must be aligned (2 places)
mattreynolds 2016/09/02 00:29:08 Done.
125 metrics::OmniboxEventProto::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS,
126 false, false, true, true, true, TestSchemeClassifier());
127 }
128
129 // Construct an AutocompleteInput to represent tapping the omnibox with |url|
130 // as the current web page.
131 static AutocompleteInput CreateInputWithCurrentUrl(const std::string& url) {
132 return AutocompleteInput(base::ASCIIToUTF16(url), base::string16::npos,
133 std::string(), GURL(url), metrics::OmniboxEventProto::OTHER,
134 false, false, true, true, true, TestSchemeClassifier());
135 }
136
120 std::unique_ptr<FakeAutocompleteProviderClient> client_; 137 std::unique_ptr<FakeAutocompleteProviderClient> client_;
121 scoped_refptr<PhysicalWebProvider> provider_; 138 scoped_refptr<PhysicalWebProvider> provider_;
122 139
123 private: 140 private:
124 DISALLOW_COPY_AND_ASSIGN(PhysicalWebProviderTest); 141 DISALLOW_COPY_AND_ASSIGN(PhysicalWebProviderTest);
125 }; 142 };
126 143
127 TEST_F(PhysicalWebProviderTest, TestEmptyMetadataListCreatesNoMatches) { 144 TEST_F(PhysicalWebProviderTest, TestEmptyMetadataListCreatesNoMatches) {
128 MockPhysicalWebDataSource* data_source = 145 MockPhysicalWebDataSource* data_source =
129 client_->GetMockPhysicalWebDataSource(); 146 client_->GetMockPhysicalWebDataSource();
130 EXPECT_TRUE(data_source); 147 EXPECT_TRUE(data_source);
131 148
132 data_source->SetMetadata(CreateMetadata(0)); 149 data_source->SetMetadata(CreateMetadata(0));
133 150
134 // Construct an AutocompleteInput representing a typical "zero-suggest" 151 // Run the test with no text in the omnibox input to simulate NTP.
135 // case. The provider will verify that the content of the omnibox input field 152 provider_->Start(CreateInputForNTP(), false);
136 // was not entered by the user. 153 EXPECT_TRUE(provider_->matches().empty());
137 std::string url("http://www.cnn.com/");
138 const AutocompleteInput input(base::ASCIIToUTF16(url), base::string16::npos,
139 std::string(), GURL(url), metrics::OmniboxEventProto::OTHER,
140 true, false, true, true, true, TestSchemeClassifier());
141 provider_->Start(input, false);
142 154
155 // Run the test again with a URL in the omnibox input.
156 provider_->Start(CreateInputWithCurrentUrl("http://www.cnn.com"), false);
143 EXPECT_TRUE(provider_->matches().empty()); 157 EXPECT_TRUE(provider_->matches().empty());
144 } 158 }
145 159
146 TEST_F(PhysicalWebProviderTest, TestSingleMetadataItemCreatesOneMatch) { 160 TEST_F(PhysicalWebProviderTest, TestSingleMetadataItemCreatesOneMatch) {
147 MockPhysicalWebDataSource* data_source = 161 MockPhysicalWebDataSource* data_source =
148 client_->GetMockPhysicalWebDataSource(); 162 client_->GetMockPhysicalWebDataSource();
149 EXPECT_TRUE(data_source); 163 EXPECT_TRUE(data_source);
150 164
151 // Extract the URL and title before inserting the metadata into the data 165 // Extract the URL and title before inserting the metadata into the data
152 // source. 166 // source.
153 std::unique_ptr<base::ListValue> metadata_list = CreateMetadata(1); 167 std::unique_ptr<base::ListValue> metadata_list = CreateMetadata(1);
154 base::DictionaryValue* metadata_item; 168 base::DictionaryValue* metadata_item;
155 EXPECT_TRUE(metadata_list->GetDictionary(0, &metadata_item)); 169 EXPECT_TRUE(metadata_list->GetDictionary(0, &metadata_item));
156 std::string resolved_url; 170 std::string resolved_url;
157 EXPECT_TRUE(metadata_item->GetString("resolvedUrl", &resolved_url)); 171 EXPECT_TRUE(metadata_item->GetString("resolvedUrl", &resolved_url));
158 std::string title; 172 std::string title;
159 EXPECT_TRUE(metadata_item->GetString("title", &title)); 173 EXPECT_TRUE(metadata_item->GetString("title", &title));
160 174
161 data_source->SetMetadata(std::move(metadata_list)); 175 data_source->SetMetadata(std::move(metadata_list));
162 176
163 // Construct an AutocompleteInput representing a typical "zero-suggest" 177 // Run the test with no text in the omnibox input to simulate NTP.
164 // case. The provider will verify that the content of the omnibox input field 178 provider_->Start(CreateInputForNTP(), false);
165 // was not entered by the user.
166 std::string url("http://www.cnn.com/");
167 const AutocompleteInput input(base::ASCIIToUTF16(url), base::string16::npos,
168 std::string(), GURL(url), metrics::OmniboxEventProto::OTHER,
169 true, false, true, true, true, TestSchemeClassifier());
170 provider_->Start(input, false);
171 179
172 // Check that there is only one match item and its fields are correct. 180 // Check that there is only one match item and its fields are correct.
173 EXPECT_EQ(1U, provider_->matches().size()); 181 EXPECT_EQ(1U, provider_->matches().size());
174 const AutocompleteMatch& metadata_match = provider_->matches().front(); 182 const AutocompleteMatch& metadata_match = provider_->matches().front();
175 EXPECT_EQ(AutocompleteMatchType::PHYSICAL_WEB, metadata_match.type); 183 EXPECT_EQ(AutocompleteMatchType::PHYSICAL_WEB, metadata_match.type);
176 EXPECT_EQ(resolved_url, metadata_match.destination_url.spec()); 184 EXPECT_EQ(resolved_url, metadata_match.destination_url.spec());
177 EXPECT_EQ(resolved_url, base::UTF16ToASCII(metadata_match.contents)); 185 EXPECT_EQ(resolved_url, base::UTF16ToASCII(metadata_match.contents));
178 EXPECT_EQ(title, base::UTF16ToASCII(metadata_match.description)); 186 EXPECT_EQ(title, base::UTF16ToASCII(metadata_match.description));
187 EXPECT_FALSE(metadata_match.allowed_to_be_default_match);
188
189 // Run the test again with a URL in the omnibox input. An additional match
190 // should be added as a default match.
191 provider_->Start(CreateInputWithCurrentUrl("http://www.cnn.com"), false);
192
193 size_t metadata_match_count = 0;
194 size_t default_match_count = 0;
195 for (size_t i = 0; i < provider_->matches().size(); i++) {
196 const AutocompleteMatch& match = provider_->matches()[i];
Peter Kasting 2016/09/01 22:06:36 Nit: Use range-based for: for (const auto& matc
mattreynolds 2016/09/02 00:29:08 Done.
197 if (match.type == AutocompleteMatchType::PHYSICAL_WEB) {
198 EXPECT_EQ(AutocompleteMatchType::PHYSICAL_WEB, match.type);
Peter Kasting 2016/09/01 22:06:36 Nit: This EXPECT_EQ can never fail because you jus
mattreynolds 2016/09/02 00:29:08 Removed.
199 EXPECT_EQ(resolved_url, match.destination_url.spec());
200 EXPECT_EQ(resolved_url, base::UTF16ToASCII(match.contents));
201 EXPECT_EQ(title, base::UTF16ToASCII(match.description));
202 EXPECT_FALSE(match.allowed_to_be_default_match);
203 ++metadata_match_count;
204 } else {
205 EXPECT_TRUE(match.allowed_to_be_default_match);
206 ++default_match_count;
207 }
208 }
209 EXPECT_EQ(2U, provider_->matches().size());
210 EXPECT_EQ(1U, metadata_match_count);
211 EXPECT_EQ(1U, default_match_count);
179 } 212 }
180 213
181 TEST_F(PhysicalWebProviderTest, TestManyMetadataItemsCreatesOverflowItem) { 214 TEST_F(PhysicalWebProviderTest, TestManyMetadataItemsCreatesOverflowItem) {
182 // This test is intended to verify that an overflow item is created when the 215 // This test is intended to verify that an overflow item is created when the
183 // number of nearby Physical Web URLs exceeds the maximum allowable matches 216 // number of nearby Physical Web URLs exceeds the maximum allowable matches
184 // for this provider. The actual limit for the PhysicalWebProvider may be 217 // for this provider. The actual limit for the PhysicalWebProvider may be
185 // changed in the future, so create enough metadata to exceed the 218 // changed in the future, so create enough metadata to exceed the
186 // AutocompleteProvider's limit. 219 // AutocompleteProvider's limit.
187 const size_t metadata_count = AutocompleteProvider::kMaxMatches + 1; 220 const size_t metadata_count = AutocompleteProvider::kMaxMatches + 1;
188 221
189 MockPhysicalWebDataSource* data_source = 222 MockPhysicalWebDataSource* data_source =
190 client_->GetMockPhysicalWebDataSource(); 223 client_->GetMockPhysicalWebDataSource();
191 EXPECT_TRUE(data_source); 224 EXPECT_TRUE(data_source);
192 225
193 data_source->SetMetadata(CreateMetadata(metadata_count)); 226 data_source->SetMetadata(CreateMetadata(metadata_count));
194 227
195 // Construct an AutocompleteInput representing a typical "zero-suggest" 228 {
196 // case. The provider will verify that the content of the omnibox input field 229 // Run the test with no text in the omnibox input to simulate NTP.
197 // was not entered by the user. 230 provider_->Start(CreateInputForNTP(), false);
198 std::string url("http://www.cnn.com/");
199 const AutocompleteInput input(base::ASCIIToUTF16(url), base::string16::npos,
200 std::string(), GURL(url), metrics::OmniboxEventProto::OTHER,
201 true, false, true, true, true, TestSchemeClassifier());
202 provider_->Start(input, false);
203 231
204 const size_t match_count = provider_->matches().size(); 232 const size_t match_count = provider_->matches().size();
205 EXPECT_LT(match_count, metadata_count); 233 EXPECT_LT(match_count, metadata_count);
206 234
207 // Check that the overflow item is at the end of the match list and its fields 235 // Check that the overflow item is present and its fields are correct. There
208 // are correct. 236 // may be additional match items, but none should be marked as default.
209 const AutocompleteMatch& overflow_match = provider_->matches().back(); 237 size_t overflow_match_count = 0;
210 EXPECT_EQ(AutocompleteMatchType::PHYSICAL_WEB_OVERFLOW, overflow_match.type); 238 for (size_t i = 0; i < match_count; i++) {
211 EXPECT_EQ("chrome://physical-web/", overflow_match.destination_url.spec()); 239 const AutocompleteMatch& match = provider_->matches()[i];
212 EXPECT_EQ("chrome://physical-web/", 240 if (match.type == AutocompleteMatchType::PHYSICAL_WEB_OVERFLOW) {
213 base::UTF16ToASCII(overflow_match.contents)); 241 EXPECT_EQ(AutocompleteMatchType::PHYSICAL_WEB_OVERFLOW, match.type);
214 std::string description = l10n_util::GetPluralStringFUTF8( 242 EXPECT_EQ("chrome://physical-web/", match.destination_url.spec());
215 IDS_PHYSICAL_WEB_OVERFLOW, metadata_count - match_count + 1); 243 EXPECT_EQ("chrome://physical-web/", base::UTF16ToASCII(match.contents));
216 EXPECT_EQ(description, base::UTF16ToASCII(overflow_match.description)); 244 const size_t metadata_matches = match_count - 1;
245 std::string description = l10n_util::GetPluralStringFUTF8(
246 IDS_PHYSICAL_WEB_OVERFLOW, metadata_count - metadata_matches);
247 EXPECT_EQ(description, base::UTF16ToASCII(match.description));
248 ++overflow_match_count;
249 }
250 EXPECT_FALSE(match.allowed_to_be_default_match);
251 }
252 EXPECT_EQ(1U, overflow_match_count);
253 }
254
255 {
256 // Run the test again with a URL in the omnibox input. An additional match
257 // should be added as a default match.
258 provider_->Start(CreateInputWithCurrentUrl("http://www.cnn.com"), false);
259
260 const size_t match_count = provider_->matches().size();
261 EXPECT_LT(match_count - 1, metadata_count);
262
263 // Check that the overflow item and default match are present and their
264 // fields are correct.
265 size_t overflow_match_count = 0;
266 size_t default_match_count = 0;
267 for (size_t i = 0; i < match_count; i++) {
268 const AutocompleteMatch& match = provider_->matches()[i];
269 if (match.type == AutocompleteMatchType::PHYSICAL_WEB_OVERFLOW) {
270 EXPECT_EQ(AutocompleteMatchType::PHYSICAL_WEB_OVERFLOW, match.type);
271 EXPECT_EQ("chrome://physical-web/", match.destination_url.spec());
272 EXPECT_EQ("chrome://physical-web/", base::UTF16ToASCII(match.contents));
273 const size_t metadata_matches = match_count - 2;
274 std::string description = l10n_util::GetPluralStringFUTF8(
275 IDS_PHYSICAL_WEB_OVERFLOW, metadata_count - metadata_matches);
276 EXPECT_EQ(description, base::UTF16ToASCII(match.description));
277 EXPECT_FALSE(match.allowed_to_be_default_match);
278 ++overflow_match_count;
279 } else if (match.allowed_to_be_default_match) {
280 ++default_match_count;
281 }
282 }
283 EXPECT_EQ(1U, overflow_match_count);
284 EXPECT_EQ(1U, default_match_count);
285 }
217 } 286 }
218 287
219 TEST_F(PhysicalWebProviderTest, TestNoMatchesWithUserInput) { 288 TEST_F(PhysicalWebProviderTest, TestNoMatchesWithUserInput) {
220 MockPhysicalWebDataSource* data_source = 289 MockPhysicalWebDataSource* data_source =
221 client_->GetMockPhysicalWebDataSource(); 290 client_->GetMockPhysicalWebDataSource();
222 EXPECT_TRUE(data_source); 291 EXPECT_TRUE(data_source);
223 292
224 data_source->SetMetadata(CreateMetadata(1)); 293 data_source->SetMetadata(CreateMetadata(1));
225 294
226 // Construct an AutocompleteInput to simulate user input in the omnibox input 295 // Construct an AutocompleteInput to simulate user input in the omnibox input
227 // field. The provider should not generate any matches. 296 // field. The provider should not generate any matches.
228 std::string text("user input"); 297 std::string text("user input");
229 const AutocompleteInput input(base::ASCIIToUTF16(text), text.length(), 298 const AutocompleteInput input(base::ASCIIToUTF16(text), text.length(),
230 std::string(), GURL(), 299 std::string(), GURL(),
231 metrics::OmniboxEventProto::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS, 300 metrics::OmniboxEventProto::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS,
232 true, false, true, true, false, TestSchemeClassifier()); 301 true, false, true, true, false, TestSchemeClassifier());
233 provider_->Start(input, false); 302 provider_->Start(input, false);
234 303
235 EXPECT_TRUE(provider_->matches().empty()); 304 EXPECT_TRUE(provider_->matches().empty());
236 } 305 }
237 306
238 } 307 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698