Index: ios/chrome/browser/favicon/favicon_client_impl.mm |
diff --git a/ios/chrome/browser/favicon/favicon_client_impl.mm b/ios/chrome/browser/favicon/favicon_client_impl.mm |
index 860e48948644cb609d5a93b7a769a95e1f3cba08..5f4876804ac4e8334ecd3aacbeefccb75c7936c6 100644 |
--- a/ios/chrome/browser/favicon/favicon_client_impl.mm |
+++ b/ios/chrome/browser/favicon/favicon_client_impl.mm |
@@ -4,11 +4,21 @@ |
#include "ios/chrome/browser/favicon/favicon_client_impl.h" |
+#include <memory> |
+ |
#include "base/bind.h" |
#include "base/logging.h" |
+#include "base/memory/ptr_util.h" |
#include "base/task/cancelable_task_tracker.h" |
+#include "base/threading/thread_task_runner_handle.h" |
+#include "components/favicon/core/favicon_service.h" |
+#include "components/favicon_base/favicon_types.h" |
+#include "components/favicon_base/select_favicon_frames.h" |
+#include "components/grit/components_scaled_resources.h" |
#include "ios/chrome/browser/chrome_url_constants.h" |
-#include "ios/public/provider/chrome/browser/chrome_browser_provider.h" |
+#include "ui/base/layout.h" |
+#include "ui/base/resource/resource_bundle.h" |
+#include "ui/gfx/favicon_size.h" |
#include "url/gurl.h" |
#if !defined(__has_feature) || !__has_feature(objc_arc) |
@@ -17,19 +27,58 @@ |
namespace { |
-void RunFaviconCallbackIfNotCanceled( |
- const base::CancelableTaskTracker::IsCanceledCallback& is_canceled_cb, |
- const favicon_base::FaviconResultsCallback& original_callback, |
- const std::vector<favicon_base::FaviconRawBitmapResult>& results) { |
- if (!is_canceled_cb.Run()) { |
- original_callback.Run(results); |
+int GetFaviconResourceIdForNativeURL(const GURL& url) { |
+ if (url.host_piece() == kChromeUICrashesHost) |
+ return IDR_CRASH_SAD_FAVICON; |
+ if (url.host_piece() == kChromeUIFlagsHost) |
+ return IDR_FLAGS_FAVICON; |
+ if (url.host_piece() == kChromeUIAppleFlagsHost) |
+ return IDR_FLAGS_FAVICON; |
+ return -1; |
+} |
+ |
+void GetFaviconBitmapForNativeURL( |
+ const GURL& url, |
+ const std::vector<int>& desired_sizes_in_pixel, |
+ std::vector<favicon_base::FaviconRawBitmapResult>* favicon_bitmap_results) { |
+ const int resource_id = GetFaviconResourceIdForNativeURL(url); |
+ if (resource_id == -1) |
+ return; |
+ |
+ // Use ui::GetSupportedScaleFactors() because native URL favicon comes from |
+ // resources. |
+ std::vector<ui::ScaleFactor> scale_factors = ui::GetSupportedScaleFactors(); |
+ |
+ std::vector<gfx::Size> candidate_sizes; |
+ for (ui::ScaleFactor scale_factor : scale_factors) { |
+ float scale = ui::GetScaleForScaleFactor(scale_factor); |
+ int candidate_size = static_cast<int>(gfx::kFaviconSize * scale + 0.5f); |
+ candidate_sizes.push_back(gfx::Size(candidate_size, candidate_size)); |
+ } |
+ |
+ std::vector<size_t> selected_indices; |
+ SelectFaviconFrameIndices(candidate_sizes, desired_sizes_in_pixel, |
+ &selected_indices, nullptr); |
+ |
+ for (size_t selected_index : selected_indices) { |
+ ui::ScaleFactor scale_factor = scale_factors[selected_index]; |
+ favicon_base::FaviconRawBitmapResult favicon_bitmap; |
+ favicon_bitmap.icon_type = favicon_base::FAVICON; |
+ favicon_bitmap.pixel_size = candidate_sizes[selected_index]; |
+ favicon_bitmap.bitmap_data = |
+ ResourceBundle::GetSharedInstance().LoadDataResourceBytesForScale( |
+ resource_id, scale_factor); |
+ |
+ if (!favicon_bitmap.is_valid()) |
+ continue; |
+ |
+ favicon_bitmap_results->push_back(favicon_bitmap); |
} |
} |
} // namespace |
-FaviconClientImpl::FaviconClientImpl(ios::ChromeBrowserState* browser_state) |
- : browser_state_(browser_state) {} |
+FaviconClientImpl::FaviconClientImpl() {} |
FaviconClientImpl::~FaviconClientImpl() {} |
@@ -45,13 +94,14 @@ FaviconClientImpl::GetFaviconForNativeApplicationURL( |
base::CancelableTaskTracker* tracker) { |
DCHECK(tracker); |
DCHECK(IsNativeApplicationURL(url)); |
- base::CancelableTaskTracker::IsCanceledCallback is_canceled_cb; |
- base::CancelableTaskTracker::TaskId task_id = |
- tracker->NewTrackedTaskId(&is_canceled_cb); |
- if (task_id != base::CancelableTaskTracker::kBadTaskId) { |
- ios::GetChromeBrowserProvider()->GetFaviconForURL( |
- browser_state_, url, desired_sizes_in_pixel, |
- base::Bind(&RunFaviconCallbackIfNotCanceled, is_canceled_cb, callback)); |
- } |
- return task_id; |
+ |
+ auto favicon_bitmap_results = |
+ base::MakeUnique<std::vector<favicon_base::FaviconRawBitmapResult>>(); |
+ GetFaviconBitmapForNativeURL(url, desired_sizes_in_pixel, |
+ favicon_bitmap_results.get()); |
+ |
+ return tracker->PostTask( |
+ base::ThreadTaskRunnerHandle::Get().get(), FROM_HERE, |
+ base::Bind(&favicon::FaviconService::FaviconResultsCallbackRunner, |
+ callback, base::Owned(favicon_bitmap_results.release()))); |
} |