Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/favicon/core/large_icon_service.h" | 5 #include "components/favicon/core/large_icon_service.h" |
| 6 | 6 |
| 7 #include <deque> | 7 #include <deque> |
| 8 #include <memory> | 8 #include <memory> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 22 #include "components/favicon_base/favicon_types.h" | 22 #include "components/favicon_base/favicon_types.h" |
| 23 #include "components/image_fetcher/core/image_fetcher.h" | 23 #include "components/image_fetcher/core/image_fetcher.h" |
| 24 #include "components/image_fetcher/core/request_metadata.h" | 24 #include "components/image_fetcher/core/request_metadata.h" |
| 25 #include "testing/gmock/include/gmock/gmock.h" | 25 #include "testing/gmock/include/gmock/gmock.h" |
| 26 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
| 27 #include "third_party/skia/include/core/SkBitmap.h" | 27 #include "third_party/skia/include/core/SkBitmap.h" |
| 28 #include "third_party/skia/include/core/SkColor.h" | 28 #include "third_party/skia/include/core/SkColor.h" |
| 29 #include "ui/gfx/codec/png_codec.h" | 29 #include "ui/gfx/codec/png_codec.h" |
| 30 #include "ui/gfx/geometry/size.h" | 30 #include "ui/gfx/geometry/size.h" |
| 31 #include "ui/gfx/image/image.h" | 31 #include "ui/gfx/image/image.h" |
| 32 #include "ui/gfx/image/image_skia.h" | |
| 32 #include "url/gurl.h" | 33 #include "url/gurl.h" |
| 33 | 34 |
| 34 namespace favicon { | 35 namespace favicon { |
| 35 namespace { | 36 namespace { |
| 36 | 37 |
| 37 using testing::NiceMock; | 38 using testing::NiceMock; |
| 38 using testing::Return; | 39 using testing::Return; |
| 39 using testing::SaveArg; | 40 using testing::SaveArg; |
| 40 using testing::_; | 41 using testing::_; |
| 41 | 42 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 96 const ImageFetcherCallback&)); | 97 const ImageFetcherCallback&)); |
| 97 MOCK_METHOD0(GetImageDecoder, image_fetcher::ImageDecoder*()); | 98 MOCK_METHOD0(GetImageDecoder, image_fetcher::ImageDecoder*()); |
| 98 }; | 99 }; |
| 99 | 100 |
| 100 class LargeIconServiceTest : public testing::Test { | 101 class LargeIconServiceTest : public testing::Test { |
| 101 public: | 102 public: |
| 102 LargeIconServiceTest() | 103 LargeIconServiceTest() |
| 103 : mock_image_fetcher_(new NiceMock<MockImageFetcher>()), | 104 : mock_image_fetcher_(new NiceMock<MockImageFetcher>()), |
| 104 large_icon_service_(&mock_favicon_service_, | 105 large_icon_service_(&mock_favicon_service_, |
| 105 base::ThreadTaskRunnerHandle::Get(), | 106 base::ThreadTaskRunnerHandle::Get(), |
| 106 base::WrapUnique(mock_image_fetcher_)), | 107 base::WrapUnique(mock_image_fetcher_)) {} |
| 107 is_callback_invoked_(false) {} | |
| 108 | 108 |
| 109 ~LargeIconServiceTest() override { | 109 ~LargeIconServiceTest() override {} |
| 110 } | |
| 111 | |
| 112 void ResultCallback(const favicon_base::LargeIconResult& result) { | |
| 113 is_callback_invoked_ = true; | |
| 114 | |
| 115 // Checking presence and absence of results. | |
| 116 EXPECT_EQ(expected_bitmap_.is_valid(), result.bitmap.is_valid()); | |
| 117 EXPECT_EQ(expected_fallback_icon_style_ != nullptr, | |
| 118 result.fallback_icon_style != nullptr); | |
| 119 | |
| 120 if (expected_bitmap_.is_valid()) { | |
| 121 EXPECT_EQ(expected_bitmap_.pixel_size, result.bitmap.pixel_size); | |
| 122 // Not actually checking bitmap content. | |
| 123 } | |
| 124 if (expected_fallback_icon_style_.get()) { | |
| 125 EXPECT_EQ(*expected_fallback_icon_style_, | |
| 126 *result.fallback_icon_style); | |
| 127 } | |
| 128 } | |
| 129 | |
| 130 void InjectMockResult( | |
| 131 const GURL& page_url, | |
| 132 const favicon_base::FaviconRawBitmapResult& mock_result) { | |
| 133 EXPECT_CALL(mock_favicon_service_, | |
| 134 GetLargestRawFaviconForPageURL(page_url, _, _, _, _)) | |
| 135 .WillOnce(PostReply<5>(mock_result)); | |
| 136 } | |
| 137 | 110 |
| 138 protected: | 111 protected: |
| 139 base::MessageLoopForIO loop_; | 112 base::MessageLoopForIO loop_; |
| 140 | 113 |
| 141 NiceMock<MockImageFetcher>* mock_image_fetcher_; | 114 NiceMock<MockImageFetcher>* mock_image_fetcher_; |
| 142 testing::NiceMock<MockFaviconService> mock_favicon_service_; | 115 testing::NiceMock<MockFaviconService> mock_favicon_service_; |
| 143 LargeIconService large_icon_service_; | 116 LargeIconService large_icon_service_; |
| 144 base::CancelableTaskTracker cancelable_task_tracker_; | |
| 145 | |
| 146 favicon_base::FaviconRawBitmapResult expected_bitmap_; | |
| 147 std::unique_ptr<favicon_base::FallbackIconStyle> | |
| 148 expected_fallback_icon_style_; | |
| 149 | |
| 150 bool is_callback_invoked_; | |
| 151 | 117 |
| 152 private: | 118 private: |
| 153 DISALLOW_COPY_AND_ASSIGN(LargeIconServiceTest); | 119 DISALLOW_COPY_AND_ASSIGN(LargeIconServiceTest); |
| 154 }; | 120 }; |
| 155 | 121 |
| 156 TEST_F(LargeIconServiceTest, SameSize) { | |
| 157 InjectMockResult(GURL(kDummyUrl), CreateTestBitmapResult(24, 24, kTestColor)); | |
| 158 expected_bitmap_ = CreateTestBitmapResult(24, 24, kTestColor); | |
| 159 large_icon_service_.GetLargeIconOrFallbackStyle( | |
| 160 GURL(kDummyUrl), | |
| 161 24, // |min_source_size_in_pixel| | |
| 162 24, // |desired_size_in_pixel| | |
| 163 base::Bind(&LargeIconServiceTest::ResultCallback, base::Unretained(this)), | |
| 164 &cancelable_task_tracker_); | |
| 165 base::RunLoop().RunUntilIdle(); | |
| 166 EXPECT_TRUE(is_callback_invoked_); | |
| 167 } | |
| 168 | |
| 169 TEST_F(LargeIconServiceTest, ScaleDown) { | |
| 170 InjectMockResult(GURL(kDummyUrl), CreateTestBitmapResult(32, 32, kTestColor)); | |
| 171 expected_bitmap_ = CreateTestBitmapResult(24, 24, kTestColor); | |
| 172 large_icon_service_.GetLargeIconOrFallbackStyle( | |
| 173 GURL(kDummyUrl), 24, 24, | |
| 174 base::Bind(&LargeIconServiceTest::ResultCallback, base::Unretained(this)), | |
| 175 &cancelable_task_tracker_); | |
| 176 base::RunLoop().RunUntilIdle(); | |
| 177 EXPECT_TRUE(is_callback_invoked_); | |
| 178 } | |
| 179 | |
| 180 TEST_F(LargeIconServiceTest, ScaleUp) { | |
| 181 InjectMockResult(GURL(kDummyUrl), CreateTestBitmapResult(16, 16, kTestColor)); | |
| 182 expected_bitmap_ = CreateTestBitmapResult(24, 24, kTestColor); | |
| 183 large_icon_service_.GetLargeIconOrFallbackStyle( | |
| 184 GURL(kDummyUrl), | |
| 185 14, // Lowered requirement so stored bitmap is admitted. | |
| 186 24, | |
| 187 base::Bind(&LargeIconServiceTest::ResultCallback, base::Unretained(this)), | |
| 188 &cancelable_task_tracker_); | |
| 189 base::RunLoop().RunUntilIdle(); | |
| 190 EXPECT_TRUE(is_callback_invoked_); | |
| 191 } | |
| 192 | |
| 193 // |desired_size_in_pixel| == 0 means retrieve original image without scaling. | |
| 194 TEST_F(LargeIconServiceTest, NoScale) { | |
| 195 InjectMockResult(GURL(kDummyUrl), CreateTestBitmapResult(24, 24, kTestColor)); | |
| 196 expected_bitmap_ = CreateTestBitmapResult(24, 24, kTestColor); | |
| 197 large_icon_service_.GetLargeIconOrFallbackStyle( | |
| 198 GURL(kDummyUrl), 16, 0, | |
| 199 base::Bind(&LargeIconServiceTest::ResultCallback, base::Unretained(this)), | |
| 200 &cancelable_task_tracker_); | |
| 201 base::RunLoop().RunUntilIdle(); | |
| 202 EXPECT_TRUE(is_callback_invoked_); | |
| 203 } | |
| 204 | |
| 205 TEST_F(LargeIconServiceTest, FallbackSinceIconTooSmall) { | |
| 206 InjectMockResult(GURL(kDummyUrl), CreateTestBitmapResult(16, 16, kTestColor)); | |
| 207 expected_fallback_icon_style_.reset(new favicon_base::FallbackIconStyle); | |
| 208 expected_fallback_icon_style_->background_color = kTestColor; | |
| 209 expected_fallback_icon_style_->is_default_background_color = false; | |
| 210 large_icon_service_.GetLargeIconOrFallbackStyle( | |
| 211 GURL(kDummyUrl), 24, 24, | |
| 212 base::Bind(&LargeIconServiceTest::ResultCallback, base::Unretained(this)), | |
| 213 &cancelable_task_tracker_); | |
| 214 base::RunLoop().RunUntilIdle(); | |
| 215 EXPECT_TRUE(is_callback_invoked_); | |
| 216 } | |
| 217 | |
| 218 TEST_F(LargeIconServiceTest, FallbackSinceIconNotSquare) { | |
| 219 InjectMockResult(GURL(kDummyUrl), CreateTestBitmapResult(24, 32, kTestColor)); | |
| 220 expected_fallback_icon_style_.reset(new favicon_base::FallbackIconStyle); | |
| 221 expected_fallback_icon_style_->background_color = kTestColor; | |
| 222 expected_fallback_icon_style_->is_default_background_color = false; | |
| 223 large_icon_service_.GetLargeIconOrFallbackStyle( | |
| 224 GURL(kDummyUrl), 24, 24, | |
| 225 base::Bind(&LargeIconServiceTest::ResultCallback, base::Unretained(this)), | |
| 226 &cancelable_task_tracker_); | |
| 227 base::RunLoop().RunUntilIdle(); | |
| 228 EXPECT_TRUE(is_callback_invoked_); | |
| 229 } | |
| 230 | |
| 231 TEST_F(LargeIconServiceTest, FallbackSinceIconMissing) { | |
| 232 InjectMockResult(GURL(kDummyUrl), favicon_base::FaviconRawBitmapResult()); | |
| 233 // Expect default fallback style, including background. | |
| 234 expected_fallback_icon_style_.reset(new favicon_base::FallbackIconStyle); | |
| 235 large_icon_service_.GetLargeIconOrFallbackStyle( | |
| 236 GURL(kDummyUrl), 24, 24, | |
| 237 base::Bind(&LargeIconServiceTest::ResultCallback, base::Unretained(this)), | |
| 238 &cancelable_task_tracker_); | |
| 239 base::RunLoop().RunUntilIdle(); | |
| 240 EXPECT_TRUE(is_callback_invoked_); | |
| 241 } | |
| 242 | |
| 243 TEST_F(LargeIconServiceTest, FallbackSinceIconMissingNoScale) { | |
| 244 InjectMockResult(GURL(kDummyUrl), favicon_base::FaviconRawBitmapResult()); | |
| 245 // Expect default fallback style, including background. | |
| 246 expected_fallback_icon_style_.reset(new favicon_base::FallbackIconStyle); | |
| 247 large_icon_service_.GetLargeIconOrFallbackStyle( | |
| 248 GURL(kDummyUrl), 24, 0, | |
| 249 base::Bind(&LargeIconServiceTest::ResultCallback, base::Unretained(this)), | |
| 250 &cancelable_task_tracker_); | |
| 251 base::RunLoop().RunUntilIdle(); | |
| 252 EXPECT_TRUE(is_callback_invoked_); | |
| 253 } | |
| 254 | |
| 255 // Oddball case where we demand a high resolution icon to scale down. Generates | |
| 256 // fallback even though an icon with the final size is available. | |
| 257 TEST_F(LargeIconServiceTest, FallbackSinceTooPicky) { | |
| 258 InjectMockResult(GURL(kDummyUrl), CreateTestBitmapResult(24, 24, kTestColor)); | |
| 259 expected_fallback_icon_style_.reset(new favicon_base::FallbackIconStyle); | |
| 260 expected_fallback_icon_style_->background_color = kTestColor; | |
| 261 expected_fallback_icon_style_->is_default_background_color = false; | |
| 262 large_icon_service_.GetLargeIconOrFallbackStyle( | |
| 263 GURL(kDummyUrl), 32, 24, | |
| 264 base::Bind(&LargeIconServiceTest::ResultCallback, base::Unretained(this)), | |
| 265 &cancelable_task_tracker_); | |
| 266 base::RunLoop().RunUntilIdle(); | |
| 267 EXPECT_TRUE(is_callback_invoked_); | |
| 268 } | |
| 269 | |
| 270 TEST_F(LargeIconServiceTest, ShouldGetFromGoogleServer) { | 122 TEST_F(LargeIconServiceTest, ShouldGetFromGoogleServer) { |
| 271 const GURL kExpectedServerUrl( | 123 const GURL kExpectedServerUrl( |
| 272 "https://t0.gstatic.com/faviconV2?user=chrome&drop_404_icon=true" | 124 "https://t0.gstatic.com/faviconV2?user=chrome&drop_404_icon=true" |
| 273 "&size=192&min_size=42&max_size=256&fallback_opts=TYPE" | 125 "&size=192&min_size=42&max_size=256&fallback_opts=TYPE" |
| 274 "&url=http://www.example.com/"); | 126 "&url=http://www.example.com/"); |
| 275 | 127 |
| 276 EXPECT_CALL(mock_favicon_service_, UnableToDownloadFavicon(_)).Times(0); | 128 EXPECT_CALL(mock_favicon_service_, UnableToDownloadFavicon(_)).Times(0); |
| 277 | 129 |
| 278 base::MockCallback<base::Callback<void(bool success)>> callback; | 130 base::MockCallback<base::Callback<void(bool success)>> callback; |
| 279 EXPECT_CALL(*mock_image_fetcher_, | 131 EXPECT_CALL(*mock_image_fetcher_, |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 373 | 225 |
| 374 base::MockCallback<base::Callback<void(bool success)>> callback; | 226 base::MockCallback<base::Callback<void(bool success)>> callback; |
| 375 large_icon_service_ | 227 large_icon_service_ |
| 376 .GetLargeIconOrFallbackStyleFromGoogleServerSkippingLocalCache( | 228 .GetLargeIconOrFallbackStyleFromGoogleServerSkippingLocalCache( |
| 377 GURL(kDummyUrl), /*min_source_size_in_pixel=*/42, callback.Get()); | 229 GURL(kDummyUrl), /*min_source_size_in_pixel=*/42, callback.Get()); |
| 378 | 230 |
| 379 EXPECT_CALL(callback, Run(false)); | 231 EXPECT_CALL(callback, Run(false)); |
| 380 base::RunLoop().RunUntilIdle(); | 232 base::RunLoop().RunUntilIdle(); |
| 381 } | 233 } |
| 382 | 234 |
| 235 class LargeIconServiceGetterTest : public LargeIconServiceTest, | |
| 236 public ::testing::WithParamInterface<bool> { | |
| 237 public: | |
| 238 LargeIconServiceGetterTest() | |
| 239 : LargeIconServiceTest(), is_callback_invoked_(false) {} | |
| 240 ~LargeIconServiceGetterTest() override {} | |
| 241 | |
| 242 void GetLargeIconOrFallbackStyleAndWaitForCallback( | |
| 243 const GURL& page_url, | |
| 244 int min_source_size_in_pixel, | |
| 245 int desired_size_in_pixel, | |
| 246 bool get_raw_bitmap) { | |
|
pkotwicz
2017/04/04 12:43:43
- Maybe pass in |expected_bitmap| and |expected_bi
jkrcal
2017/04/04 14:44:40
As regards the first point:
I want to have some e
pkotwicz
2017/04/04 17:47:15
I like your new version too!
jkrcal
2017/04/05 15:34:38
Acknowledged.
| |
| 247 if (get_raw_bitmap) { | |
| 248 large_icon_service_.GetLargeIconOrFallbackStyle( | |
| 249 page_url, min_source_size_in_pixel, desired_size_in_pixel, | |
| 250 base::Bind(&LargeIconServiceGetterTest::RawBitmapResultCallback, | |
| 251 base::Unretained(this)), | |
| 252 &cancelable_task_tracker_); | |
| 253 } else { | |
| 254 large_icon_service_.GetLargeIconImageOrFallbackStyle( | |
| 255 page_url, min_source_size_in_pixel, desired_size_in_pixel, | |
| 256 base::Bind(&LargeIconServiceGetterTest::ImageResultCallback, | |
| 257 base::Unretained(this)), | |
| 258 &cancelable_task_tracker_); | |
| 259 } | |
| 260 base::RunLoop().RunUntilIdle(); | |
|
pkotwicz
2017/04/04 12:43:43
Nit: Make this base::RunLoop().Run() instead and m
jkrcal
2017/04/04 14:44:40
I got rid of the |is_callback_invoked| without thi
pkotwicz
2017/04/04 17:47:15
Cool: looks like using the QuitClosure is unnecess
jkrcal
2017/04/05 15:34:38
Acknowledged.
| |
| 261 } | |
| 262 | |
| 263 void RawBitmapResultCallback(const favicon_base::LargeIconResult& result) { | |
| 264 is_callback_invoked_ = true; | |
| 265 | |
| 266 // Checking presence and absence of results. | |
| 267 EXPECT_EQ(expected_bitmap_.is_valid(), result.bitmap.is_valid()); | |
| 268 EXPECT_EQ(expected_fallback_icon_style_ != nullptr, | |
| 269 result.fallback_icon_style != nullptr); | |
| 270 | |
| 271 if (expected_bitmap_.is_valid()) { | |
| 272 EXPECT_EQ(expected_bitmap_.pixel_size, result.bitmap.pixel_size); | |
| 273 // Not actually checking bitmap content. | |
| 274 } | |
| 275 if (expected_fallback_icon_style_.get()) { | |
| 276 EXPECT_EQ(*expected_fallback_icon_style_, *result.fallback_icon_style); | |
| 277 } | |
| 278 } | |
| 279 | |
| 280 void ImageResultCallback(const favicon_base::LargeIconImageResult& result) { | |
| 281 is_callback_invoked_ = true; | |
| 282 | |
| 283 // Checking presence and absence of results. | |
| 284 EXPECT_EQ(expected_bitmap_.is_valid(), !result.image.IsEmpty()); | |
| 285 EXPECT_EQ(expected_fallback_icon_style_ != nullptr, | |
| 286 result.fallback_icon_style != nullptr); | |
| 287 | |
| 288 if (expected_bitmap_.is_valid()) { | |
| 289 EXPECT_EQ(expected_bitmap_.pixel_size, | |
| 290 result.image.ToImageSkia()->size()); | |
| 291 // Not actually checking bitmap content. | |
| 292 } | |
| 293 if (expected_fallback_icon_style_.get()) { | |
| 294 EXPECT_EQ(*expected_fallback_icon_style_, *result.fallback_icon_style); | |
| 295 } | |
|
pkotwicz
2017/04/04 12:43:43
Nit: Can you extract the common functionality of R
jkrcal
2017/04/04 14:44:40
I extracted a common part of that.
| |
| 296 } | |
| 297 | |
| 298 void InjectMockResult( | |
| 299 const GURL& page_url, | |
| 300 const favicon_base::FaviconRawBitmapResult& mock_result) { | |
| 301 EXPECT_CALL(mock_favicon_service_, | |
|
pkotwicz
2017/04/04 12:43:43
Can this be ON_CALL() and WillByDefault() instead?
jkrcal
2017/04/04 14:44:40
Done.
| |
| 302 GetLargestRawFaviconForPageURL(page_url, _, _, _, _)) | |
| 303 .WillOnce(PostReply<5>(mock_result)); | |
| 304 } | |
| 305 | |
| 306 protected: | |
| 307 base::CancelableTaskTracker cancelable_task_tracker_; | |
| 308 favicon_base::FaviconRawBitmapResult expected_bitmap_; | |
| 309 std::unique_ptr<favicon_base::FallbackIconStyle> | |
| 310 expected_fallback_icon_style_; | |
| 311 | |
| 312 bool is_callback_invoked_; | |
| 313 | |
| 314 private: | |
| 315 DISALLOW_COPY_AND_ASSIGN(LargeIconServiceGetterTest); | |
| 316 }; | |
| 317 | |
| 318 TEST_P(LargeIconServiceGetterTest, SameSize) { | |
| 319 InjectMockResult(GURL(kDummyUrl), CreateTestBitmapResult(24, 24, kTestColor)); | |
| 320 expected_bitmap_ = CreateTestBitmapResult(24, 24, kTestColor); | |
| 321 GetLargeIconOrFallbackStyleAndWaitForCallback( | |
| 322 GURL(kDummyUrl), | |
| 323 24, // |min_source_size_in_pixel| | |
| 324 24, // |desired_size_in_pixel| | |
| 325 GetParam()); | |
| 326 EXPECT_TRUE(is_callback_invoked_); | |
| 327 } | |
| 328 | |
| 329 TEST_P(LargeIconServiceGetterTest, ScaleDown) { | |
| 330 InjectMockResult(GURL(kDummyUrl), CreateTestBitmapResult(32, 32, kTestColor)); | |
| 331 expected_bitmap_ = CreateTestBitmapResult(24, 24, kTestColor); | |
| 332 GetLargeIconOrFallbackStyleAndWaitForCallback(GURL(kDummyUrl), 24, 24, | |
| 333 GetParam()); | |
| 334 EXPECT_TRUE(is_callback_invoked_); | |
| 335 } | |
| 336 | |
| 337 TEST_P(LargeIconServiceGetterTest, ScaleUp) { | |
| 338 InjectMockResult(GURL(kDummyUrl), CreateTestBitmapResult(16, 16, kTestColor)); | |
| 339 expected_bitmap_ = CreateTestBitmapResult(24, 24, kTestColor); | |
| 340 GetLargeIconOrFallbackStyleAndWaitForCallback( | |
| 341 GURL(kDummyUrl), | |
| 342 14, // Lowered requirement so stored bitmap is admitted. | |
| 343 24, GetParam()); | |
| 344 EXPECT_TRUE(is_callback_invoked_); | |
| 345 } | |
| 346 | |
| 347 // |desired_size_in_pixel| == 0 means retrieve original image without scaling. | |
| 348 TEST_P(LargeIconServiceGetterTest, NoScale) { | |
| 349 InjectMockResult(GURL(kDummyUrl), CreateTestBitmapResult(24, 24, kTestColor)); | |
| 350 expected_bitmap_ = CreateTestBitmapResult(24, 24, kTestColor); | |
| 351 GetLargeIconOrFallbackStyleAndWaitForCallback(GURL(kDummyUrl), 16, 0, | |
| 352 GetParam()); | |
| 353 EXPECT_TRUE(is_callback_invoked_); | |
| 354 } | |
| 355 | |
| 356 TEST_P(LargeIconServiceGetterTest, FallbackSinceIconTooSmall) { | |
| 357 InjectMockResult(GURL(kDummyUrl), CreateTestBitmapResult(16, 16, kTestColor)); | |
| 358 expected_fallback_icon_style_.reset(new favicon_base::FallbackIconStyle); | |
| 359 expected_fallback_icon_style_->background_color = kTestColor; | |
| 360 expected_fallback_icon_style_->is_default_background_color = false; | |
| 361 GetLargeIconOrFallbackStyleAndWaitForCallback(GURL(kDummyUrl), 24, 24, | |
| 362 GetParam()); | |
| 363 EXPECT_TRUE(is_callback_invoked_); | |
| 364 } | |
| 365 | |
| 366 TEST_P(LargeIconServiceGetterTest, FallbackSinceIconNotSquare) { | |
| 367 InjectMockResult(GURL(kDummyUrl), CreateTestBitmapResult(24, 32, kTestColor)); | |
| 368 expected_fallback_icon_style_.reset(new favicon_base::FallbackIconStyle); | |
| 369 expected_fallback_icon_style_->background_color = kTestColor; | |
| 370 expected_fallback_icon_style_->is_default_background_color = false; | |
| 371 GetLargeIconOrFallbackStyleAndWaitForCallback(GURL(kDummyUrl), 24, 24, | |
| 372 GetParam()); | |
| 373 EXPECT_TRUE(is_callback_invoked_); | |
| 374 } | |
| 375 | |
| 376 TEST_P(LargeIconServiceGetterTest, FallbackSinceIconMissing) { | |
| 377 InjectMockResult(GURL(kDummyUrl), favicon_base::FaviconRawBitmapResult()); | |
| 378 // Expect default fallback style, including background. | |
| 379 expected_fallback_icon_style_.reset(new favicon_base::FallbackIconStyle); | |
| 380 GetLargeIconOrFallbackStyleAndWaitForCallback(GURL(kDummyUrl), 24, 24, | |
| 381 GetParam()); | |
| 382 EXPECT_TRUE(is_callback_invoked_); | |
| 383 } | |
| 384 | |
| 385 TEST_P(LargeIconServiceGetterTest, FallbackSinceIconMissingNoScale) { | |
| 386 InjectMockResult(GURL(kDummyUrl), favicon_base::FaviconRawBitmapResult()); | |
| 387 // Expect default fallback style, including background. | |
| 388 expected_fallback_icon_style_.reset(new favicon_base::FallbackIconStyle); | |
| 389 GetLargeIconOrFallbackStyleAndWaitForCallback(GURL(kDummyUrl), 24, 0, | |
| 390 GetParam()); | |
| 391 EXPECT_TRUE(is_callback_invoked_); | |
| 392 } | |
| 393 | |
| 394 // Oddball case where we demand a high resolution icon to scale down. Generates | |
| 395 // fallback even though an icon with the final size is available. | |
| 396 TEST_P(LargeIconServiceGetterTest, FallbackSinceTooPicky) { | |
| 397 InjectMockResult(GURL(kDummyUrl), CreateTestBitmapResult(24, 24, kTestColor)); | |
| 398 expected_fallback_icon_style_.reset(new favicon_base::FallbackIconStyle); | |
| 399 expected_fallback_icon_style_->background_color = kTestColor; | |
| 400 expected_fallback_icon_style_->is_default_background_color = false; | |
| 401 GetLargeIconOrFallbackStyleAndWaitForCallback(GURL(kDummyUrl), 32, 24, | |
| 402 GetParam()); | |
| 403 EXPECT_TRUE(is_callback_invoked_); | |
| 404 } | |
| 405 | |
| 406 // Every test will appear with suffix /0 (param false) and /1 (param true), e.g. | |
| 407 // LargeIconServiceGetterTest.FallbackSinceTooPicky/0: get image. | |
| 408 // LargeIconServiceGetterTest.FallbackSinceTooPicky/1: get raw bitmap. | |
| 409 INSTANTIATE_TEST_CASE_P(, // Empty instatiation name. | |
| 410 LargeIconServiceGetterTest, | |
| 411 ::testing::Values(false, true)); | |
| 412 | |
| 383 } // namespace | 413 } // namespace |
| 384 } // namespace favicon | 414 } // namespace favicon |
| OLD | NEW |