Index: components/omnibox/browser/physical_web_provider_unittest.cc |
diff --git a/components/omnibox/browser/physical_web_provider_unittest.cc b/components/omnibox/browser/physical_web_provider_unittest.cc |
index d6f62fd17ac131b81c5b5d49a5108f7c6540b9b7..111a8dc55c52adb4bef198d02cb76ea2539ffab0 100644 |
--- a/components/omnibox/browser/physical_web_provider_unittest.cc |
+++ b/components/omnibox/browser/physical_web_provider_unittest.cc |
@@ -20,6 +20,7 @@ |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include "ui/base/l10n/l10n_util.h" |
+#include "ui/gfx/text_elider.h" |
#include "url/gurl.h" |
namespace { |
@@ -84,6 +85,8 @@ class FakeAutocompleteProviderClient |
TestSchemeClassifier scheme_classifier_; |
}; |
+} // namespace |
+ |
class PhysicalWebProviderTest : public testing::Test { |
protected: |
PhysicalWebProviderTest() : provider_(NULL) {} |
@@ -129,12 +132,108 @@ class PhysicalWebProviderTest : public testing::Test { |
// Construct an AutocompleteInput to represent tapping the omnibox with |url| |
// as the current web page. |
static AutocompleteInput CreateInputWithCurrentUrl(const std::string& url) { |
- return AutocompleteInput(base::ASCIIToUTF16(url), base::string16::npos, |
+ return AutocompleteInput(base::UTF8ToUTF16(url), base::string16::npos, |
std::string(), GURL(url), |
metrics::OmniboxEventProto::OTHER, false, false, |
true, true, true, TestSchemeClassifier()); |
} |
+ // For a given |match|, check that the destination URL, contents string, |
+ // description string, and default match state agree with the values specified |
+ // in |url|, |contents|, |description|, and |allowed_to_be_default_match|. |
+ static void ValidateMatch(const AutocompleteMatch& match, |
+ const std::string& url, |
+ const std::string& contents, |
+ const std::string& description, |
+ bool allowed_to_be_default_match) { |
+ EXPECT_EQ(url, match.destination_url.spec()); |
+ EXPECT_EQ(contents, base::UTF16ToUTF8(match.contents)); |
+ EXPECT_EQ(description, base::UTF16ToUTF8(match.description)); |
+ EXPECT_EQ(allowed_to_be_default_match, match.allowed_to_be_default_match); |
+ } |
+ |
+ // Returns the contents string for an overflow item. Use |truncated_title| |
+ // as the title of the first match, |match_count_without_default| as the |
+ // total number of matches (not counting the default match), and |
+ // |metadata_count| as the number of nearby Physical Web URLs for which we |
+ // have metadata. |
+ static std::string ConstructOverflowItemContents( |
+ const std::string& truncated_title, |
+ size_t match_count_without_default, |
+ size_t metadata_count) { |
+ // Don't treat the overflow item as a metadata match. |
+ const size_t metadata_match_count = match_count_without_default - 1; |
+ // Determine how many URLs we didn't create match items for. |
+ const size_t additional_url_count = metadata_count - metadata_match_count; |
+ |
+ // Build the contents string. |
+ if (truncated_title.empty()) { |
+ return l10n_util::GetPluralStringFUTF8( |
+ IDS_PHYSICAL_WEB_OVERFLOW_EMPTY_TITLE, additional_url_count); |
+ } else { |
+ // Subtract one from the additional URL count because the first item is |
+ // represented by its title. |
+ std::string contents_suffix = l10n_util::GetPluralStringFUTF8( |
+ IDS_PHYSICAL_WEB_OVERFLOW, additional_url_count - 1); |
+ return truncated_title + " " + contents_suffix; |
+ } |
+ } |
+ |
+ // Run a test case using |input| as the simulated state of the omnibox input |
+ // field, |metadata_list| as the list of simulated Physical Web metadata, |
+ // and |title_truncated| as the truncated title of the first match. In |
+ // addition to checking the fields of the overflow item, this will also check |
+ // that the total number of matches is equal to |expected_match_count| and |
+ // that a default match and overflow item are only present when |
+ // |should_expect_default_match| or |should_expect_overflow_item| are true. |
+ // Metadata matches are not checked. |
+ void OverflowItemTestCase(const AutocompleteInput& input, |
+ std::unique_ptr<base::ListValue> metadata_list, |
+ const std::string& title_truncated, |
+ size_t expected_match_count, |
+ bool should_expect_default_match, |
+ bool should_expect_overflow_item) { |
+ const size_t metadata_count = metadata_list->GetSize(); |
+ |
+ MockPhysicalWebDataSource* data_source = |
+ client_->GetMockPhysicalWebDataSource(); |
+ EXPECT_TRUE(data_source); |
+ |
+ data_source->SetMetadata(std::move(metadata_list)); |
+ |
+ provider_->Start(input, false); |
+ |
+ const size_t match_count = provider_->matches().size(); |
+ EXPECT_EQ(expected_match_count, match_count); |
+ |
+ const size_t match_count_without_default = |
+ should_expect_default_match ? match_count - 1 : match_count; |
+ |
+ if (should_expect_overflow_item) { |
+ EXPECT_LT(match_count_without_default, metadata_count); |
+ } else { |
+ EXPECT_EQ(match_count_without_default, metadata_count); |
+ } |
+ |
+ size_t overflow_match_count = 0; |
+ size_t default_match_count = 0; |
+ for (const auto& match : provider_->matches()) { |
+ if (match.type == AutocompleteMatchType::PHYSICAL_WEB_OVERFLOW) { |
+ std::string contents = ConstructOverflowItemContents( |
+ title_truncated, match_count_without_default, metadata_count); |
+ ValidateMatch( |
+ match, "chrome://physical-web/", contents, |
+ l10n_util::GetStringUTF8(IDS_PHYSICAL_WEB_OVERFLOW_DESCRIPTION), |
+ false); |
+ ++overflow_match_count; |
+ } else if (match.allowed_to_be_default_match) { |
+ ++default_match_count; |
+ } |
+ } |
+ EXPECT_EQ(should_expect_overflow_item ? 1U : 0U, overflow_match_count); |
+ EXPECT_EQ(should_expect_default_match ? 1U : 0U, default_match_count); |
+ } |
+ |
std::unique_ptr<FakeAutocompleteProviderClient> client_; |
scoped_refptr<PhysicalWebProvider> provider_; |
@@ -182,10 +281,7 @@ TEST_F(PhysicalWebProviderTest, TestSingleMetadataItemCreatesOneMatch) { |
EXPECT_EQ(1U, provider_->matches().size()); |
const AutocompleteMatch& metadata_match = provider_->matches().front(); |
EXPECT_EQ(AutocompleteMatchType::PHYSICAL_WEB, metadata_match.type); |
- EXPECT_EQ(resolved_url, metadata_match.destination_url.spec()); |
- EXPECT_EQ(resolved_url, base::UTF16ToASCII(metadata_match.contents)); |
- EXPECT_EQ(title, base::UTF16ToASCII(metadata_match.description)); |
- EXPECT_FALSE(metadata_match.allowed_to_be_default_match); |
+ ValidateMatch(metadata_match, resolved_url, resolved_url, title, false); |
// Run the test again with a URL in the omnibox input. An additional match |
// should be added as a default match. |
@@ -195,10 +291,7 @@ TEST_F(PhysicalWebProviderTest, TestSingleMetadataItemCreatesOneMatch) { |
size_t default_match_count = 0; |
for (const auto& match : provider_->matches()) { |
if (match.type == AutocompleteMatchType::PHYSICAL_WEB) { |
- EXPECT_EQ(resolved_url, match.destination_url.spec()); |
- EXPECT_EQ(resolved_url, base::UTF16ToASCII(match.contents)); |
- EXPECT_EQ(title, base::UTF16ToASCII(match.description)); |
- EXPECT_FALSE(match.allowed_to_be_default_match); |
+ ValidateMatch(match, resolved_url, resolved_url, title, false); |
++metadata_match_count; |
} else { |
EXPECT_TRUE(match.allowed_to_be_default_match); |
@@ -210,76 +303,6 @@ TEST_F(PhysicalWebProviderTest, TestSingleMetadataItemCreatesOneMatch) { |
EXPECT_EQ(1U, default_match_count); |
} |
-TEST_F(PhysicalWebProviderTest, TestManyMetadataItemsCreatesOverflowItem) { |
- // This test is intended to verify that an overflow item is created when the |
- // number of nearby Physical Web URLs exceeds the maximum allowable matches |
- // for this provider. The actual limit for the PhysicalWebProvider may be |
- // changed in the future, so create enough metadata to exceed the |
- // AutocompleteProvider's limit. |
- const size_t metadata_count = AutocompleteProvider::kMaxMatches + 1; |
- |
- MockPhysicalWebDataSource* data_source = |
- client_->GetMockPhysicalWebDataSource(); |
- EXPECT_TRUE(data_source); |
- |
- data_source->SetMetadata(CreateMetadata(metadata_count)); |
- |
- { |
- // Run the test with no text in the omnibox input to simulate NTP. |
- provider_->Start(CreateInputForNTP(), false); |
- |
- const size_t match_count = provider_->matches().size(); |
- EXPECT_LT(match_count, metadata_count); |
- |
- // Check that the overflow item is present and its fields are correct. There |
- // may be additional match items, but none should be marked as default. |
- size_t overflow_match_count = 0; |
- for (const auto& match : provider_->matches()) { |
- if (match.type == AutocompleteMatchType::PHYSICAL_WEB_OVERFLOW) { |
- EXPECT_EQ("chrome://physical-web/", match.destination_url.spec()); |
- EXPECT_EQ("chrome://physical-web/", base::UTF16ToASCII(match.contents)); |
- const size_t metadata_matches = match_count - 1; |
- std::string description = l10n_util::GetPluralStringFUTF8( |
- IDS_PHYSICAL_WEB_OVERFLOW, metadata_count - metadata_matches); |
- EXPECT_EQ(description, base::UTF16ToASCII(match.description)); |
- ++overflow_match_count; |
- } |
- EXPECT_FALSE(match.allowed_to_be_default_match); |
- } |
- EXPECT_EQ(1U, overflow_match_count); |
- } |
- |
- { |
- // Run the test again with a URL in the omnibox input. An additional match |
- // should be added as a default match. |
- provider_->Start(CreateInputWithCurrentUrl("http://www.cnn.com"), false); |
- |
- const size_t match_count = provider_->matches().size(); |
- EXPECT_LT(match_count - 1, metadata_count); |
- |
- // Check that the overflow item and default match are present and their |
- // fields are correct. |
- size_t overflow_match_count = 0; |
- size_t default_match_count = 0; |
- for (const auto& match : provider_->matches()) { |
- if (match.type == AutocompleteMatchType::PHYSICAL_WEB_OVERFLOW) { |
- EXPECT_EQ("chrome://physical-web/", match.destination_url.spec()); |
- EXPECT_EQ("chrome://physical-web/", base::UTF16ToASCII(match.contents)); |
- const size_t metadata_matches = match_count - 2; |
- std::string description = l10n_util::GetPluralStringFUTF8( |
- IDS_PHYSICAL_WEB_OVERFLOW, metadata_count - metadata_matches); |
- EXPECT_EQ(description, base::UTF16ToASCII(match.description)); |
- EXPECT_FALSE(match.allowed_to_be_default_match); |
- ++overflow_match_count; |
- } else if (match.allowed_to_be_default_match) { |
- ++default_match_count; |
- } |
- } |
- EXPECT_EQ(1U, overflow_match_count); |
- EXPECT_EQ(1U, default_match_count); |
- } |
-} |
- |
TEST_F(PhysicalWebProviderTest, TestNoMatchesWithUserInput) { |
MockPhysicalWebDataSource* data_source = |
client_->GetMockPhysicalWebDataSource(); |
@@ -290,8 +313,8 @@ TEST_F(PhysicalWebProviderTest, TestNoMatchesWithUserInput) { |
// Construct an AutocompleteInput to simulate user input in the omnibox input |
// field. The provider should not generate any matches. |
std::string text("user input"); |
- const AutocompleteInput input(base::ASCIIToUTF16(text), text.length(), |
- std::string(), GURL(), |
+ const AutocompleteInput input( |
+ base::UTF8ToUTF16(text), text.length(), std::string(), GURL(), |
metrics::OmniboxEventProto::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS, |
true, false, true, true, false, TestSchemeClassifier()); |
provider_->Start(input, false); |
@@ -299,4 +322,58 @@ TEST_F(PhysicalWebProviderTest, TestNoMatchesWithUserInput) { |
EXPECT_TRUE(provider_->matches().empty()); |
} |
+TEST_F(PhysicalWebProviderTest, TestManyMetadataItemsCreatesOverflowItem) { |
+ // Create enough metadata to guarantee an overflow item will be created. |
+ const size_t metadata_count = AutocompleteProvider::kMaxMatches + 1; |
+ |
+ // Run the test with no text in the omnibox input to simulate NTP. |
+ OverflowItemTestCase( |
+ CreateInputForNTP(), CreateMetadata(metadata_count), "Example title 0", |
+ PhysicalWebProvider::kPhysicalWebMaxMatches, false, true); |
+ |
+ // Run the test again with a URL in the omnibox input. An additional match |
+ // should be added as a default match. |
+ OverflowItemTestCase(CreateInputWithCurrentUrl("http://www.cnn.com"), |
+ CreateMetadata(metadata_count), "Example title 0", |
+ PhysicalWebProvider::kPhysicalWebMaxMatches + 1, true, |
+ true); |
+} |
+ |
+TEST_F(PhysicalWebProviderTest, TestLongPageTitleIsTruncatedInOverflowItem) { |
+ // Set a long title for the first item. The page title for this item will |
+ // appear in the overflow item's content string. |
+ auto metadata_list = CreateMetadata(AutocompleteProvider::kMaxMatches + 1); |
+ base::DictionaryValue* metadata_item; |
+ EXPECT_TRUE(metadata_list->GetDictionary(0, &metadata_item)); |
+ metadata_item->SetString("title", "Extra long example title 0"); |
+ |
+ OverflowItemTestCase(CreateInputForNTP(), std::move(metadata_list), |
+ "Extra long exa" + std::string(gfx::kEllipsis), |
+ PhysicalWebProvider::kPhysicalWebMaxMatches, false, |
+ true); |
+} |
+ |
+TEST_F(PhysicalWebProviderTest, TestEmptyPageTitleInOverflowItem) { |
+ // Set an empty title for the first item. Because the title is empty, we will |
+ // display an alternate string in the overflow item's contents. |
+ auto metadata_list = CreateMetadata(AutocompleteProvider::kMaxMatches + 1); |
+ base::DictionaryValue* metadata_item; |
+ EXPECT_TRUE(metadata_list->GetDictionary(0, &metadata_item)); |
+ metadata_item->SetString("title", ""); |
+ |
+ OverflowItemTestCase(CreateInputForNTP(), std::move(metadata_list), "", |
+ PhysicalWebProvider::kPhysicalWebMaxMatches, false, |
+ true); |
+} |
+ |
+TEST_F(PhysicalWebProviderTest, TestRTLPageTitleInOverflowItem) { |
+ // Set a Hebrew title for the first item. |
+ auto metadata_list = CreateMetadata(AutocompleteProvider::kMaxMatches + 1); |
+ base::DictionaryValue* metadata_item; |
+ EXPECT_TRUE(metadata_list->GetDictionary(0, &metadata_item)); |
+ metadata_item->SetString("title", "ויקיפדיה"); |
+ |
+ OverflowItemTestCase(CreateInputForNTP(), std::move(metadata_list), |
+ "ויקיפדיה", PhysicalWebProvider::kPhysicalWebMaxMatches, |
+ false, true); |
} |