Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(133)

Unified Diff: chrome/browser/android/shortcut_helper.cc

Issue 880203004: Break out manifest icon logic from ShortcutHelper (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Changing unittest Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/android/shortcut_helper.h ('k') | chrome/browser/android/shortcut_helper_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/android/shortcut_helper.cc
diff --git a/chrome/browser/android/shortcut_helper.cc b/chrome/browser/android/shortcut_helper.cc
index 7661e84af3c0d67d85d17adc35c01436cb7c553e..d8f5eae3d43c4ad4c3ffd7e16a00e3ff657bece6 100644
--- a/chrome/browser/android/shortcut_helper.cc
+++ b/chrome/browser/android/shortcut_helper.cc
@@ -15,6 +15,7 @@
#include "base/strings/utf_string_conversions.h"
#include "base/task/cancelable_task_tracker.h"
#include "base/threading/worker_pool.h"
+#include "chrome/browser/android/manifest_icon_selector.h"
#include "chrome/browser/android/tab_android.h"
#include "chrome/browser/favicon/favicon_service.h"
#include "chrome/browser/favicon/favicon_service_factory.h"
@@ -115,124 +116,6 @@ void ShortcutHelper::OnDidGetWebApplicationInfo(
weak_ptr_factory_.GetWeakPtr()));
}
-bool ShortcutHelper::IconSizesContainsPreferredSize(
- const std::vector<gfx::Size>& sizes) const {
- for (size_t i = 0; i < sizes.size(); ++i) {
- if (sizes[i].height() != sizes[i].width())
- continue;
- if (sizes[i].width() == preferred_icon_size_in_px_)
- return true;
- }
-
- return false;
-}
-
-bool ShortcutHelper::IconSizesContainsAny(
- const std::vector<gfx::Size>& sizes) const {
- for (size_t i = 0; i < sizes.size(); ++i) {
- if (sizes[i].IsEmpty())
- return true;
- }
-
- return false;
-}
-
-GURL ShortcutHelper::FindBestMatchingIcon(
- const std::vector<Manifest::Icon>& icons, float density) const {
- GURL url;
- int best_delta = std::numeric_limits<int>::min();
-
- for (size_t i = 0; i < icons.size(); ++i) {
- if (icons[i].density != density)
- continue;
-
- const std::vector<gfx::Size>& sizes = icons[i].sizes;
- for (size_t j = 0; j < sizes.size(); ++j) {
- if (sizes[j].height() != sizes[j].width())
- continue;
- int delta = sizes[j].width() - preferred_icon_size_in_px_;
- if (delta == 0)
- return icons[i].src;
- if (best_delta > 0 && delta < 0)
- continue;
- if ((best_delta > 0 && delta < best_delta) ||
- (best_delta < 0 && delta > best_delta)) {
- url = icons[i].src;
- best_delta = delta;
- }
- }
- }
-
- return url;
-}
-
-// static
-std::vector<Manifest::Icon> ShortcutHelper::FilterIconsByType(
- const std::vector<Manifest::Icon>& icons) {
- std::vector<Manifest::Icon> result;
-
- for (size_t i = 0; i < icons.size(); ++i) {
- if (icons[i].type.is_null() ||
- net::IsSupportedImageMimeType(
- base::UTF16ToUTF8(icons[i].type.string()))) {
- result.push_back(icons[i]);
- }
- }
-
- return result;
-}
-
-GURL ShortcutHelper::FindBestMatchingIcon(
- const std::vector<Manifest::Icon>& unfiltered_icons) const {
- const float device_scale_factor =
- gfx::Screen::GetScreenFor(web_contents()->GetNativeView())->
- GetPrimaryDisplay().device_scale_factor();
-
- GURL url;
- std::vector<Manifest::Icon> icons = FilterIconsByType(unfiltered_icons);
-
- // The first pass is to find the ideal icon. That icon is of the right size
- // with the default density or the device's density.
- for (size_t i = 0; i < icons.size(); ++i) {
- if (icons[i].density == device_scale_factor &&
- IconSizesContainsPreferredSize(icons[i].sizes)) {
- return icons[i].src;
- }
-
- // If there is an icon with the right size but not the right density, keep
- // it on the side and only use it if nothing better is found.
- if (icons[i].density == Manifest::Icon::kDefaultDensity &&
- IconSizesContainsPreferredSize(icons[i].sizes)) {
- url = icons[i].src;
- }
- }
-
- // The second pass is to find an icon with 'any'. The current device scale
- // factor is preferred. Otherwise, the default scale factor is used.
- for (size_t i = 0; i < icons.size(); ++i) {
- if (icons[i].density == device_scale_factor &&
- IconSizesContainsAny(icons[i].sizes)) {
- return icons[i].src;
- }
-
- // If there is an icon with 'any' but not the right density, keep it on the
- // side and only use it if nothing better is found.
- if (icons[i].density == Manifest::Icon::kDefaultDensity &&
- IconSizesContainsAny(icons[i].sizes)) {
- url = icons[i].src;
- }
- }
-
- // The last pass will try to find the best suitable icon for the device's
- // scale factor. If none, another pass will be run using kDefaultDensity.
- if (!url.is_valid())
- url = FindBestMatchingIcon(icons, device_scale_factor);
- if (!url.is_valid())
- url = FindBestMatchingIcon(icons, Manifest::Icon::kDefaultDensity);
-
- return url;
-}
-
void ShortcutHelper::OnDidGetManifest(const content::Manifest& manifest) {
if (!manifest.IsEmpty()) {
content::RecordAction(
@@ -269,7 +152,10 @@ void ShortcutHelper::OnDidGetManifest(const content::Manifest& manifest) {
orientation_ = manifest.orientation;
}
- GURL icon_src = FindBestMatchingIcon(manifest.icons);
+ GURL icon_src = ManifestIconSelector::FindBestMatchingIcon(
+ manifest.icons,
+ kPreferredIconSizeInDp,
+ gfx::Screen::GetScreenFor(web_contents()->GetNativeView()));
if (icon_src.is_valid()) {
web_contents()->DownloadImage(icon_src,
false,
« no previous file with comments | « chrome/browser/android/shortcut_helper.h ('k') | chrome/browser/android/shortcut_helper_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698