| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 "chrome/browser/autocomplete/bookmark_provider.h" | 5 #include "chrome/browser/autocomplete/bookmark_provider.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/memory/ref_counted.h" | 11 #include "base/memory/ref_counted.h" |
| 12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
| 13 #include "base/strings/string16.h" | 13 #include "base/strings/string16.h" |
| 14 #include "base/strings/string_number_conversions.h" | 14 #include "base/strings/string_number_conversions.h" |
| 15 #include "base/strings/string_split.h" | 15 #include "base/strings/string_split.h" |
| 16 #include "base/strings/utf_string_conversions.h" | 16 #include "base/strings/utf_string_conversions.h" |
| 17 #include "chrome/browser/autocomplete/autocomplete_provider.h" | 17 #include "chrome/browser/autocomplete/autocomplete_provider.h" |
| 18 #include "chrome/browser/autocomplete/autocomplete_provider_listener.h" | 18 #include "chrome/browser/autocomplete/autocomplete_provider_listener.h" |
| 19 #include "chrome/test/base/testing_profile.h" | 19 #include "chrome/test/base/testing_profile.h" |
| 20 #include "components/bookmarks/browser/bookmark_match.h" | 20 #include "components/bookmarks/browser/bookmark_match.h" |
| 21 #include "components/bookmarks/browser/bookmark_model.h" | 21 #include "components/bookmarks/browser/bookmark_model.h" |
| 22 #include "components/bookmarks/test/test_bookmark_client.h" | 22 #include "components/bookmarks/test/test_bookmark_client.h" |
| 23 #include "components/metrics/proto/omnibox_event.pb.h" |
| 23 #include "testing/gtest/include/gtest/gtest.h" | 24 #include "testing/gtest/include/gtest/gtest.h" |
| 24 | 25 |
| 25 using bookmarks::BookmarkMatch; | 26 using bookmarks::BookmarkMatch; |
| 26 | 27 |
| 27 // The bookmark corpus against which we will simulate searches. | 28 // The bookmark corpus against which we will simulate searches. |
| 28 struct BookmarksTestInfo { | 29 struct BookmarksTestInfo { |
| 29 std::string title; | 30 std::string title; |
| 30 std::string url; | 31 std::string url; |
| 31 } bookmark_provider_test_data[] = { | 32 } bookmark_provider_test_data[] = { |
| 32 { "abc def", "http://www.catsanddogs.com/a" }, | 33 { "abc def", "http://www.catsanddogs.com/a" }, |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 {"frank", 1, {{{0, 5}, {8, 13}, {16, 21}, {0, 0}}}}, | 255 {"frank", 1, {{{0, 5}, {8, 13}, {16, 21}, {0, 0}}}}, |
| 255 {"frankly", 1, {{{0, 7}, {8, 15}, {0, 0}}}}, | 256 {"frankly", 1, {{{0, 7}, {8, 15}, {0, 0}}}}, |
| 256 {"frankly frankly", 1, {{{0, 7}, {8, 15}, {0, 0}}}}, | 257 {"frankly frankly", 1, {{{0, 7}, {8, 15}, {0, 0}}}}, |
| 257 {"foobar foo", 1, {{{0, 6}, {7, 13}, {0, 0}}}}, | 258 {"foobar foo", 1, {{{0, 6}, {7, 13}, {0, 0}}}}, |
| 258 {"foo foobar", 1, {{{0, 6}, {7, 13}, {0, 0}}}}, | 259 {"foo foobar", 1, {{{0, 6}, {7, 13}, {0, 0}}}}, |
| 259 }; | 260 }; |
| 260 | 261 |
| 261 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(query_data); ++i) { | 262 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(query_data); ++i) { |
| 262 AutocompleteInput input(base::ASCIIToUTF16(query_data[i].query), | 263 AutocompleteInput input(base::ASCIIToUTF16(query_data[i].query), |
| 263 base::string16::npos, base::string16(), GURL(), | 264 base::string16::npos, base::string16(), GURL(), |
| 264 AutocompleteInput::INVALID_SPEC, false, false, | 265 metrics::OmniboxEventProto::INVALID_SPEC, false, |
| 265 false, true); | 266 false, false, true); |
| 266 provider_->Start(input, false); | 267 provider_->Start(input, false); |
| 267 const ACMatches& matches(provider_->matches()); | 268 const ACMatches& matches(provider_->matches()); |
| 268 // Validate number of results is as expected. | 269 // Validate number of results is as expected. |
| 269 EXPECT_LE(matches.size(), query_data[i].match_count) | 270 EXPECT_LE(matches.size(), query_data[i].match_count) |
| 270 << "One or more of the following matches were unexpected:\n" | 271 << "One or more of the following matches were unexpected:\n" |
| 271 << MatchesAsString16(matches) | 272 << MatchesAsString16(matches) |
| 272 << "For query '" << query_data[i].query << "'."; | 273 << "For query '" << query_data[i].query << "'."; |
| 273 EXPECT_GE(matches.size(), query_data[i].match_count) | 274 EXPECT_GE(matches.size(), query_data[i].match_count) |
| 274 << "One or more expected matches are missing. Matches found:\n" | 275 << "One or more expected matches are missing. Matches found:\n" |
| 275 << MatchesAsString16(matches) | 276 << MatchesAsString16(matches) |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 331 // Ranking of prefix matches with URL boost. Note that a query of | 332 // Ranking of prefix matches with URL boost. Note that a query of |
| 332 // "worm burn" will have the same results. | 333 // "worm burn" will have the same results. |
| 333 {"burn worm", 3, {"burning worms #2", // boosted | 334 {"burn worm", 3, {"burning worms #2", // boosted |
| 334 "worming burns #20", // boosted | 335 "worming burns #20", // boosted |
| 335 "burning worms #1"}}, // not boosted but shorter | 336 "burning worms #1"}}, // not boosted but shorter |
| 336 }; | 337 }; |
| 337 | 338 |
| 338 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(query_data); ++i) { | 339 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(query_data); ++i) { |
| 339 AutocompleteInput input(base::ASCIIToUTF16(query_data[i].query), | 340 AutocompleteInput input(base::ASCIIToUTF16(query_data[i].query), |
| 340 base::string16::npos, base::string16(), GURL(), | 341 base::string16::npos, base::string16(), GURL(), |
| 341 AutocompleteInput::INVALID_SPEC, false, false, | 342 metrics::OmniboxEventProto::INVALID_SPEC, false, |
| 342 false, true); | 343 false, false, true); |
| 343 provider_->Start(input, false); | 344 provider_->Start(input, false); |
| 344 const ACMatches& matches(provider_->matches()); | 345 const ACMatches& matches(provider_->matches()); |
| 345 // Validate number and content of results is as expected. | 346 // Validate number and content of results is as expected. |
| 346 for (size_t j = 0; j < std::max(query_data[i].match_count, matches.size()); | 347 for (size_t j = 0; j < std::max(query_data[i].match_count, matches.size()); |
| 347 ++j) { | 348 ++j) { |
| 348 EXPECT_LT(j, query_data[i].match_count) << " Unexpected match '" | 349 EXPECT_LT(j, query_data[i].match_count) << " Unexpected match '" |
| 349 << base::UTF16ToUTF8(matches[j].description) << "' for query: '" | 350 << base::UTF16ToUTF8(matches[j].description) << "' for query: '" |
| 350 << query_data[i].query << "'."; | 351 << query_data[i].query << "'."; |
| 351 if (j >= query_data[i].match_count) | 352 if (j >= query_data[i].match_count) |
| 352 continue; | 353 continue; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 // need to be in the bookmarks list because BookmarkProvider's | 388 // need to be in the bookmarks list because BookmarkProvider's |
| 388 // TitleMatchToACMatch() has an assertion that verifies the URL is | 389 // TitleMatchToACMatch() has an assertion that verifies the URL is |
| 389 // actually bookmarked. | 390 // actually bookmarked. |
| 390 }; | 391 }; |
| 391 | 392 |
| 392 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(query_data); ++i) { | 393 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(query_data); ++i) { |
| 393 const std::string description = "for query=" + query_data[i].query + | 394 const std::string description = "for query=" + query_data[i].query + |
| 394 " and url=" + query_data[i].url; | 395 " and url=" + query_data[i].url; |
| 395 AutocompleteInput input(base::ASCIIToUTF16(query_data[i].query), | 396 AutocompleteInput input(base::ASCIIToUTF16(query_data[i].query), |
| 396 base::string16::npos, base::string16(), GURL(), | 397 base::string16::npos, base::string16(), GURL(), |
| 397 AutocompleteInput::INVALID_SPEC, false, false, | 398 metrics::OmniboxEventProto::INVALID_SPEC, false, |
| 398 false, true); | 399 false, false, true); |
| 399 const base::string16 fixed_up_input( | 400 const base::string16 fixed_up_input( |
| 400 provider_->FixupUserInput(input).second); | 401 provider_->FixupUserInput(input).second); |
| 401 BookmarkNode node(GURL(query_data[i].url)); | 402 BookmarkNode node(GURL(query_data[i].url)); |
| 402 node.SetTitle(base::ASCIIToUTF16(query_data[i].url)); | 403 node.SetTitle(base::ASCIIToUTF16(query_data[i].url)); |
| 403 BookmarkMatch bookmark_match; | 404 BookmarkMatch bookmark_match; |
| 404 bookmark_match.node = &node; | 405 bookmark_match.node = &node; |
| 405 const AutocompleteMatch& ac_match = provider_->BookmarkMatchToACMatch( | 406 const AutocompleteMatch& ac_match = provider_->BookmarkMatchToACMatch( |
| 406 input, fixed_up_input, bookmark_match); | 407 input, fixed_up_input, bookmark_match); |
| 407 EXPECT_EQ(query_data[i].allowed_to_be_default_match, | 408 EXPECT_EQ(query_data[i].allowed_to_be_default_match, |
| 408 ac_match.allowed_to_be_default_match) << description; | 409 ac_match.allowed_to_be_default_match) << description; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 433 }; | 434 }; |
| 434 | 435 |
| 435 // Reload the bookmarks index with |index_urls| == true. | 436 // Reload the bookmarks index with |index_urls| == true. |
| 436 model_ = client_.CreateModel(true); | 437 model_ = client_.CreateModel(true); |
| 437 SetUp(); | 438 SetUp(); |
| 438 | 439 |
| 439 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(query_data); ++i) { | 440 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(query_data); ++i) { |
| 440 std::string description = "for query=" + query_data[i].query; | 441 std::string description = "for query=" + query_data[i].query; |
| 441 AutocompleteInput input(base::ASCIIToUTF16(query_data[i].query), | 442 AutocompleteInput input(base::ASCIIToUTF16(query_data[i].query), |
| 442 base::string16::npos, base::string16(), GURL(), | 443 base::string16::npos, base::string16(), GURL(), |
| 443 AutocompleteInput::INVALID_SPEC, false, false, | 444 metrics::OmniboxEventProto::INVALID_SPEC, false, |
| 444 false, true); | 445 false, false, true); |
| 445 provider_->Start(input, false); | 446 provider_->Start(input, false); |
| 446 const ACMatches& matches(provider_->matches()); | 447 const ACMatches& matches(provider_->matches()); |
| 447 ASSERT_EQ(1U, matches.size()) << description; | 448 ASSERT_EQ(1U, matches.size()) << description; |
| 448 const AutocompleteMatch& match = matches[0]; | 449 const AutocompleteMatch& match = matches[0]; |
| 449 EXPECT_EQ(base::ASCIIToUTF16(query_data[i].expected_contents), | 450 EXPECT_EQ(base::ASCIIToUTF16(query_data[i].expected_contents), |
| 450 match.contents) << description; | 451 match.contents) << description; |
| 451 std::vector<std::string> class_strings; | 452 std::vector<std::string> class_strings; |
| 452 base::SplitString( | 453 base::SplitString( |
| 453 query_data[i].expected_contents_class, ',', &class_strings); | 454 query_data[i].expected_contents_class, ',', &class_strings); |
| 454 ASSERT_EQ(class_strings.size(), match.contents_class.size()) | 455 ASSERT_EQ(class_strings.size(), match.contents_class.size()) |
| 455 << description; | 456 << description; |
| 456 for (size_t i = 0; i < class_strings.size(); ++i) { | 457 for (size_t i = 0; i < class_strings.size(); ++i) { |
| 457 std::vector<std::string> chunks; | 458 std::vector<std::string> chunks; |
| 458 base::SplitString(class_strings[i], ':', &chunks); | 459 base::SplitString(class_strings[i], ':', &chunks); |
| 459 ASSERT_EQ(2U, chunks.size()) << description; | 460 ASSERT_EQ(2U, chunks.size()) << description; |
| 460 size_t offset; | 461 size_t offset; |
| 461 EXPECT_TRUE(base::StringToSizeT(chunks[0], &offset)) << description; | 462 EXPECT_TRUE(base::StringToSizeT(chunks[0], &offset)) << description; |
| 462 EXPECT_EQ(offset, match.contents_class[i].offset) << description; | 463 EXPECT_EQ(offset, match.contents_class[i].offset) << description; |
| 463 int style; | 464 int style; |
| 464 EXPECT_TRUE(base::StringToInt(chunks[1], &style)) << description; | 465 EXPECT_TRUE(base::StringToInt(chunks[1], &style)) << description; |
| 465 EXPECT_EQ(style, match.contents_class[i].style) << description; | 466 EXPECT_EQ(style, match.contents_class[i].style) << description; |
| 466 } | 467 } |
| 467 } | 468 } |
| 468 } | 469 } |
| OLD | NEW |