1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/common/favicon/favicon_url_parser.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "components/favicon_base/favicon_types.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "ui/base/layout.h"
12 class FaviconUrlParserTest
: public testing::Test
{
14 FaviconUrlParserTest() {
15 // Set the supported scale factors because the supported scale factors
16 // affect the result of ParsePathAndScale().
17 std::vector
<ui::ScaleFactor
> supported_scale_factors
;
18 supported_scale_factors
.push_back(ui::SCALE_FACTOR_100P
);
19 supported_scale_factors
.push_back(ui::SCALE_FACTOR_140P
);
20 scoped_set_supported_scale_factors_
.reset(
21 new ui::test::ScopedSetSupportedScaleFactors(supported_scale_factors
));
24 virtual ~FaviconUrlParserTest() {
28 typedef scoped_ptr
<ui::test::ScopedSetSupportedScaleFactors
>
29 ScopedSetSupportedScaleFactors
;
30 ScopedSetSupportedScaleFactors scoped_set_supported_scale_factors_
;
32 DISALLOW_COPY_AND_ASSIGN(FaviconUrlParserTest
);
35 // Test parsing path with no extra parameters.
36 TEST_F(FaviconUrlParserTest
, ParsingNoExtraParams
) {
37 const std::string
url("https://www.google.ca/imghp?hl=en&tab=wi");
38 int icon_types
= favicon_base::TOUCH_PRECOMPOSED_ICON
;
39 chrome::ParsedFaviconPath parsed
;
41 const std::string path1
= url
;
42 EXPECT_TRUE(chrome::ParseFaviconPath(path1
, icon_types
, &parsed
));
43 EXPECT_FALSE(parsed
.is_icon_url
);
44 EXPECT_EQ(url
, parsed
.url
);
45 EXPECT_EQ(16, parsed
.size_in_dip
);
46 EXPECT_EQ(1.0f
, parsed
.device_scale_factor
);
49 // Test parsing path with a 'size' parameter.
50 TEST_F(FaviconUrlParserTest
, ParsingSizeParam
) {
51 const std::string
url("https://www.google.ca/imghp?hl=en&tab=wi");
52 int icon_types
= favicon_base::TOUCH_PRECOMPOSED_ICON
;
53 chrome::ParsedFaviconPath parsed
;
55 // Test that we can still parse the legacy 'size' parameter format.
56 const std::string path2
= "size/32/" + url
;
57 EXPECT_TRUE(chrome::ParseFaviconPath(path2
, icon_types
, &parsed
));
58 EXPECT_FALSE(parsed
.is_icon_url
);
59 EXPECT_EQ(url
, parsed
.url
);
60 EXPECT_EQ(32, parsed
.size_in_dip
);
61 EXPECT_EQ(1.0f
, parsed
.device_scale_factor
);
63 // Test parsing current 'size' parameter format.
64 const std::string path3
= "size/32@1.4x/" + url
;
65 EXPECT_TRUE(chrome::ParseFaviconPath(path3
, icon_types
, &parsed
));
66 EXPECT_FALSE(parsed
.is_icon_url
);
67 EXPECT_EQ(url
, parsed
.url
);
68 EXPECT_EQ(32, parsed
.size_in_dip
);
69 EXPECT_EQ(1.4f
, parsed
.device_scale_factor
);
71 // Test that we pick the ui::ScaleFactor which is closest to the passed in
73 const std::string path4
= "size/16@1.41x/" + url
;
74 EXPECT_TRUE(chrome::ParseFaviconPath(path4
, icon_types
, &parsed
));
75 EXPECT_FALSE(parsed
.is_icon_url
);
76 EXPECT_EQ(url
, parsed
.url
);
77 EXPECT_EQ(16, parsed
.size_in_dip
);
78 EXPECT_EQ(1.41f
, parsed
.device_scale_factor
);
81 const std::string path5
= "size/" + url
;
82 EXPECT_FALSE(chrome::ParseFaviconPath(path5
, icon_types
, &parsed
));
83 const std::string path6
= "size/@1x/" + url
;
84 EXPECT_FALSE(chrome::ParseFaviconPath(path6
, icon_types
, &parsed
));
85 const std::string path7
= "size/abc@1x/" + url
;
86 EXPECT_FALSE(chrome::ParseFaviconPath(path7
, icon_types
, &parsed
));
88 // Part of url looks like 'size' parameter.
89 const std::string path8
= "http://www.google.com/size/32@1.4x";
90 EXPECT_TRUE(chrome::ParseFaviconPath(path8
, icon_types
, &parsed
));
91 EXPECT_FALSE(parsed
.is_icon_url
);
92 EXPECT_EQ(path8
, parsed
.url
);
93 EXPECT_EQ(16, parsed
.size_in_dip
);
94 EXPECT_EQ(1.0f
, parsed
.device_scale_factor
);
97 // Test parsing path with the 'largest' parameter.
98 TEST_F(FaviconUrlParserTest
, ParsingLargestParam
) {
99 const std::string
url("https://www.google.ca/imghp?hl=en&tab=wi");
100 int icon_types
= favicon_base::TOUCH_PRECOMPOSED_ICON
;
101 chrome::ParsedFaviconPath parsed
;
103 const std::string path9
= "largest/" + url
;
104 EXPECT_TRUE(chrome::ParseFaviconPath(path9
, icon_types
, &parsed
));
105 EXPECT_FALSE(parsed
.is_icon_url
);
106 EXPECT_EQ(url
, parsed
.url
);
107 EXPECT_EQ(0, parsed
.size_in_dip
);
108 // The scale factor is meaningless when requesting the largest favicon.
111 // Test parsing path with 'iconurl' parameter.
112 TEST_F(FaviconUrlParserTest
, ParsingIconUrlParam
) {
113 const std::string
url("https://www.google.ca/imghp?hl=en&tab=wi");
114 int icon_types
= favicon_base::TOUCH_PRECOMPOSED_ICON
;
115 chrome::ParsedFaviconPath parsed
;
117 const std::string path10
= "iconurl/http://www.google.com/favicon.ico";
118 EXPECT_TRUE(chrome::ParseFaviconPath(path10
, icon_types
, &parsed
));
119 EXPECT_TRUE(parsed
.is_icon_url
);
120 EXPECT_EQ("http://www.google.com/favicon.ico", parsed
.url
);
121 EXPECT_EQ(16, parsed
.size_in_dip
);
122 EXPECT_EQ(1.0f
, parsed
.device_scale_factor
);
125 // Test parsing path with 'origin' parameter.
126 TEST_F(FaviconUrlParserTest
, ParsingOriginParam
) {
127 const std::string
url("https://www.google.ca/imghp?hl=en&tab=wi");
128 int icon_types
= favicon_base::TOUCH_PRECOMPOSED_ICON
;
129 chrome::ParsedFaviconPath parsed
;
131 const std::string path11
= "origin/" + url
;
132 EXPECT_TRUE(chrome::ParseFaviconPath(path11
, icon_types
, &parsed
));
133 EXPECT_FALSE(parsed
.is_icon_url
);
134 EXPECT_EQ("https://www.google.ca/", parsed
.url
);
135 EXPECT_EQ(16, parsed
.size_in_dip
);
136 EXPECT_EQ(1.0f
, parsed
.device_scale_factor
);
138 const std::string path12
= "origin/google.com";
139 EXPECT_TRUE(chrome::ParseFaviconPath(path12
, icon_types
, &parsed
));
140 EXPECT_FALSE(parsed
.is_icon_url
);
141 EXPECT_EQ("http://google.com/", parsed
.url
);
142 EXPECT_EQ(16, parsed
.size_in_dip
);
143 EXPECT_EQ(1.0f
, parsed
.device_scale_factor
);
146 // Test parsing paths with both a 'size' parameter and a 'url modifier'
148 TEST_F(FaviconUrlParserTest
, ParsingSizeParamAndUrlModifier
) {
149 const std::string
url("https://www.google.ca/imghp?hl=en&tab=wi");
150 int icon_types
= favicon_base::TOUCH_PRECOMPOSED_ICON
;
151 chrome::ParsedFaviconPath parsed
;
153 const std::string path13
= "size/32@1.4x/origin/" + url
;
154 EXPECT_TRUE(chrome::ParseFaviconPath(path13
, icon_types
, &parsed
));
155 EXPECT_FALSE(parsed
.is_icon_url
);
156 EXPECT_EQ("https://www.google.ca/", parsed
.url
);
157 EXPECT_EQ(32, parsed
.size_in_dip
);
158 EXPECT_EQ(1.4f
, parsed
.device_scale_factor
);
160 const std::string path14
=
161 "largest/iconurl/http://www.google.com/favicon.ico";
162 EXPECT_TRUE(chrome::ParseFaviconPath(path14
, icon_types
, &parsed
));
163 EXPECT_TRUE(parsed
.is_icon_url
);
164 EXPECT_EQ("http://www.google.com/favicon.ico", parsed
.url
);
165 EXPECT_EQ(0, parsed
.size_in_dip
);