| Index: chrome/browser/manifest/manifest_icon_downloader.cc
|
| diff --git a/chrome/browser/manifest/manifest_icon_downloader.cc b/chrome/browser/manifest/manifest_icon_downloader.cc
|
| deleted file mode 100644
|
| index 50714c7af14041b2fe1da0525e3313f4a8c5fc85..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/manifest/manifest_icon_downloader.cc
|
| +++ /dev/null
|
| @@ -1,189 +0,0 @@
|
| -// 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.
|
| -
|
| -#include "chrome/browser/manifest/manifest_icon_downloader.h"
|
| -
|
| -#include <stddef.h>
|
| -
|
| -#include <limits>
|
| -
|
| -#include "chrome/browser/manifest/manifest_icon_selector.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "content/public/browser/render_frame_host.h"
|
| -#include "content/public/browser/web_contents.h"
|
| -#include "content/public/browser/web_contents_observer.h"
|
| -#include "content/public/common/console_message_level.h"
|
| -#include "skia/ext/image_operations.h"
|
| -
|
| -// DevToolsConsoleHelper is a class that holds a WebContents in order to be able
|
| -// to send a message to the WebContents' main frame. It is used so
|
| -// ManifestIconDownloader and the callers do not have to worry about
|
| -// |web_contents| lifetime. If the |web_contents| is invalidated before the
|
| -// message can be sent, the message will simply be ignored.
|
| -class ManifestIconDownloader::DevToolsConsoleHelper
|
| - : public content::WebContentsObserver {
|
| - public:
|
| - explicit DevToolsConsoleHelper(content::WebContents* web_contents);
|
| - ~DevToolsConsoleHelper() override = default;
|
| -
|
| - void AddMessage(content::ConsoleMessageLevel level,
|
| - const std::string& message);
|
| -};
|
| -
|
| -ManifestIconDownloader::DevToolsConsoleHelper::DevToolsConsoleHelper(
|
| - content::WebContents* web_contents)
|
| - : WebContentsObserver(web_contents) {
|
| -}
|
| -
|
| -void ManifestIconDownloader::DevToolsConsoleHelper::AddMessage(
|
| - content::ConsoleMessageLevel level,
|
| - const std::string& message) {
|
| - if (!web_contents())
|
| - return;
|
| - web_contents()->GetMainFrame()->AddMessageToConsole(level, message);
|
| -}
|
| -
|
| -bool ManifestIconDownloader::Download(
|
| - content::WebContents* web_contents,
|
| - const GURL& icon_url,
|
| - int ideal_icon_size_in_px,
|
| - int minimum_icon_size_in_px,
|
| - const ManifestIconDownloader::IconFetchCallback& callback) {
|
| - DCHECK(minimum_icon_size_in_px <= ideal_icon_size_in_px);
|
| - if (!web_contents || !icon_url.is_valid())
|
| - return false;
|
| -
|
| - web_contents->DownloadImage(
|
| - icon_url,
|
| - false, // is_favicon
|
| - 0, // max_bitmap_size - 0 means no maximum size.
|
| - false, // bypass_cache
|
| - base::Bind(&ManifestIconDownloader::OnIconFetched,
|
| - ideal_icon_size_in_px,
|
| - minimum_icon_size_in_px,
|
| - base::Owned(new DevToolsConsoleHelper(web_contents)),
|
| - callback));
|
| - return true;
|
| -}
|
| -
|
| -void ManifestIconDownloader::OnIconFetched(
|
| - int ideal_icon_size_in_px,
|
| - int minimum_icon_size_in_px,
|
| - DevToolsConsoleHelper* console_helper,
|
| - const ManifestIconDownloader::IconFetchCallback& callback,
|
| - int id,
|
| - int http_status_code,
|
| - const GURL& url,
|
| - const std::vector<SkBitmap>& bitmaps,
|
| - const std::vector<gfx::Size>& sizes) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| -
|
| - if (bitmaps.empty()) {
|
| - console_helper->AddMessage(
|
| - content::CONSOLE_MESSAGE_LEVEL_ERROR,
|
| - "Error while trying to use the following icon from the Manifest: "
|
| - + url.spec() + " (Download error or resource isn't a valid image)");
|
| -
|
| - callback.Run(SkBitmap());
|
| - return;
|
| - }
|
| -
|
| - const int closest_index = FindClosestBitmapIndex(
|
| - ideal_icon_size_in_px, minimum_icon_size_in_px, bitmaps);
|
| -
|
| - if (closest_index == -1) {
|
| - console_helper->AddMessage(
|
| - content::CONSOLE_MESSAGE_LEVEL_ERROR,
|
| - "Error while trying to use the following icon from the Manifest: "
|
| - + url.spec()
|
| - + " (Resource size is not correct - typo in the Manifest?)");
|
| -
|
| - callback.Run(SkBitmap());
|
| - return;
|
| - }
|
| -
|
| - const SkBitmap& chosen = bitmaps[closest_index];
|
| -
|
| - // Only scale if we need to scale down. For scaling up we will let the system
|
| - // handle that when it is required to display it. This saves space in the
|
| - // webapp storage system as well.
|
| - if (chosen.height() > ideal_icon_size_in_px ||
|
| - chosen.width() > ideal_icon_size_in_px) {
|
| - content::BrowserThread::PostTask(
|
| - content::BrowserThread::IO, FROM_HERE,
|
| - base::BindOnce(&ManifestIconDownloader::ScaleIcon,
|
| - ideal_icon_size_in_px, chosen, callback));
|
| - return;
|
| - }
|
| -
|
| - callback.Run(chosen);
|
| -}
|
| -
|
| -void ManifestIconDownloader::ScaleIcon(
|
| - int ideal_icon_size_in_px,
|
| - const SkBitmap& bitmap,
|
| - const ManifestIconDownloader::IconFetchCallback& callback) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| -
|
| - const SkBitmap& scaled = skia::ImageOperations::Resize(
|
| - bitmap,
|
| - skia::ImageOperations::RESIZE_BEST,
|
| - ideal_icon_size_in_px,
|
| - ideal_icon_size_in_px);
|
| -
|
| - content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
|
| - base::BindOnce(callback, scaled));
|
| -}
|
| -
|
| -int ManifestIconDownloader::FindClosestBitmapIndex(
|
| - int ideal_icon_size_in_px,
|
| - int minimum_icon_size_in_px,
|
| - const std::vector<SkBitmap>& bitmaps) {
|
| - int best_index = -1;
|
| - int best_delta = std::numeric_limits<int>::min();
|
| - const int max_negative_delta =
|
| - minimum_icon_size_in_px - ideal_icon_size_in_px;
|
| -
|
| - for (size_t i = 0; i < bitmaps.size(); ++i) {
|
| - if (bitmaps[i].height() != bitmaps[i].width())
|
| - continue;
|
| -
|
| - int delta = bitmaps[i].width() - ideal_icon_size_in_px;
|
| - if (delta == 0)
|
| - return i;
|
| -
|
| - if (best_delta > 0 && delta < 0)
|
| - continue;
|
| -
|
| - if ((best_delta > 0 && delta < best_delta) ||
|
| - (best_delta < 0 && delta > best_delta && delta >= max_negative_delta)) {
|
| - best_index = i;
|
| - best_delta = delta;
|
| - }
|
| - }
|
| -
|
| - if (best_index != -1)
|
| - return best_index;
|
| -
|
| - // There was no square icon of a correct size found. Try to find the most
|
| - // square-like icon which has both dimensions greater than the minimum size.
|
| - float best_ratio_difference = std::numeric_limits<float>::infinity();
|
| - for (size_t i = 0; i < bitmaps.size(); ++i) {
|
| - if (bitmaps[i].height() < minimum_icon_size_in_px ||
|
| - bitmaps[i].width() < minimum_icon_size_in_px) {
|
| - continue;
|
| - }
|
| -
|
| - float height = static_cast<float>(bitmaps[i].height());
|
| - float width = static_cast<float>(bitmaps[i].width());
|
| - float ratio = height / width;
|
| - float ratio_difference = fabs(ratio - 1);
|
| - if (ratio_difference < best_ratio_difference) {
|
| - best_index = i;
|
| - best_ratio_difference = ratio_difference;
|
| - }
|
| - }
|
| -
|
| - return best_index;
|
| -}
|
|
|