1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_FAVICON_CORE_LARGE_ICON_WORKER_H_
#define COMPONENTS_FAVICON_CORE_LARGE_ICON_WORKER_H_
#include <memory>
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/task/cancelable_task_tracker.h"
#include "components/favicon/core/large_icon_service.h"
#include "components/favicon_base/favicon_callback.h"
#include "components/favicon_base/favicon_types.h"
#include "third_party/skia/include/core/SkBitmap.h"
namespace favicon {
class FaviconService;
// Processes the png data returned from the FaviconService as part of a
// LargeIconService request (resizing and decoding from PNG format).
class LargeIconWorker : public base::RefCountedThreadSafe<LargeIconWorker> {
public:
// Exactly one of the callbacks is expected to be non-null.
LargeIconWorker(
int min_source_size_in_pixel,
int size_in_pixel_to_resize_to,
LargeIconService::NoBigEnoughIconBehavior no_big_enough_icon_behavior,
favicon_base::LargeIconCallback raw_bitmap_callback,
favicon_base::LargeIconImageCallback image_callback,
base::CancelableTaskTracker* tracker);
LargeIconWorker(const LargeIconWorker& worker) = delete;
LargeIconWorker& operator=(const LargeIconWorker& worker) = delete;
// 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& db_result);
static base::CancelableTaskTracker::TaskId GetLargeIconRawBitmap(
FaviconService* favicon_service,
const GURL& page_url,
int min_source_size_in_pixel,
int size_in_pixel_to_resize_to,
LargeIconService::NoBigEnoughIconBehavior no_big_enough_icon_behavior,
favicon_base::LargeIconCallback raw_bitmap_callback,
favicon_base::LargeIconImageCallback image_callback,
base::CancelableTaskTracker* tracker);
private:
friend class base::RefCountedThreadSafe<LargeIconWorker>;
~LargeIconWorker();
// Resizes `db_result` and writes the result of the resizing into
// `raw_bitmap_result_` or `bitmap_result_` based on which of
// `raw_bitmap_callback_` and `image_callback_` is set.
void ResizeAndEncodeOnBackgroundThread(
const favicon_base::FaviconRawBitmapResult& db_result);
// Computes the dominant color of `favicon_bytes` on a background thread.
void ComputeDominantColorOnBackgroundThread(
scoped_refptr<base::RefCountedMemory> favicon_bytes);
// Must run on the owner (UI) thread in production.
// Invoked when ProcessIconOnBackgroundThread() is done.
void OnIconProcessingComplete();
int min_source_size_in_pixel_;
int size_in_pixel_to_resize_to_;
LargeIconService::NoBigEnoughIconBehavior no_big_enough_icon_behavior_;
favicon_base::LargeIconCallback raw_bitmap_callback_;
favicon_base::LargeIconImageCallback image_callback_;
scoped_refptr<base::TaskRunner> background_task_runner_;
raw_ptr<base::CancelableTaskTracker, DanglingUntriaged> tracker_;
favicon_base::FaviconRawBitmapResult raw_bitmap_result_;
SkBitmap bitmap_result_;
GURL icon_url_;
std::unique_ptr<favicon_base::FallbackIconStyle> fallback_icon_style_;
int favicon_width_according_to_database_ = 0;
};
} // namespace favicon
#endif // COMPONENTS_FAVICON_CORE_LARGE_ICON_WORKER_H_
|