summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraruslan@chromium.org <aruslan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-04 21:03:36 +0000
committeraruslan@chromium.org <aruslan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-04 21:03:36 +0000
commit3e594582a1310e383f4bed00c5633d89e2d33415 (patch)
treefa03bc55d1fc101992e4b3bcd77951dbeb57ad5b
parentd84ab4b5cb3921338e5b80711a9de37060521a72 (diff)
downloadchromium_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.cc2
-rw-r--r--chrome/browser/resources/ntp_android/ntp_android.js35
-rw-r--r--chrome/browser/ui/webui/favicon_source.cc16
-rw-r--r--chrome/browser/ui/webui/favicon_source.h18
-rw-r--r--chrome/browser/ui/webui/ntp/android/bookmarks_handler.cc2
-rw-r--r--ui/base/layout.cc2
-rw-r--r--ui/base/layout.h1
-rw-r--r--ui/base/layout_unittest.cc7
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));