Commit 7e6b4ac9 authored by Stepan Khapugin's avatar Stepan Khapugin Committed by Commit Bot

[iOS] Display favicons in the omnibox.

Displays favicons when they are available in the left view.

Bug: 945324
Change-Id: I4d4423bfb4c56d5d1b959bf670dc0ba9e70c509e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1573739
Commit-Queue: Stepan Khapugin <stkhapugin@chromium.org>
Reviewed-by: default avatarRobbie Gibson <rkgibson@google.com>
Cr-Commit-Position: refs/heads/master@{#653534}
parent 2d336cf3
......@@ -92,6 +92,7 @@ source_set("omnibox_internal") {
"//ios/chrome/browser/bookmarks",
"//ios/chrome/browser/bookmarks:bookmarks_utils",
"//ios/chrome/browser/browser_state",
"//ios/chrome/browser/favicon",
"//ios/chrome/browser/net",
"//ios/chrome/browser/prerender",
"//ios/chrome/browser/search_engines",
......@@ -106,6 +107,7 @@ source_set("omnibox_internal") {
"//ios/chrome/browser/ui/toolbar/public:feature_flags",
"//ios/chrome/browser/ui/util",
"//ios/chrome/common",
"//ios/chrome/common/favicon",
"//ios/public/provider/chrome/browser",
"//ios/third_party/material_roboto_font_loader_ios",
"//ios/web",
......
......@@ -11,6 +11,7 @@
#include "components/omnibox/browser/omnibox_edit_model.h"
#include "components/strings/grit/components_strings.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#include "ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.h"
#import "ios/chrome/browser/search_engines/template_url_service_factory.h"
#import "ios/chrome/browser/ui/commands/load_query_commands.h"
#import "ios/chrome/browser/ui/location_bar/location_bar_constants.h"
......@@ -72,6 +73,8 @@
self.mediator = [[OmniboxMediator alloc] init];
self.mediator.templateURLService =
ios::TemplateURLServiceFactory::GetForBrowserState(self.browserState);
self.mediator.faviconLoader =
IOSChromeFaviconLoaderFactory::GetForBrowserState(self.browserState);
self.mediator.consumer = self.viewController;
DCHECK(self.editController);
......
......@@ -10,6 +10,7 @@
#import "ios/chrome/browser/ui/omnibox/omnibox_left_image_consumer.h"
@protocol OmniboxConsumer;
class FaviconLoader;
class TemplateURLService;
// A mediator object that updates the omnibox according to the model changes.
......@@ -23,6 +24,9 @@ class TemplateURLService;
// object and may be nil.
@property(nonatomic, weak) id<OmniboxConsumer> consumer;
// The favicon loader.
@property(nonatomic, assign) FaviconLoader* faviconLoader;
@end
#endif // IOS_CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_MEDIATOR_H_
......@@ -5,21 +5,31 @@
#import "ios/chrome/browser/ui/omnibox/omnibox_mediator.h"
#include "base/strings/sys_string_conversions.h"
#import "ios/chrome/browser/favicon/favicon_loader.h"
#import "ios/chrome/browser/search_engines/search_engine_observer_bridge.h"
#import "ios/chrome/browser/search_engines/search_engines_util.h"
#import "ios/chrome/browser/ui/omnibox/omnibox_consumer.h"
#import "ios/chrome/browser/ui/omnibox/omnibox_util.h"
#include "ios/chrome/browser/ui/ui_feature_flags.h"
#import "ios/chrome/browser/ui/util/uikit_ui_util.h"
#import "ios/chrome/common/favicon/favicon_attributes.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace {
const CGFloat kOmniboxIconSize = 20;
} // namespace
@interface OmniboxMediator () <SearchEngineObserving>
// Whether the current default search engine supports search-by-image.
@property(nonatomic, assign) BOOL searchEngineSupportsSearchByImage;
// The latest URL used to fetch the favicon.
@property(nonatomic, assign) GURL latestFaviconURL;
@end
@implementation OmniboxMediator {
......@@ -78,6 +88,34 @@
UIImage* image = GetOmniboxSuggestionIconForAutocompleteMatchType(
matchType, /* is_starred */ false);
[self.consumer updateAutocompleteIcon:image];
if (!base::FeatureList::IsEnabled(kNewOmniboxPopupLayout)) {
return;
}
// Can't load favicons without a favicon loader.
DCHECK(self.faviconLoader);
// Remember the last request URL to avoid showing favicons for past requests.
self.latestFaviconURL = faviconURL;
// Download the favicon.
__weak OmniboxMediator* weakSelf = self;
// The code below mimics that in OmniboxPopupMediator.
FaviconAttributes* cachedAttributes = self.faviconLoader->FaviconForPageUrl(
faviconURL, kOmniboxIconSize, kOmniboxIconSize,
/*fallback_to_google_server=*/YES, ^(FaviconAttributes* attributes) {
// If the favicon isn't default, and this is still the latest request,
// use it.
if (attributes.faviconImage && !attributes.usesDefaultImage &&
weakSelf.latestFaviconURL == faviconURL)
[weakSelf.consumer updateAutocompleteIcon:attributes.faviconImage];
});
// Only use cached attributes when they are a non-default icon. Never show
// monograms or default globe icon.
if (cachedAttributes.faviconImage && !cachedAttributes.usesDefaultImage) {
[self.consumer updateAutocompleteIcon:cachedAttributes.faviconImage];
}
}
@end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment