Chromium Code Reviews| Index: components/favicon/core/large_icon_service.h |
| diff --git a/components/favicon/core/large_icon_service.h b/components/favicon/core/large_icon_service.h |
| index a214e2037a8438b3fbc0a6f9444412523a775458..830e5f88438be2099d9b4618fa0973032f47073f 100644 |
| --- a/components/favicon/core/large_icon_service.h |
| +++ b/components/favicon/core/large_icon_service.h |
| @@ -1,4 +1,4 @@ |
| -// Copyright (c) 2015 The Chromium Authors. All rights reserved. |
| +// Copyright 2015 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. |
| @@ -7,14 +7,17 @@ |
| #include <vector> |
| +#include "base/memory/ref_counted.h" |
| +#include "base/memory/scoped_ptr.h" |
| #include "base/task/cancelable_task_tracker.h" |
| #include "components/favicon_base/favicon_callback.h" |
| +#include "components/favicon_base/favicon_types.h" |
| #include "components/keyed_service/core/keyed_service.h" |
| class GURL; |
| -namespace favicon_base { |
| -struct FaviconRawBitmapResult; |
| +namespace base { |
| +class TaskRunner; |
| } |
| namespace favicon { |
| @@ -25,6 +28,61 @@ class FaviconService; |
| // the favicon service. |
| class LargeIconService : public KeyedService { |
| public: |
| + // Tracks the states of a request session for LargeIconService, and manages |
| + // the callback chain on different threads. |
| + class Session : public base::RefCountedThreadSafe<Session> { |
|
pkotwicz
2015/05/11 14:35:08
I wonder whether:
- This class can be called Large
huangs
2015/05/11 15:20:39
- Renamed to LargeIconWorker.
- Kept Session::OnIc
|
| + public: |
| + Session(int min_source_size_in_pixel, |
| + int desired_size_in_pixel, |
| + favicon_base::LargeIconCallback callback, |
| + scoped_refptr<base::TaskRunner> background_task_runner, |
| + base::CancelableTaskTracker* tracker); |
| + |
| + // Must run on the owner (UI) thread in production. |
| + // Intermediate callback for GetLargeIconOrFallbackStyle(). Invokes |
| + // ProcessIconOnBackgroundThread() so we do not perform complex image |
| + // operations on the UI thread. |
| + void OnIconLookupComplete( |
| + const favicon_base::FaviconRawBitmapResult& bitmap_result); |
| + |
| + private: |
| + friend class base::RefCountedThreadSafe<Session>; |
| + ~Session(); |
| + |
| + // Must run on a background thread in production. |
| + // Tries to resize |bitmap_result| and pass the output to |callback|. If |
| + // that does not work, computes the icon fallback style and uses it to |
| + // invoke |callback|. This must be run on a background thread because image |
| + // resizing and dominant color extraction can be expensive. |
| + void ProcessIconOnBackgroundThread(); |
| + |
| + // Must run on a background thread in production. |
| + // If |bitmap_result| is square and large enough (>= |min_source_in_pixel|), |
| + // resizes it to |desired_size_in_pixel| (but if |desired_size_in_pixel| is |
| + // 0 then don't resize). If successful, stores the resulting bitmap data |
| + // into |resized_bitmap_result| and returns true. |
| + static bool ResizeLargeIconOnBackgroundThreadIfValid( |
| + int min_source_size_in_pixel, |
| + int desired_size_in_pixel, |
| + const favicon_base::FaviconRawBitmapResult& bitmap_result, |
| + favicon_base::FaviconRawBitmapResult* resized_bitmap_result); |
| + |
| + // Must run on the owner (UI) thread in production. |
| + // Invoked when ProcessIconOnBackgroundThread() is done. |
| + void OnIconProcessingComplete(); |
| + |
| + int min_source_size_in_pixel_; |
| + int desired_size_in_pixel_; |
| + favicon_base::LargeIconCallback callback_; |
| + scoped_refptr<base::TaskRunner> background_task_runner_; |
| + scoped_refptr<base::TaskRunner> caller_task_runner_; |
| + base::CancelableTaskTracker* tracker_; |
| + favicon_base::FaviconRawBitmapResult bitmap_result_; |
| + scoped_ptr<favicon_base::LargeIconResult> result_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(Session); |
| + }; |
| + |
| explicit LargeIconService(FaviconService* favicon_service); |
| ~LargeIconService() override; |
| @@ -47,33 +105,18 @@ class LargeIconService : public KeyedService { |
| const favicon_base::LargeIconCallback& callback, |
| base::CancelableTaskTracker* tracker); |
| + // Returns TaskRunner used to execute background task. |
| + virtual scoped_refptr<base::TaskRunner> GetBackgroundTaskRunner(); |
| + |
| private: |
| // For testing. |
| friend class TestLargeIconService; |
| - // Resizes |bitmap_result| to |desired_size_in_pixel|x|desired_size_in_pixel|. |
| - // Stores the resized bitmap data in |resized_bitmap_result| and returns true |
| - // if successful. |
| - bool ResizeLargeIconIfValid( |
| - int min_source_size_in_pixel, |
| - int desired_size_in_pixel, |
| - const favicon_base::FaviconRawBitmapResult& bitmap_result, |
| - favicon_base::FaviconRawBitmapResult* resized_bitmap_result); |
| - |
| - // Intermediate callback for GetLargeIconOrFallbackStyle(). Tries to resize |
| - // |bitmap_result| and pass the output to |callback|. If that does not work, |
| - // computes the icon fallback style and uses it to invoke |callback|. |
| - void RunLargeIconCallback( |
| - const favicon_base::LargeIconCallback& callback, |
| - int min_source_size_in_pixel, |
| - int desired_size_in_pixel, |
| - const favicon_base::FaviconRawBitmapResult& bitmap_result); |
| - |
| FaviconService* favicon_service_; |
| - // A pre-populated list of the types of icon files to consider when looking |
| - // for large icons. This is an optimization over populating an icon type |
| - // vector on each request. |
| + // A pre-populated list of icon types to consider when looking for large |
| + // icons. This is an optimization over populating an icon type vector on each |
| + // request. |
| std::vector<int> large_icon_types_; |
| DISALLOW_COPY_AND_ASSIGN(LargeIconService); |