Index: chrome/browser/ui/webui/favicon_source.cc |
diff --git a/chrome/browser/ui/webui/favicon_source.cc b/chrome/browser/ui/webui/favicon_source.cc |
index 8ecedfbd5dfe03c668431458efc1ae3d7bd20189..9172f7d2688243b22fed2d77c9a0f18dab692daa 100644 |
--- a/chrome/browser/ui/webui/favicon_source.cc |
+++ b/chrome/browser/ui/webui/favicon_source.cc |
@@ -4,8 +4,6 @@ |
#include "chrome/browser/ui/webui/favicon_source.h" |
-#include <cmath> |
- |
#include "base/bind.h" |
#include "base/bind_helpers.h" |
#include "base/strings/string_number_conversions.h" |
@@ -23,8 +21,41 @@ |
#include "ui/base/layout.h" |
#include "ui/base/resource/resource_bundle.h" |
#include "ui/base/webui/web_ui_util.h" |
+#include "ui/gfx/geometry/safe_integer_conversions.h" |
#include "ui/resources/grit/ui_resources.h" |
+namespace { |
+ |
+struct DefaultFaviconResourceMap { |
+ float scale; |
+ int value; |
+}; |
+ |
+const DefaultFaviconResourceMap kDefaultFaviconResources[] = { |
+ {1.0f, IDR_DEFAULT_FAVICON}, |
+ {2.0f, IDR_DEFAULT_FAVICON_32}, |
+ {4.0f, IDR_DEFAULT_FAVICON_64}}; |
+ |
+// Return the resource id of default favicon, whose scale is closet to |
+// |scale_factor|. |
+int FindBestMatchDefaultFaviconResourceIdForScaleFactor( |
+ ui::ScaleFactor scale_factor) { |
+ float scale = ui::GetScaleForScaleFactor(scale_factor); |
+ float smallest_diff = std::numeric_limits<float>::max(); |
+ int resource_id = IDR_DEFAULT_FAVICON; |
+ |
+ for (size_t i = 0; i < arraysize(kDefaultFaviconResources); ++i) { |
+ float diff = std::abs(kDefaultFaviconResources[i].scale - scale); |
+ if (diff < smallest_diff) { |
+ resource_id = kDefaultFaviconResources[i].value; |
+ smallest_diff = diff; |
+ } |
+ } |
+ return resource_id; |
+} |
+ |
+} // namespace |
+ |
FaviconSource::IconRequest::IconRequest() |
: size_in_dip(gfx::kFaviconSize), device_scale_factor(1.0f) { |
} |
@@ -81,7 +112,7 @@ void FaviconSource::StartDataRequest( |
GURL url(parsed.url); |
int desired_size_in_pixel = |
- std::ceil(parsed.size_in_dip * parsed.device_scale_factor); |
+ gfx::ToCeiledInt(parsed.size_in_dip * parsed.device_scale_factor); |
if (parsed.is_icon_url) { |
// TODO(michaelbai): Change GetRawFavicon to support combination of |
@@ -178,33 +209,33 @@ void FaviconSource::SendDefaultResponse( |
} |
void FaviconSource::SendDefaultResponse(const IconRequest& icon_request) { |
- int favicon_index; |
int resource_id; |
- switch (icon_request.size_in_dip) { |
+ ui::ScaleFactor resource_scale_factor = ui::SCALE_FACTOR_NONE; |
+ |
+ int desired_size_in_pixel = gfx::ToCeiledInt( |
+ icon_request.size_in_dip * icon_request.device_scale_factor); |
+ |
+ switch (desired_size_in_pixel) { |
case 64: |
- favicon_index = SIZE_64; |
resource_id = IDR_DEFAULT_FAVICON_64; |
break; |
case 32: |
- favicon_index = SIZE_32; |
resource_id = IDR_DEFAULT_FAVICON_32; |
break; |
- default: |
- favicon_index = SIZE_16; |
+ case 16: |
resource_id = IDR_DEFAULT_FAVICON; |
break; |
+ default: |
+ resource_scale_factor = |
+ ui::GetSupportedScaleFactor(icon_request.device_scale_factor); |
+ resource_id = FindBestMatchDefaultFaviconResourceIdForScaleFactor( |
+ resource_scale_factor); |
+ break; |
} |
+ |
base::RefCountedMemory* default_favicon = |
- default_favicons_[favicon_index].get(); |
Peter Kasting
2016/12/01 07:17:46
oshima suggested that just removing this cache mig
minggang
2016/12/01 08:40:24
By removing the cache, we can fix this bug apparen
|
- |
- if (!default_favicon) { |
- ui::ScaleFactor resource_scale_factor = |
- ui::GetSupportedScaleFactor(icon_request.device_scale_factor); |
- default_favicon = |
- ResourceBundle::GetSharedInstance().LoadDataResourceBytesForScale( |
- resource_id, resource_scale_factor); |
- default_favicons_[favicon_index] = default_favicon; |
- } |
+ ResourceBundle::GetSharedInstance().LoadDataResourceBytesForScale( |
+ resource_id, resource_scale_factor); |
icon_request.callback.Run(default_favicon); |
} |