| Index: chrome/browser/ui/gtk/omnibox/omnibox_popup_view_gtk_unittest.cc
|
| diff --git a/chrome/browser/ui/gtk/omnibox/omnibox_popup_view_gtk_unittest.cc b/chrome/browser/ui/gtk/omnibox/omnibox_popup_view_gtk_unittest.cc
|
| deleted file mode 100644
|
| index 85d484853cbc583e6eb6c4ec43c06cab211bc260..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/gtk/omnibox/omnibox_popup_view_gtk_unittest.cc
|
| +++ /dev/null
|
| @@ -1,482 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/ui/gtk/omnibox/omnibox_popup_view_gtk.h"
|
| -
|
| -#include <gtk/gtk.h>
|
| -
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/metrics/field_trial.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "chrome/browser/autocomplete/autocomplete_match.h"
|
| -#include "chrome/browser/autocomplete/autocomplete_result.h"
|
| -#include "components/variations/entropy_provider.h"
|
| -#include "testing/platform_test.h"
|
| -#include "ui/base/gtk/gtk_hig_constants.h"
|
| -#include "ui/gfx/font.h"
|
| -#include "ui/gfx/rect.h"
|
| -
|
| -namespace {
|
| -
|
| -const GdkColor kContentTextColor = GDK_COLOR_RGB(0x00, 0x00, 0x00);
|
| -const GdkColor kDimContentTextColor = GDK_COLOR_RGB(0x80, 0x80, 0x80);
|
| -const GdkColor kURLTextColor = GDK_COLOR_RGB(0x00, 0x88, 0x00);
|
| -
|
| -class TestableOmniboxPopupViewGtk : public OmniboxPopupViewGtk {
|
| - public:
|
| - TestableOmniboxPopupViewGtk()
|
| - : OmniboxPopupViewGtk(gfx::Font(), NULL, NULL, NULL),
|
| - show_called_(false),
|
| - hide_called_(false) {
|
| - }
|
| -
|
| - virtual ~TestableOmniboxPopupViewGtk() {
|
| - }
|
| -
|
| - virtual void Show(size_t num_results) OVERRIDE {
|
| - show_called_ = true;
|
| - }
|
| -
|
| - virtual void Hide() OVERRIDE {
|
| - hide_called_ = true;
|
| - }
|
| -
|
| - virtual const AutocompleteResult& GetResult() const OVERRIDE {
|
| - return result_;
|
| - }
|
| -
|
| - using OmniboxPopupViewGtk::GetRectForLine;
|
| - using OmniboxPopupViewGtk::LineFromY;
|
| - using OmniboxPopupViewGtk::GetHiddenMatchCount;
|
| -
|
| - AutocompleteResult result_;
|
| - bool show_called_;
|
| - bool hide_called_;
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -class OmniboxPopupViewGtkTest : public PlatformTest {
|
| - public:
|
| - OmniboxPopupViewGtkTest() {}
|
| -
|
| - virtual void SetUp() {
|
| - PlatformTest::SetUp();
|
| -
|
| - window_ = gtk_window_new(GTK_WINDOW_POPUP);
|
| - layout_ = gtk_widget_create_pango_layout(window_, NULL);
|
| - view_.reset(new TestableOmniboxPopupViewGtk);
|
| - field_trial_list_.reset(new base::FieldTrialList(
|
| - new metrics::SHA1EntropyProvider("42")));
|
| - }
|
| -
|
| - virtual void TearDown() {
|
| - g_object_unref(layout_);
|
| - gtk_widget_destroy(window_);
|
| -
|
| - PlatformTest::TearDown();
|
| - }
|
| -
|
| - // The google C++ Testing Framework documentation suggests making
|
| - // accessors in the fixture so that each test doesn't need to be a
|
| - // friend of the class being tested. This method just proxies the
|
| - // call through after adding the fixture's layout_.
|
| - void SetupLayoutForMatch(
|
| - const base::string16& text,
|
| - const AutocompleteMatch::ACMatchClassifications& classifications,
|
| - const GdkColor* base_color,
|
| - const GdkColor* dim_color,
|
| - const GdkColor* url_color,
|
| - const std::string& prefix_text) {
|
| - OmniboxPopupViewGtk::SetupLayoutForMatch(layout_,
|
| - text,
|
| - classifications,
|
| - base_color,
|
| - dim_color,
|
| - url_color,
|
| - prefix_text);
|
| - }
|
| -
|
| - struct RunInfo {
|
| - PangoAttribute* attr_;
|
| - guint length_;
|
| - RunInfo() : attr_(NULL), length_(0) { }
|
| - };
|
| -
|
| - RunInfo RunInfoForAttrType(guint location,
|
| - guint end_location,
|
| - PangoAttrType type) {
|
| - RunInfo retval;
|
| -
|
| - PangoAttrList* attrs = pango_layout_get_attributes(layout_);
|
| - if (!attrs)
|
| - return retval;
|
| -
|
| - PangoAttrIterator* attr_iter = pango_attr_list_get_iterator(attrs);
|
| - if (!attr_iter)
|
| - return retval;
|
| -
|
| - for (gboolean more = true, findNextStart = false;
|
| - more;
|
| - more = pango_attr_iterator_next(attr_iter)) {
|
| - PangoAttribute* attr = pango_attr_iterator_get(attr_iter, type);
|
| -
|
| - // This iterator segment doesn't have any elements of the
|
| - // desired type; keep looking.
|
| - if (!attr)
|
| - continue;
|
| -
|
| - // Skip attribute ranges before the desired start point.
|
| - if (attr->end_index <= location)
|
| - continue;
|
| -
|
| - // If the matching type went past the iterator segment, then set
|
| - // the length to the next start - location.
|
| - if (findNextStart) {
|
| - // If the start is still less than the location, then reset
|
| - // the match. Otherwise, check that the new attribute is, in
|
| - // fact different before shortening the run length.
|
| - if (attr->start_index <= location) {
|
| - findNextStart = false;
|
| - } else if (!pango_attribute_equal(retval.attr_, attr)) {
|
| - retval.length_ = attr->start_index - location;
|
| - break;
|
| - }
|
| - }
|
| -
|
| - gint start_range, end_range;
|
| - pango_attr_iterator_range(attr_iter,
|
| - &start_range,
|
| - &end_range);
|
| -
|
| - // Now we have a match. May need to keep going to shorten
|
| - // length if we reach a new item of the same type.
|
| - retval.attr_ = attr;
|
| - if (attr->end_index > (guint)end_range) {
|
| - retval.length_ = end_location - location;
|
| - findNextStart = true;
|
| - } else {
|
| - retval.length_ = attr->end_index - location;
|
| - break;
|
| - }
|
| - }
|
| -
|
| - pango_attr_iterator_destroy(attr_iter);
|
| - return retval;
|
| - }
|
| -
|
| - guint RunLengthForAttrType(guint location,
|
| - guint end_location,
|
| - PangoAttrType type) {
|
| - RunInfo info = RunInfoForAttrType(location,
|
| - end_location,
|
| - type);
|
| - return info.length_;
|
| - }
|
| -
|
| - gboolean RunHasAttribute(guint location,
|
| - guint end_location,
|
| - PangoAttribute* attribute) {
|
| - RunInfo info = RunInfoForAttrType(location,
|
| - end_location,
|
| - attribute->klass->type);
|
| -
|
| - return info.attr_ && pango_attribute_equal(info.attr_, attribute);
|
| - }
|
| -
|
| - gboolean RunHasColor(guint location,
|
| - guint end_location,
|
| - const GdkColor& color) {
|
| - PangoAttribute* attribute =
|
| - pango_attr_foreground_new(color.red,
|
| - color.green,
|
| - color.blue);
|
| -
|
| - gboolean retval = RunHasAttribute(location,
|
| - end_location,
|
| - attribute);
|
| -
|
| - pango_attribute_destroy(attribute);
|
| -
|
| - return retval;
|
| - }
|
| -
|
| - gboolean RunHasWeight(guint location,
|
| - guint end_location,
|
| - PangoWeight weight) {
|
| - PangoAttribute* attribute = pango_attr_weight_new(weight);
|
| -
|
| - gboolean retval = RunHasAttribute(location,
|
| - end_location,
|
| - attribute);
|
| -
|
| - pango_attribute_destroy(attribute);
|
| -
|
| - return retval;
|
| - }
|
| -
|
| - GtkWidget* window_;
|
| - PangoLayout* layout_;
|
| -
|
| - scoped_ptr<TestableOmniboxPopupViewGtk> view_;
|
| - scoped_ptr<base::FieldTrialList> field_trial_list_;
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(OmniboxPopupViewGtkTest);
|
| -};
|
| -
|
| -// Simple inputs with no matches should result in styled output who's
|
| -// text matches the input string, with the passed-in color, and
|
| -// nothing bolded.
|
| -TEST_F(OmniboxPopupViewGtkTest, DecorateMatchedStringNoMatch) {
|
| - const base::string16 kContents = base::ASCIIToUTF16("This is a test");
|
| -
|
| - AutocompleteMatch::ACMatchClassifications classifications;
|
| -
|
| - SetupLayoutForMatch(kContents,
|
| - classifications,
|
| - &kContentTextColor,
|
| - &kDimContentTextColor,
|
| - &kURLTextColor,
|
| - std::string());
|
| -
|
| - EXPECT_EQ(kContents.length(), RunLengthForAttrType(0U, kContents.length(),
|
| - PANGO_ATTR_FOREGROUND));
|
| -
|
| - EXPECT_TRUE(RunHasColor(0U, kContents.length(), kContentTextColor));
|
| -
|
| - // This part's a little wacky - either we don't have a weight, or
|
| - // the weight run is the entire string and is NORMAL
|
| - guint weightLength = RunLengthForAttrType(0U, kContents.length(),
|
| - PANGO_ATTR_WEIGHT);
|
| - if (weightLength) {
|
| - EXPECT_EQ(kContents.length(), weightLength);
|
| - EXPECT_TRUE(RunHasWeight(0U, kContents.length(), PANGO_WEIGHT_NORMAL));
|
| - }
|
| -}
|
| -
|
| -// Identical to DecorateMatchedStringNoMatch, except test that URL
|
| -// style gets a different color than we passed in.
|
| -TEST_F(OmniboxPopupViewGtkTest, DecorateMatchedStringURLNoMatch) {
|
| - const base::string16 kContents = base::ASCIIToUTF16("This is a test");
|
| - AutocompleteMatch::ACMatchClassifications classifications;
|
| -
|
| - classifications.push_back(
|
| - ACMatchClassification(0U, ACMatchClassification::URL));
|
| -
|
| - SetupLayoutForMatch(kContents,
|
| - classifications,
|
| - &kContentTextColor,
|
| - &kDimContentTextColor,
|
| - &kURLTextColor,
|
| - std::string());
|
| -
|
| - EXPECT_EQ(kContents.length(), RunLengthForAttrType(0U, kContents.length(),
|
| - PANGO_ATTR_FOREGROUND));
|
| - EXPECT_TRUE(RunHasColor(0U, kContents.length(), kURLTextColor));
|
| -
|
| - // This part's a little wacky - either we don't have a weight, or
|
| - // the weight run is the entire string and is NORMAL
|
| - guint weightLength = RunLengthForAttrType(0U, kContents.length(),
|
| - PANGO_ATTR_WEIGHT);
|
| - if (weightLength) {
|
| - EXPECT_EQ(kContents.length(), weightLength);
|
| - EXPECT_TRUE(RunHasWeight(0U, kContents.length(), PANGO_WEIGHT_NORMAL));
|
| - }
|
| -}
|
| -
|
| -// Test that DIM works as expected.
|
| -TEST_F(OmniboxPopupViewGtkTest, DecorateMatchedStringDimNoMatch) {
|
| - const base::string16 kContents = base::ASCIIToUTF16("This is a test");
|
| - // Dim "is".
|
| - const guint kRunLength1 = 5, kRunLength2 = 2, kRunLength3 = 7;
|
| - // Make sure nobody messed up the inputs.
|
| - EXPECT_EQ(kRunLength1 + kRunLength2 + kRunLength3, kContents.length());
|
| -
|
| - // Push each run onto classifications.
|
| - AutocompleteMatch::ACMatchClassifications classifications;
|
| - classifications.push_back(
|
| - ACMatchClassification(0U, ACMatchClassification::NONE));
|
| - classifications.push_back(
|
| - ACMatchClassification(kRunLength1, ACMatchClassification::DIM));
|
| - classifications.push_back(
|
| - ACMatchClassification(kRunLength1 + kRunLength2,
|
| - ACMatchClassification::NONE));
|
| -
|
| - SetupLayoutForMatch(kContents,
|
| - classifications,
|
| - &kContentTextColor,
|
| - &kDimContentTextColor,
|
| - &kURLTextColor,
|
| - std::string());
|
| -
|
| - // Check the runs have expected color and length.
|
| - EXPECT_EQ(kRunLength1, RunLengthForAttrType(0U, kContents.length(),
|
| - PANGO_ATTR_FOREGROUND));
|
| - EXPECT_TRUE(RunHasColor(0U, kContents.length(), kContentTextColor));
|
| - EXPECT_EQ(kRunLength2, RunLengthForAttrType(kRunLength1, kContents.length(),
|
| - PANGO_ATTR_FOREGROUND));
|
| - EXPECT_TRUE(RunHasColor(kRunLength1, kContents.length(),
|
| - kDimContentTextColor));
|
| - EXPECT_EQ(kRunLength3, RunLengthForAttrType(kRunLength1 + kRunLength2,
|
| - kContents.length(),
|
| - PANGO_ATTR_FOREGROUND));
|
| - EXPECT_TRUE(RunHasColor(kRunLength1 + kRunLength2, kContents.length(),
|
| - kContentTextColor));
|
| -
|
| - // This part's a little wacky - either we don't have a weight, or
|
| - // the weight run is the entire string and is NORMAL
|
| - guint weightLength = RunLengthForAttrType(0U, kContents.length(),
|
| - PANGO_ATTR_WEIGHT);
|
| - if (weightLength) {
|
| - EXPECT_EQ(kContents.length(), weightLength);
|
| - EXPECT_TRUE(RunHasWeight(0U, kContents.length(), PANGO_WEIGHT_NORMAL));
|
| - }
|
| -}
|
| -
|
| -// Test that the matched run gets bold-faced, but keeps the same
|
| -// color.
|
| -TEST_F(OmniboxPopupViewGtkTest, DecorateMatchedStringMatch) {
|
| - const base::string16 kContents = base::ASCIIToUTF16("This is a test");
|
| - // Match "is".
|
| - const guint kRunLength1 = 5, kRunLength2 = 2, kRunLength3 = 7;
|
| - // Make sure nobody messed up the inputs.
|
| - EXPECT_EQ(kRunLength1 + kRunLength2 + kRunLength3, kContents.length());
|
| -
|
| - // Push each run onto classifications.
|
| - AutocompleteMatch::ACMatchClassifications classifications;
|
| - classifications.push_back(
|
| - ACMatchClassification(0U, ACMatchClassification::NONE));
|
| - classifications.push_back(
|
| - ACMatchClassification(kRunLength1, ACMatchClassification::MATCH));
|
| - classifications.push_back(
|
| - ACMatchClassification(kRunLength1 + kRunLength2,
|
| - ACMatchClassification::NONE));
|
| -
|
| - SetupLayoutForMatch(kContents,
|
| - classifications,
|
| - &kContentTextColor,
|
| - &kDimContentTextColor,
|
| - &kURLTextColor,
|
| - std::string());
|
| -
|
| - // Check the runs have expected weight and length.
|
| - EXPECT_EQ(kRunLength1, RunLengthForAttrType(0U, kContents.length(),
|
| - PANGO_ATTR_WEIGHT));
|
| - EXPECT_TRUE(RunHasWeight(0U, kContents.length(), PANGO_WEIGHT_NORMAL));
|
| - EXPECT_EQ(kRunLength2, RunLengthForAttrType(kRunLength1, kContents.length(),
|
| - PANGO_ATTR_WEIGHT));
|
| - EXPECT_TRUE(RunHasWeight(kRunLength1, kContents.length(), PANGO_WEIGHT_BOLD));
|
| - EXPECT_EQ(kRunLength3, RunLengthForAttrType(kRunLength1 + kRunLength2,
|
| - kContents.length(),
|
| - PANGO_ATTR_WEIGHT));
|
| - EXPECT_TRUE(RunHasWeight(kRunLength1 + kRunLength2, kContents.length(),
|
| - PANGO_WEIGHT_NORMAL));
|
| -
|
| - // The entire string should be the same, normal color.
|
| - EXPECT_EQ(kContents.length(), RunLengthForAttrType(0U, kContents.length(),
|
| - PANGO_ATTR_FOREGROUND));
|
| - EXPECT_TRUE(RunHasColor(0U, kContents.length(), kContentTextColor));
|
| -}
|
| -
|
| -// Just like DecorateMatchedStringURLMatch, this time with URL style.
|
| -TEST_F(OmniboxPopupViewGtkTest, DecorateMatchedStringURLMatch) {
|
| - const base::string16 kContents = base::ASCIIToUTF16("http://hello.world/");
|
| - // Match "hello".
|
| - const guint kRunLength1 = 7, kRunLength2 = 5, kRunLength3 = 7;
|
| - // Make sure nobody messed up the inputs.
|
| - EXPECT_EQ(kRunLength1 + kRunLength2 + kRunLength3, kContents.length());
|
| -
|
| - // Push each run onto classifications.
|
| - AutocompleteMatch::ACMatchClassifications classifications;
|
| - classifications.push_back(
|
| - ACMatchClassification(0U, ACMatchClassification::URL));
|
| - const int kURLMatch =
|
| - ACMatchClassification::URL | ACMatchClassification::MATCH;
|
| - classifications.push_back(
|
| - ACMatchClassification(kRunLength1, kURLMatch));
|
| - classifications.push_back(
|
| - ACMatchClassification(kRunLength1 + kRunLength2,
|
| - ACMatchClassification::URL));
|
| -
|
| - SetupLayoutForMatch(kContents,
|
| - classifications,
|
| - &kContentTextColor,
|
| - &kDimContentTextColor,
|
| - &kURLTextColor,
|
| - std::string());
|
| -
|
| - // One color for the entire string, and it's not the one we passed
|
| - // in.
|
| - EXPECT_EQ(kContents.length(), RunLengthForAttrType(0U, kContents.length(),
|
| - PANGO_ATTR_FOREGROUND));
|
| - EXPECT_TRUE(RunHasColor(0U, kContents.length(), kURLTextColor));
|
| -}
|
| -
|
| -// Test that the popup is not shown if there is only one hidden match.
|
| -TEST_F(OmniboxPopupViewGtkTest, HidesIfOnlyOneHiddenMatch) {
|
| - ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(
|
| - "InstantExtended", "Group1 hide_verbatim:1"));
|
| - ACMatches matches;
|
| - AutocompleteMatch match;
|
| - match.destination_url = GURL("http://verbatim/");
|
| - match.type = AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED;
|
| - matches.push_back(match);
|
| - view_->result_.AppendMatches(matches);
|
| - ASSERT_TRUE(view_->result_.ShouldHideTopMatch());
|
| -
|
| - // Since there is only one match which is hidden, the popup should close.
|
| - view_->UpdatePopupAppearance();
|
| - EXPECT_TRUE(view_->hide_called_);
|
| -}
|
| -
|
| -// Test that the top match is skipped if the model indicates it should be
|
| -// hidden.
|
| -TEST_F(OmniboxPopupViewGtkTest, SkipsTopMatchIfHidden) {
|
| - ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(
|
| - "InstantExtended", "Group1 hide_verbatim:1"));
|
| - ACMatches matches;
|
| - {
|
| - AutocompleteMatch match;
|
| - match.destination_url = GURL("http://verbatim/");
|
| - match.type = AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED;
|
| - matches.push_back(match);
|
| - }
|
| - {
|
| - AutocompleteMatch match;
|
| - match.destination_url = GURL("http://not-verbatim/");
|
| - match.type = AutocompleteMatchType::SEARCH_OTHER_ENGINE;
|
| - matches.push_back(match);
|
| - }
|
| - view_->result_.AppendMatches(matches);
|
| - ASSERT_TRUE(view_->result_.ShouldHideTopMatch());
|
| -
|
| - EXPECT_EQ(1U, view_->GetHiddenMatchCount());
|
| - EXPECT_EQ(1U, view_->LineFromY(0));
|
| - gfx::Rect rect = view_->GetRectForLine(1, 100);
|
| - EXPECT_EQ(1, rect.y());
|
| -}
|
| -
|
| -// Test that the top match is not skipped if the model does not indicate it
|
| -// should be hidden.
|
| -TEST_F(OmniboxPopupViewGtkTest, DoesNotSkipTopMatchIfVisible) {
|
| - ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(
|
| - "InstantExtended", "Group1 hide_verbatim:1"));
|
| - ACMatches matches;
|
| - AutocompleteMatch match;
|
| - match.destination_url = GURL("http://not-verbatim/");
|
| - match.type = AutocompleteMatchType::SEARCH_OTHER_ENGINE;
|
| - matches.push_back(match);
|
| - view_->result_.AppendMatches(matches);
|
| - ASSERT_FALSE(view_->result_.ShouldHideTopMatch());
|
| -
|
| - EXPECT_EQ(0U, view_->GetHiddenMatchCount());
|
| - EXPECT_EQ(0U, view_->LineFromY(0));
|
| - gfx::Rect rect = view_->GetRectForLine(1, 100);
|
| - EXPECT_EQ(25, rect.y());
|
| -
|
| - // The single match is visible so the popup should be open.
|
| - view_->UpdatePopupAppearance();
|
| - EXPECT_TRUE(view_->show_called_);
|
| -}
|
|
|