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.
4
5#include "chrome/common/favicon/favicon_url_parser.h"
6
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"
11
12class FaviconUrlParserTest : public testing::Test {
13 public:
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));
22  }
23
24  virtual ~FaviconUrlParserTest() {
25  }
26
27 private:
28  typedef scoped_ptr<ui::test::ScopedSetSupportedScaleFactors>
29      ScopedSetSupportedScaleFactors;
30  ScopedSetSupportedScaleFactors scoped_set_supported_scale_factors_;
31
32  DISALLOW_COPY_AND_ASSIGN(FaviconUrlParserTest);
33};
34
35// Test parsing path with no extra parameters.
36TEST_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;
40
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);
47}
48
49// Test parsing path with a 'size' parameter.
50TEST_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;
54
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);
62
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);
70
71  // Test that we pick the ui::ScaleFactor which is closest to the passed in
72  // scale factor.
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);
79
80  // Invalid cases.
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));
87
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);
95}
96
97// Test parsing path with the 'largest' parameter.
98TEST_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;
102
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.
109}
110
111// Test parsing path with 'iconurl' parameter.
112TEST_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;
116
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);
123}
124
125// Test parsing path with 'origin' parameter.
126TEST_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;
130
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);
137
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);
144}
145
146// Test parsing paths with both a 'size' parameter and a 'url modifier'
147// parameter.
148TEST_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;
152
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);
159
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);
166}
167