blob: 6f8c7279c8d881e024857bb14c259bf6fc56cfb7 [file] [log] [blame]
// Copyright 2018 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.
#import "ios/web/favicon/favicon_util.h"
#include "base/values.h"
#include "ios/web/public/favicon/favicon_url.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/platform_test.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace web {
using FaviconUtilTest = PlatformTest;
// Tries to extract multiple favicons url, all should be extracted.
TEST_F(FaviconUtilTest, ExtractFaviconURLMultipleFavicons) {
base::DictionaryValue favicon;
favicon.SetKey("href", base::Value("http://fav.ico"));
favicon.SetKey("rel", base::Value("icon"));
favicon.SetKey("sizes", base::Value("10x20"));
base::DictionaryValue favicon2;
favicon2.SetKey("href", base::Value("http://fav2.ico"));
favicon2.SetKey("rel", base::Value("apple-touch-icon"));
favicon2.SetKey("sizes", base::Value("10x20 30x40"));
base::DictionaryValue favicon3;
favicon3.SetKey("href", base::Value("http://fav3.ico"));
favicon3.SetKey("rel", base::Value("apple-touch-icon-precomposed"));
favicon3.SetKey("sizes", base::Value("werfxw"));
std::unique_ptr<base::ListValue> favicons =
std::make_unique<base::ListValue>();
favicons->Append(std::move(favicon));
favicons->Append(std::move(favicon2));
favicons->Append(std::move(favicon3));
std::vector<web::FaviconURL> urls;
bool result = web::ExtractFaviconURL(favicons.get(),
GURL("http://chromium.org"), &urls);
EXPECT_TRUE(result);
ASSERT_EQ(3U, urls.size());
EXPECT_EQ(GURL("http://fav.ico"), urls[0].icon_url);
EXPECT_EQ(web::FaviconURL::IconType::kFavicon, urls[0].icon_type);
ASSERT_EQ(1U, urls[0].icon_sizes.size());
EXPECT_EQ(gfx::Size(10, 20), urls[0].icon_sizes[0]);
EXPECT_EQ(GURL("http://fav2.ico"), urls[1].icon_url);
EXPECT_EQ(web::FaviconURL::IconType::kTouchIcon, urls[1].icon_type);
ASSERT_EQ(2U, urls[1].icon_sizes.size());
EXPECT_EQ(gfx::Size(10, 20), urls[1].icon_sizes[0]);
EXPECT_EQ(gfx::Size(30, 40), urls[1].icon_sizes[1]);
EXPECT_EQ(GURL("http://fav3.ico"), urls[2].icon_url);
EXPECT_EQ(web::FaviconURL::IconType::kTouchPrecomposedIcon,
urls[2].icon_type);
EXPECT_EQ(0U, urls[2].icon_sizes.size());
}
// Tries to extract favicons with the rel attributes missing in one of them.
TEST_F(FaviconUtilTest, ExtractFaviconURLNoRel) {
base::DictionaryValue favicon;
favicon.SetKey("href", base::Value("http://fav.ico"));
favicon.SetKey("rel", base::Value("icon"));
base::DictionaryValue favicon2;
favicon2.SetKey("href", base::Value("http://fav2.ico"));
base::DictionaryValue favicon3;
favicon3.SetKey("href", base::Value("http://fav3.ico"));
favicon3.SetKey("rel", base::Value("apple-touch-icon-precomposed"));
std::unique_ptr<base::ListValue> favicons =
std::make_unique<base::ListValue>();
favicons->Append(std::move(favicon));
favicons->Append(std::move(favicon2));
favicons->Append(std::move(favicon3));
std::vector<web::FaviconURL> urls;
bool result = web::ExtractFaviconURL(favicons.get(), GURL(), &urls);
EXPECT_FALSE(result);
ASSERT_EQ(1U, urls.size());
EXPECT_EQ(GURL("http://fav.ico"), urls[0].icon_url);
EXPECT_EQ(web::FaviconURL::IconType::kFavicon, urls[0].icon_type);
}
// Tries to extract favicons with the rel attributes being an int.
TEST_F(FaviconUtilTest, ExtractFaviconURLIntRel) {
base::DictionaryValue favicon;
favicon.SetKey("href", base::Value("http://fav.ico"));
favicon.SetKey("rel", base::Value("icon"));
base::DictionaryValue favicon2;
favicon2.SetKey("href", base::Value("http://fav2.ico"));
favicon2.SetKey("rel", base::Value(12));
base::DictionaryValue favicon3;
favicon3.SetKey("href", base::Value("http://fav3.ico"));
favicon3.SetKey("rel", base::Value("apple-touch-icon-precomposed"));
std::unique_ptr<base::ListValue> favicons =
std::make_unique<base::ListValue>();
favicons->Append(std::move(favicon));
favicons->Append(std::move(favicon2));
favicons->Append(std::move(favicon3));
std::vector<web::FaviconURL> urls;
bool result = web::ExtractFaviconURL(favicons.get(), GURL(), &urls);
EXPECT_FALSE(result);
ASSERT_EQ(1U, urls.size());
EXPECT_EQ(GURL("http://fav.ico"), urls[0].icon_url);
EXPECT_EQ(web::FaviconURL::IconType::kFavicon, urls[0].icon_type);
}
// Tries to extract favicons with the href attributes missing in one of them.
TEST_F(FaviconUtilTest, ExtractFaviconURLNoHref) {
base::DictionaryValue favicon;
favicon.SetKey("href", base::Value("http://fav.ico"));
favicon.SetKey("rel", base::Value("icon"));
base::DictionaryValue favicon2;
favicon2.SetKey("rel", base::Value("apple-touch-icon"));
base::DictionaryValue favicon3;
favicon3.SetKey("href", base::Value("http://fav3.ico"));
favicon3.SetKey("rel", base::Value("apple-touch-icon-precomposed"));
std::unique_ptr<base::ListValue> favicons =
std::make_unique<base::ListValue>();
favicons->Append(std::move(favicon));
favicons->Append(std::move(favicon2));
favicons->Append(std::move(favicon3));
std::vector<web::FaviconURL> urls;
bool result = web::ExtractFaviconURL(favicons.get(), GURL(), &urls);
EXPECT_FALSE(result);
ASSERT_EQ(1U, urls.size());
EXPECT_EQ(GURL("http://fav.ico"), urls[0].icon_url);
EXPECT_EQ(web::FaviconURL::IconType::kFavicon, urls[0].icon_type);
}
// Tries to extract the default favicon when there are no favicon in the
// message.
TEST_F(FaviconUtilTest, ExtractFaviconURLNoFavicons) {
std::unique_ptr<base::ListValue> favicons =
std::make_unique<base::ListValue>();
std::vector<web::FaviconURL> urls;
bool result = web::ExtractFaviconURL(favicons.get(),
GURL("http://chromium.org"), &urls);
EXPECT_TRUE(result);
ASSERT_EQ(1U, urls.size());
EXPECT_EQ(GURL("http://chromium.org/favicon.ico"), urls[0].icon_url);
EXPECT_EQ(web::FaviconURL::IconType::kFavicon, urls[0].icon_type);
EXPECT_EQ(0U, urls[0].icon_sizes.size());
}
// Tries to extract favicons with the sizes attributes containing one correct
// size and one incorrectly formatted.
TEST_F(FaviconUtilTest, ExtractFaviconURLSizesCorrectAndGarbage) {
base::DictionaryValue favicon;
favicon.SetKey("href", base::Value("http://fav.ico"));
favicon.SetKey("rel", base::Value("icon"));
favicon.SetKey("sizes", base::Value("10x20 sgxer"));
base::DictionaryValue favicon2;
favicon2.SetKey("href", base::Value("http://fav2.ico"));
favicon2.SetKey("rel", base::Value("apple-touch-icon"));
favicon2.SetKey("sizes", base::Value("sgxer 30x40"));
std::unique_ptr<base::ListValue> favicons =
std::make_unique<base::ListValue>();
favicons->Append(std::move(favicon));
favicons->Append(std::move(favicon2));
std::vector<web::FaviconURL> urls;
bool result = web::ExtractFaviconURL(favicons.get(), GURL(), &urls);
EXPECT_TRUE(result);
ASSERT_EQ(2U, urls.size());
EXPECT_EQ(GURL("http://fav.ico"), urls[0].icon_url);
EXPECT_EQ(web::FaviconURL::IconType::kFavicon, urls[0].icon_type);
ASSERT_EQ(1U, urls[0].icon_sizes.size());
EXPECT_EQ(10, urls[0].icon_sizes[0].width());
EXPECT_EQ(20, urls[0].icon_sizes[0].height());
EXPECT_EQ(GURL("http://fav2.ico"), urls[1].icon_url);
EXPECT_EQ(web::FaviconURL::IconType::kTouchIcon, urls[1].icon_type);
ASSERT_EQ(1U, urls[1].icon_sizes.size());
EXPECT_EQ(30, urls[1].icon_sizes[0].width());
EXPECT_EQ(40, urls[1].icon_sizes[0].height());
}
// Tries to extract favicons with the sizes attributes containing size only
// partially correctly formatted.
TEST_F(FaviconUtilTest, ExtractFaviconURLSizesPartiallyCorrect) {
base::DictionaryValue favicon;
favicon.SetKey("href", base::Value("http://fav.ico"));
favicon.SetKey("rel", base::Value("icon"));
favicon.SetKey("sizes", base::Value("10x"));
base::DictionaryValue favicon2;
favicon2.SetKey("href", base::Value("http://fav2.ico"));
favicon2.SetKey("rel", base::Value("apple-touch-icon"));
favicon2.SetKey("sizes", base::Value("x40"));
std::unique_ptr<base::ListValue> favicons =
std::make_unique<base::ListValue>();
favicons->Append(std::move(favicon));
favicons->Append(std::move(favicon2));
std::vector<web::FaviconURL> urls;
bool result = web::ExtractFaviconURL(favicons.get(), GURL(), &urls);
EXPECT_TRUE(result);
ASSERT_EQ(2U, urls.size());
EXPECT_EQ(GURL("http://fav.ico"), urls[0].icon_url);
EXPECT_EQ(web::FaviconURL::IconType::kFavicon, urls[0].icon_type);
EXPECT_EQ(0U, urls[0].icon_sizes.size());
EXPECT_EQ(GURL("http://fav2.ico"), urls[1].icon_url);
EXPECT_EQ(web::FaviconURL::IconType::kTouchIcon, urls[1].icon_type);
EXPECT_EQ(0U, urls[1].icon_sizes.size());
}
} // namespace web