blob: 7e7b876d75c2ab499453ec7ce766069d0ae722f3 [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/omnibox/model/omnibox_icon_formatter.h"
#import "base/notreached.h"
#import "components/omnibox/browser/autocomplete_match.h"
#import "components/omnibox/common/omnibox_feature_configs.h"
#import "ios/chrome/browser/net/model/crurl.h"
#import "ios/chrome/browser/omnibox/ui_bundled/omnibox_util.h"
#import "ios/chrome/browser/shared/public/features/features.h"
#import "url/gurl.h"
namespace {
OmniboxSuggestionIconType IconTypeFromMatch(const AutocompleteMatch& match) {
// Some suggestions have custom icons. Others fallback to the icon from the
// overall match type.
omnibox::AnswerType answer_type = match.answer_type;
if (answer_type != omnibox::ANSWER_TYPE_UNSPECIFIED) {
switch (answer_type) {
case omnibox::ANSWER_TYPE_DICTIONARY:
return OmniboxSuggestionIconType::kDictionary;
case omnibox::ANSWER_TYPE_FINANCE:
return OmniboxSuggestionIconType::kStock;
case omnibox::ANSWER_TYPE_TRANSLATION:
return OmniboxSuggestionIconType::kTranslation;
case omnibox::ANSWER_TYPE_WHEN_IS:
return OmniboxSuggestionIconType::kWhenIs;
case omnibox::ANSWER_TYPE_CURRENCY:
return OmniboxSuggestionIconType::kConversion;
case omnibox::ANSWER_TYPE_SUNRISE_SUNSET:
return OmniboxSuggestionIconType::kSunrise;
case omnibox::ANSWER_TYPE_GENERIC_ANSWER:
case omnibox::ANSWER_TYPE_LOCAL_TIME:
case omnibox::ANSWER_TYPE_PLAY_INSTALL:
case omnibox::ANSWER_TYPE_SPORTS:
case omnibox::ANSWER_TYPE_WEATHER:
case omnibox::ANSWER_TYPE_WEB_ANSWER:
return OmniboxSuggestionIconType::kFallbackAnswer;
case omnibox::ANSWER_TYPE_UNSPECIFIED:
NOTREACHED();
}
}
if (match.IsTrendSuggestion()) {
return OmniboxSuggestionIconType::kSearchTrend;
}
return GetOmniboxSuggestionIconTypeForAutocompleteMatchType(match.type);
}
} // namespace
@implementation OmniboxIconFormatter
- (instancetype)initWithMatch:(const AutocompleteMatch&)match {
BOOL isAnswer = match.answer_template.has_value();
OmniboxIconType iconType = OmniboxIconTypeSuggestionIcon;
GURL imageURL = GURL();
if (isAnswer &&
GURL(match.answer_template->answers(0).image().url()).is_valid()) {
imageURL = GURL(match.answer_template->answers(0).image().url());
iconType = OmniboxIconTypeImage;
} else if (!match.image_url.is_empty()) {
iconType = OmniboxIconTypeImage;
imageURL = GURL(match.image_url);
} else if (!AutocompleteMatch::IsSearchType(match.type) &&
!match.destination_url.is_empty()) {
iconType = OmniboxIconTypeFavicon;
imageURL = match.destination_url;
} else {
iconType = OmniboxIconTypeSuggestionIcon;
imageURL = GURL();
}
OmniboxSuggestionIconType suggestionIconType = IconTypeFromMatch(match);
return [self initWithIconType:iconType
suggestionIconType:suggestionIconType
isAnswer:isAnswer
imageURL:[[CrURL alloc] initWithGURL:imageURL]];
}
@end