| 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())));
|
| }
|
|
|