blob: c4a62000b6142688a39dbf4c075996af929e207b [file] [log] [blame]
// Copyright 2016 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/public/omnibox_util.h"
#import "base/notreached.h"
#import "base/strings/utf_string_conversions.h"
#import "ios/chrome/browser/omnibox/public/omnibox_ui_features.h"
#import "ios/chrome/browser/shared/public/features/features.h"
#import "ios/chrome/browser/shared/ui/symbols/symbols.h"
#import "ios/chrome/grit/ios_theme_resources.h"
namespace {
// The size of symbol images.
const CGFloat kSymbolLocationBarPointSize = 10;
} // namespace
#pragma mark - Suggestion icons.
OmniboxSuggestionIconType GetOmniboxSuggestionIconTypeForAutocompleteMatchType(
AutocompleteMatchType::Type type) {
// TODO(crbug.com/40716245): Handle trending zero-prefix suggestions by
// checking the match subtype similar to AutocompleteMatch::GetVectorIcon().
switch (type) {
case AutocompleteMatchType::BOOKMARK_TITLE:
case AutocompleteMatchType::CLIPBOARD_URL:
case AutocompleteMatchType::DOCUMENT_SUGGESTION:
case AutocompleteMatchType::HISTORY_BODY:
case AutocompleteMatchType::HISTORY_CLUSTER:
case AutocompleteMatchType::HISTORY_KEYWORD:
case AutocompleteMatchType::HISTORY_TITLE:
case AutocompleteMatchType::HISTORY_URL:
case AutocompleteMatchType::NAVSUGGEST:
case AutocompleteMatchType::NAVSUGGEST_PERSONALIZED:
case AutocompleteMatchType::OPEN_TAB:
case AutocompleteMatchType::PEDAL:
case AutocompleteMatchType::PHYSICAL_WEB_DEPRECATED:
case AutocompleteMatchType::PHYSICAL_WEB_OVERFLOW_DEPRECATED:
case AutocompleteMatchType::STARTER_PACK:
case AutocompleteMatchType::TAB_SEARCH_DEPRECATED:
case AutocompleteMatchType::TILE_NAVSUGGEST:
case AutocompleteMatchType::TILE_MOST_VISITED_SITE:
case AutocompleteMatchType::URL_WHAT_YOU_TYPED:
return OmniboxSuggestionIconType::kDefaultFavicon;
case AutocompleteMatchType::CLIPBOARD_IMAGE:
case AutocompleteMatchType::CLIPBOARD_TEXT:
case AutocompleteMatchType::CONTACT_DEPRECATED:
case AutocompleteMatchType::SEARCH_OTHER_ENGINE:
case AutocompleteMatchType::SEARCH_SUGGEST:
case AutocompleteMatchType::SEARCH_SUGGEST_ENTITY:
case AutocompleteMatchType::SEARCH_SUGGEST_PROFILE:
case AutocompleteMatchType::SEARCH_SUGGEST_TAIL:
case AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED:
case AutocompleteMatchType::VOICE_SUGGEST:
return OmniboxSuggestionIconType::kSearch;
case AutocompleteMatchType::SEARCH_HISTORY:
case AutocompleteMatchType::SEARCH_SUGGEST_PERSONALIZED:
return OmniboxSuggestionIconType::kSearchHistory;
case AutocompleteMatchType::CALCULATOR:
return OmniboxSuggestionIconType::kCalculator;
case AutocompleteMatchType::EXTENSION_APP_DEPRECATED:
case AutocompleteMatchType::NULL_RESULT_MESSAGE:
case AutocompleteMatchType::NUM_TYPES:
case AutocompleteMatchType::TILE_SUGGESTION:
case AutocompleteMatchType::TILE_REPEATABLE_QUERY:
case AutocompleteMatchType::HISTORY_EMBEDDINGS:
case AutocompleteMatchType::FEATURED_ENTERPRISE_SEARCH:
case AutocompleteMatchType::HISTORY_EMBEDDINGS_ANSWER:
default:
DUMP_WILL_BE_NOTREACHED()
<< "Unsupported AutocompleteMatchType: " << type;
return OmniboxSuggestionIconType::kDefaultFavicon;
}
}
UIImage* GetOmniboxSuggestionIconForAutocompleteMatchType(
AutocompleteMatchType::Type type) {
OmniboxSuggestionIconType iconType =
GetOmniboxSuggestionIconTypeForAutocompleteMatchType(type);
return GetOmniboxSuggestionIcon(iconType);
}
OmniboxSuggestionIconType
GetOmniboxSuggestionIconTypeForSuggestTemplateInfoIconType(
omnibox::SuggestTemplateInfo::IconType type) {
// Update this assertion and the switch below whenever values are added.
static_assert(omnibox::SuggestTemplateInfo::IconType_MAX ==
omnibox::SuggestTemplateInfo::SUB_ARROW_RIGHT);
switch (type) {
case omnibox::SuggestTemplateInfo_IconType_HISTORY:
return OmniboxSuggestionIconType::kSearchHistory;
case omnibox::SuggestTemplateInfo_IconType_SEARCH_LOOP:
return OmniboxSuggestionIconType::kSearch;
case omnibox::SuggestTemplateInfo_IconType_SEARCH_LOOP_WITH_SPARKLE:
return OmniboxSuggestionIconType::kSearchWithSparkle;
case omnibox::SuggestTemplateInfo_IconType_TRENDING:
return OmniboxSuggestionIconType::kSearchTrend;
case omnibox::SuggestTemplateInfo_IconType_SUB_ARROW_RIGHT:
// TODO(crbug.com/437177158): Replace with the correct symbol when it's
// available.
return OmniboxSuggestionIconType::kSearch;
default:
return OmniboxSuggestionIconType::kSearch;
}
}
UIImage* GetOmniboxSuggestionIconForSuggestTemplateInfoIconType(
omnibox::SuggestTemplateInfo::IconType type) {
OmniboxSuggestionIconType iconType =
GetOmniboxSuggestionIconTypeForSuggestTemplateInfoIconType(type);
return GetOmniboxSuggestionIcon(iconType);
}
#pragma mark - Security icons.
// Returns the asset with "always template" rendering mode.
UIImage* GetLocationBarSecurityIcon(LocationBarSecurityIconType iconType) {
NSString* name = GetLocationBarSecuritySymbolName(iconType);
if (!name) {
return nil;
}
if (iconType == LocationBarSecurityIconType::DANGEROUS) {
return CustomSymbolTemplateWithPointSize(name, kSymbolLocationBarPointSize);
} else {
return DefaultSymbolTemplateWithPointSize(name,
kSymbolLocationBarPointSize);
}
}
// Converts the `security_level` to an appropriate security icon type.
LocationBarSecurityIconType GetLocationBarSecurityIconTypeForSecurityState(
security_state::SecurityLevel security_level) {
switch (security_level) {
case security_state::NONE:
return LocationBarSecurityIconType::INFO;
case security_state::DANGEROUS:
return LocationBarSecurityIconType::DANGEROUS;
case security_state::WARNING:
return LocationBarSecurityIconType::NOT_SECURE_WARNING;
case security_state::SECURE:
return LocationBarSecurityIconType::NONE;
case security_state::SECURITY_LEVEL_COUNT:
NOTREACHED();
}
}
// Converts the `security_level` to an appropriate icon in "always template"
// rendering mode.
UIImage* GetLocationBarSecurityIconForSecurityState(
security_state::SecurityLevel security_level) {
LocationBarSecurityIconType iconType =
GetLocationBarSecurityIconTypeForSecurityState(security_level);
return GetLocationBarSecurityIcon(iconType);
}
UIImage* GetLocationBarOfflineIcon() {
return DefaultSymbolTemplateWithPointSize(kDownloadPromptFillSymbol,
kSymbolLocationBarPointSize);
}