This source file includes following definitions.
- hide_called_
- Show
- Hide
- GetResult
- SetUp
- TearDown
- SetupLayoutForMatch
- RunInfoForAttrType
- RunLengthForAttrType
- RunHasAttribute
- RunHasColor
- RunHasWeight
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
#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_;
};
}
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();
}
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);
if (!attr)
continue;
if (attr->end_index <= location)
continue;
if (findNextStart) {
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);
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);
};
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));
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_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));
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_F(OmniboxPopupViewGtkTest, DecorateMatchedStringDimNoMatch) {
const base::string16 kContents = base::ASCIIToUTF16("This is a test");
const guint kRunLength1 = 5, kRunLength2 = 2, kRunLength3 = 7;
EXPECT_EQ(kRunLength1 + kRunLength2 + kRunLength3, kContents.length());
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());
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));
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_F(OmniboxPopupViewGtkTest, DecorateMatchedStringMatch) {
const base::string16 kContents = base::ASCIIToUTF16("This is a test");
const guint kRunLength1 = 5, kRunLength2 = 2, kRunLength3 = 7;
EXPECT_EQ(kRunLength1 + kRunLength2 + kRunLength3, kContents.length());
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());
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));
EXPECT_EQ(kContents.length(), RunLengthForAttrType(0U, kContents.length(),
PANGO_ATTR_FOREGROUND));
EXPECT_TRUE(RunHasColor(0U, kContents.length(), kContentTextColor));
}
TEST_F(OmniboxPopupViewGtkTest, DecorateMatchedStringURLMatch) {
const base::string16 kContents = base::ASCIIToUTF16("http://hello.world/");
const guint kRunLength1 = 7, kRunLength2 = 5, kRunLength3 = 7;
EXPECT_EQ(kRunLength1 + kRunLength2 + kRunLength3, kContents.length());
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());
EXPECT_EQ(kContents.length(), RunLengthForAttrType(0U, kContents.length(),
PANGO_ATTR_FOREGROUND));
EXPECT_TRUE(RunHasColor(0U, kContents.length(), kURLTextColor));
}
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());
view_->UpdatePopupAppearance();
EXPECT_TRUE(view_->hide_called_);
}
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_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());
view_->UpdatePopupAppearance();
EXPECT_TRUE(view_->show_called_);
}