diff options
author | aruslan@chromium.org <aruslan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-04 21:03:36 +0000 |
---|---|---|
committer | aruslan@chromium.org <aruslan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-04 21:03:36 +0000 |
commit | 3e594582a1310e383f4bed00c5633d89e2d33415 (patch) | |
tree | fa03bc55d1fc101992e4b3bcd77951dbeb57ad5b | |
parent | d84ab4b5cb3921338e5b80711a9de37060521a72 (diff) | |
download | chromium_src-3e594582a1310e383f4bed00c5633d89e2d33415.zip chromium_src-3e594582a1310e383f4bed00c5633d89e2d33415.tar.gz chromium_src-3e594582a1310e383f4bed00c5633d89e2d33415.tar.bz2 |
Fix blurry favicons fetches on Android
This change depends on https://codereview.chromium.org/12041064/
Introduces a new scale factor for Nexus 7: SCALE_FACTOR_133P.
Uses max available density on Android instead of SCALE_FACTOR_100P.
BUG=172048
NOTRY=true
Review URL: https://chromiumcodereview.appspot.com/12084003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@180518 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/android/provider/chrome_browser_provider.cc | 2 | ||||
-rw-r--r-- | chrome/browser/resources/ntp_android/ntp_android.js | 35 | ||||
-rw-r--r-- | chrome/browser/ui/webui/favicon_source.cc | 16 | ||||
-rw-r--r-- | chrome/browser/ui/webui/favicon_source.h | 18 | ||||
-rw-r--r-- | chrome/browser/ui/webui/ntp/android/bookmarks_handler.cc | 2 | ||||
-rw-r--r-- | ui/base/layout.cc | 2 | ||||
-rw-r--r-- | ui/base/layout.h | 1 | ||||
-rw-r--r-- | ui/base/layout_unittest.cc | 7 |
8 files changed, 55 insertions, 28 deletions
diff --git a/chrome/browser/android/provider/chrome_browser_provider.cc b/chrome/browser/android/provider/chrome_browser_provider.cc index cdfd468..6285eac 100644 --- a/chrome/browser/android/provider/chrome_browser_provider.cc +++ b/chrome/browser/android/provider/chrome_browser_provider.cc @@ -654,7 +654,7 @@ class BookmarkIconFetchTask : public FaviconServiceTask { url, history::FAVICON | history::TOUCH_ICON, gfx::kFaviconSize), - ui::SCALE_FACTOR_100P, + ui::GetMaxScaleFactor(), base::Bind( &BookmarkIconFetchTask::OnFaviconRetrieved, base::Unretained(this)), diff --git a/chrome/browser/resources/ntp_android/ntp_android.js b/chrome/browser/resources/ntp_android/ntp_android.js index 963dcb3..ff99293 100644 --- a/chrome/browser/resources/ntp_android/ntp_android.js +++ b/chrome/browser/resources/ntp_android/ntp_android.js @@ -582,7 +582,11 @@ cr.define('ntp', function() { cell.setAttribute(CONTEXT_MENU_URL_KEY, item.url); - var iconUrl = item.icon || 'chrome://touch-icon/size/16@1x/' + item.url; + var iconUrl = item.icon; + if (!iconUrl) { + iconUrl = 'chrome://touch-icon/size/16@' + window.devicePixelRatio + + 'x/' + item.url; + } var icon = createDiv('icon', iconUrl); trackImageLoad(iconUrl); cell.appendChild(icon); @@ -676,7 +680,7 @@ cr.define('ntp', function() { if (item.folder) { faviconBox.classList.add('folder'); } else { - var iconUrl = item.icon || 'chrome://touch-icon/' + item.url; + var iconUrl = item.icon || 'chrome://touch-icon/largest/' + item.url; var faviconIcon = createDiv('favicon-icon'); faviconIcon.style.backgroundImage = 'url(' + iconUrl + ')'; trackImageLoad(iconUrl); @@ -686,8 +690,10 @@ cr.define('ntp', function() { image.onload = function() { var w = image.width; var h = image.height; - if (w <= 16 || h <= 16) { - // it's a standard favicon (or at least it's small) + var wDip = w / window.devicePixelRatio; + var hDip = h / window.devicePixelRatio; + if (Math.floor(wDip) <= 16 || Math.floor(hDip) <= 16) { + // it's a standard favicon (or at least it's small). faviconBox.classList.add('document'); faviconBox.appendChild( @@ -704,21 +710,26 @@ cr.define('ntp', function() { foldContainer.appendChild(foldDiv); faviconBox.appendChild(foldContainer); + // FaviconWebUIHandler::HandleGetFaviconDominantColor expects + // an URL that starts with chrome://favicon/size/. + // The handler always loads 16x16 1x favicon and assumes that + // the dominant color for all scale factors is the same. chrome.send('getFaviconDominantColor', [('chrome://favicon/size/16@1x/' + item.url), '' + faviconIndex]); faviconIndex++; } else if ((w == 57 && h == 57) || (w == 114 && h == 114)) { - // it's a touch icon + // it's a touch icon for 1x or 2x. faviconIcon.classList.add('touch-icon'); } else { - // it's an html5 icon (or at least it's larger) - var max = 64; - if (w > max || h > max) { - var scale = (w > h) ? (max / w) : (max / h); - w *= scale; - h *= scale; + // It's an html5 icon (or at least it's larger). + // Rescale it to be no bigger than 64x64 dip. + var maxDip = 64; // DIP + if (wDip > maxDip || hDip > maxDip) { + var scale = (wDip > hDip) ? (maxDip / wDip) : (maxDip / hDip); + wDip *= scale; + hDip *= scale; } - faviconIcon.style.backgroundSize = w + 'px ' + h + 'px'; + faviconIcon.style.backgroundSize = wDip + 'px ' + hDip + 'px'; } }; faviconBox.appendChild(faviconIcon); diff --git a/chrome/browser/ui/webui/favicon_source.cc b/chrome/browser/ui/webui/favicon_source.cc index 628afc6..c498b33 100644 --- a/chrome/browser/ui/webui/favicon_source.cc +++ b/chrome/browser/ui/webui/favicon_source.cc @@ -22,9 +22,10 @@ namespace { // Parameters which can be used in chrome://favicon path. See .h file for a // description of what each does. -const char kSizeParameter[] = "size/"; const char kIconURLParameter[] = "iconurl/"; +const char kLargestParameter[] = "largest/"; const char kOriginParameter[] = "origin/"; +const char kSizeParameter[] = "size/"; // Returns true if |search| is a substring of |path| which starts at // |start_index|. @@ -92,7 +93,10 @@ void FaviconSource::StartDataRequest( ui::ScaleFactor scale_factor = ui::SCALE_FACTOR_100P; size_t parsed_index = 0; - if (HasSubstringAt(path, parsed_index, kSizeParameter)) { + if (HasSubstringAt(path, parsed_index, kLargestParameter)) { + parsed_index += strlen(kLargestParameter); + size_in_dip = 0; + } else if (HasSubstringAt(path, parsed_index, kSizeParameter)) { parsed_index += strlen(kSizeParameter); size_t scale_delimiter = path.find("@", parsed_index); @@ -123,7 +127,13 @@ void FaviconSource::StartDataRequest( slash - scale_delimiter - 1); webui::ParseScaleFactor(scale_str, &scale_factor); - if (scale_factor != ui::SCALE_FACTOR_100P && size_in_dip != 16) { + // Return the default favicon (as opposed to a resized favicon) for + // favicon sizes which are not cached by the favicon service. + // Currently the favicon service caches: + // - favicons of sizes "16 * scale factor" px of type FAVICON + // where scale factor is one of FaviconUtil::GetFaviconScaleFactors(). + // - the largest TOUCH_ICON / TOUCH_PRECOMPOSED_ICON + if (size_in_dip != 16 && icon_types_ == history::FAVICON) { SendDefaultResponse(callback); return; } diff --git a/chrome/browser/ui/webui/favicon_source.h b/chrome/browser/ui/webui/favicon_source.h index 02eae11..eb34b02 100644 --- a/chrome/browser/ui/webui/favicon_source.h +++ b/chrome/browser/ui/webui/favicon_source.h @@ -30,13 +30,17 @@ class Profile; // Specifies the page URL of the requested favicon. If the 'urlmodifier' // parameter is 'iconurl', the URL refers to the URL of the favicon image // instead. -// 'size&scalefactor' Optional size/aa@bx/ -// Specifies the requested favicon's size in DIP (aa) and the requested -// favicon's scale factor. (b). -// The supported requested DIP sizes are: 16x16, 32x32 and 64x64. -// If the parameter is unspecified, the requested favicon's size defaults to -// 16 and the requested scale factor defaults to 1x. -// Example: chrome://favicon/size/16@2x/http://www.google.com/ +// 'size&scalefactor' Optional +// Values: ['largest', size/aa@bx/] +// 'largest': Specifies that the largest available favicon is requested. +// Example: chrome://favicon/largest/http://www.google.com/ +// 'size/aa@bx/': +// Specifies the requested favicon's size in DIP (aa) and the requested +// favicon's scale factor. (b). +// The supported requested DIP sizes are: 16x16, 32x32 and 64x64. +// If the parameter is unspecified, the requested favicon's size defaults +// to 16 and the requested scale factor defaults to 1x. +// Example: chrome://favicon/size/16@2x/http://www.google.com/ // 'urlmodifier' Optional // Values: ['iconurl', 'origin'] // 'iconurl': Specifies that the url parameter refers to the URL of diff --git a/chrome/browser/ui/webui/ntp/android/bookmarks_handler.cc b/chrome/browser/ui/webui/ntp/android/bookmarks_handler.cc index bcde01a..606f8dc 100644 --- a/chrome/browser/ui/webui/ntp/android/bookmarks_handler.cc +++ b/chrome/browser/ui/webui/ntp/android/bookmarks_handler.cc @@ -391,7 +391,7 @@ void BookmarksHandler::HandleCreateHomeScreenBookmarkShortcut( node->url(), history::FAVICON | history::TOUCH_ICON, gfx::kFaviconSize), - ui::SCALE_FACTOR_100P, + ui::GetMaxScaleFactor(), base::Bind(&BookmarksHandler::OnShortcutFaviconDataAvailable, base::Unretained(this), node), diff --git a/ui/base/layout.cc b/ui/base/layout.cc index 2175fac..f68b1ed 100644 --- a/ui/base/layout.cc +++ b/ui/base/layout.cc @@ -65,7 +65,7 @@ bool UseTouchOptimizedUI() { } #endif // defined(OS_WIN) -const float kScaleFactorScales[] = {1.0f, 1.0f, 1.4f, 1.5f, 1.8f, 2.0f}; +const float kScaleFactorScales[] = {1.0f, 1.0f, 1.33f, 1.4f, 1.5f, 1.8f, 2.0f}; COMPILE_ASSERT(NUM_SCALE_FACTORS == arraysize(kScaleFactorScales), kScaleFactorScales_incorrect_size); const size_t kScaleFactorScalesLength = arraysize(kScaleFactorScales); diff --git a/ui/base/layout.h b/ui/base/layout.h index c8c278d..236e58e 100644 --- a/ui/base/layout.h +++ b/ui/base/layout.h @@ -36,6 +36,7 @@ UI_EXPORT DisplayLayout GetDisplayLayout(); enum ScaleFactor { SCALE_FACTOR_NONE = 0, SCALE_FACTOR_100P, + SCALE_FACTOR_133P, SCALE_FACTOR_140P, SCALE_FACTOR_150P, SCALE_FACTOR_180P, diff --git a/ui/base/layout_unittest.cc b/ui/base/layout_unittest.cc index 13f2794..3153f97 100644 --- a/ui/base/layout_unittest.cc +++ b/ui/base/layout_unittest.cc @@ -16,6 +16,7 @@ namespace ui { TEST(LayoutTest, GetScaleFactorScale) { EXPECT_FLOAT_EQ(1.0f, GetScaleFactorScale(SCALE_FACTOR_100P)); + EXPECT_FLOAT_EQ(1.33f, GetScaleFactorScale(SCALE_FACTOR_133P)); EXPECT_FLOAT_EQ(1.4f, GetScaleFactorScale(SCALE_FACTOR_140P)); EXPECT_FLOAT_EQ(1.5f, GetScaleFactorScale(SCALE_FACTOR_150P)); EXPECT_FLOAT_EQ(1.8f, GetScaleFactorScale(SCALE_FACTOR_180P)); @@ -47,9 +48,9 @@ TEST(LayoutTest, GetScaleFactorFromScaleAllSupported) { EXPECT_EQ(SCALE_FACTOR_100P, GetScaleFactorFromScale(0.1f)); EXPECT_EQ(SCALE_FACTOR_100P, GetScaleFactorFromScale(0.9f)); EXPECT_EQ(SCALE_FACTOR_100P, GetScaleFactorFromScale(1.0f)); - EXPECT_EQ(SCALE_FACTOR_100P, GetScaleFactorFromScale(1.19f)); - EXPECT_EQ(SCALE_FACTOR_140P, GetScaleFactorFromScale(1.21f)); - EXPECT_EQ(SCALE_FACTOR_140P, GetScaleFactorFromScale(1.3f)); + EXPECT_EQ(SCALE_FACTOR_133P, GetScaleFactorFromScale(1.19f)); + EXPECT_EQ(SCALE_FACTOR_133P, GetScaleFactorFromScale(1.21f)); + EXPECT_EQ(SCALE_FACTOR_133P, GetScaleFactorFromScale(1.3f)); EXPECT_EQ(SCALE_FACTOR_140P, GetScaleFactorFromScale(1.4f)); EXPECT_EQ(SCALE_FACTOR_150P, GetScaleFactorFromScale(1.59f)); EXPECT_EQ(SCALE_FACTOR_150P, GetScaleFactorFromScale(1.61f)); |