blob: af9b7c00ad5956bfc75a110dba582dbd0f11d3ef [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.
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_BACKGROUND_FETCH_BACKGROUND_FETCH_ICON_LOADER_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_BACKGROUND_FETCH_BACKGROUND_FETCH_ICON_LOADER_H_
#include "third_party/blink/renderer/bindings/modules/v8/v8_image_resource.h"
#include "third_party/blink/renderer/core/loader/threaded_icon_loader.h"
#include "third_party/blink/renderer/modules/background_fetch/background_fetch_type_converters.h"
#include "third_party/blink/renderer/modules/modules_export.h"
namespace blink {
class BackgroundFetchBridge;
class MODULES_EXPORT BackgroundFetchIconLoader final
: public GarbageCollected<BackgroundFetchIconLoader> {
public:
// The bitmap may be empty if the request failed or the image data could not
// be decoded. The int64_t returned is the scale of the ideal to chosen icon,
// before resizing. This is -1 if the ideal icon size is empty, or if no icon
// provided was suitable.
using IconCallback = base::OnceCallback<void(const SkBitmap&, int64_t)>;
BackgroundFetchIconLoader();
// Asynchronously download an icon from the given url, decodes the loaded
// data, and passes the bitmap to the given callback.
void Start(BackgroundFetchBridge* bridge,
ExecutionContext* execution_context,
HeapVector<Member<ManifestImageResource>> icons,
IconCallback icon_callback);
// Cancels the pending load, if there is one. The |icon_callback_| will not
// be run.
void Stop();
void Trace(Visitor* visitor) const;
private:
friend class BackgroundFetchIconLoaderTest;
// Callback for BackgroundFetchBridge::GetIconDisplaySize()
void DidGetIconDisplaySizeIfSoLoadIcon(
ExecutionContext* execution_context,
IconCallback callback,
const gfx::Size& icon_display_size_pixels);
void DidGetIcon(SkBitmap icon, double resize_scale);
// Picks the best icon from the list of developer provided icons, for current
// display, given the |ideal_size_pixels|, and returns its KURL.
// If none of the icons is appropriate, this returns an empty URL.
KURL PickBestIconForDisplay(ExecutionContext* execution_context,
int ideal_size_pixels);
HeapVector<Member<ManifestImageResource>> icons_;
Member<ThreadedIconLoader> threaded_icon_loader_;
IconCallback icon_callback_;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_BACKGROUND_FETCH_BACKGROUND_FETCH_ICON_LOADER_H_