Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(94)

Unified Diff: ios/chrome/browser/ui/omnibox/location_bar_view_ios.mm

Issue 2796793003: [ios] Adds a LocationBarController interface. (Closed)
Patch Set: Review. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ios/chrome/browser/ui/omnibox/location_bar_view_ios.mm
diff --git a/ios/chrome/browser/ui/omnibox/location_bar_view_ios.mm b/ios/chrome/browser/ui/omnibox/location_bar_view_ios.mm
deleted file mode 100644
index 8b30bdfe6873601ec1c7ed3a7cc32028031bb801..0000000000000000000000000000000000000000
--- a/ios/chrome/browser/ui/omnibox/location_bar_view_ios.mm
+++ /dev/null
@@ -1,333 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import <UIKit/UIKit.h>
-
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/strings/string16.h"
-#include "components/omnibox/browser/omnibox_edit_model.h"
-#include "components/security_state/core/security_state_ui.h"
-#include "components/strings/grit/components_strings.h"
-#include "components/toolbar/toolbar_model.h"
-#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
-#include "ios/chrome/browser/chrome_url_constants.h"
-#include "ios/chrome/browser/experimental_flags.h"
-#include "ios/chrome/browser/ui/commands/UIKit+ChromeExecuteCommand.h"
-#include "ios/chrome/browser/ui/commands/ios_command_ids.h"
-#include "ios/chrome/browser/ui/omnibox/location_bar_view_ios.h"
-#import "ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.h"
-#include "ios/chrome/browser/ui/omnibox/omnibox_view_ios.h"
-#include "ios/chrome/browser/ui/ui_util.h"
-#import "ios/chrome/browser/ui/uikit_ui_util.h"
-#include "ios/chrome/grit/ios_strings.h"
-#include "ios/chrome/grit/ios_theme_resources.h"
-#import "ios/third_party/material_roboto_font_loader_ios/src/src/MaterialRobotoFontLoader.h"
-#include "ios/web/public/navigation_item.h"
-#include "ios/web/public/navigation_manager.h"
-#include "ios/web/public/ssl_status.h"
-#include "ios/web/public/web_state/web_state.h"
-#include "ui/base/l10n/l10n_util.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-namespace {
-const CGFloat kClearTextButtonWidth = 28;
-const CGFloat kClearTextButtonHeight = 28;
-
-// Workaround for https://crbug.com/527084 . If there is connection
-// information, always show the icon. Remove this once connection info
-// is available via other UI: https://crbug.com/533581
-bool DoesCurrentPageHaveCertInfo(web::WebState* webState) {
- if (!webState)
- return false;
- web::NavigationManager* navigationMangager = webState->GetNavigationManager();
- if (!navigationMangager)
- return false;
- web::NavigationItem* visibleItem = navigationMangager->GetVisibleItem();
- if (!visibleItem)
- return false;
-
- const web::SSLStatus& SSLStatus = visibleItem->GetSSL();
- // Evaluation of |security_style| SSLStatus field in WKWebView based app is an
- // asynchronous operation, so for a short period of time SSLStatus may have
- // non-null certificate and SECURITY_STYLE_UNKNOWN |security_style|.
- return SSLStatus.certificate &&
- SSLStatus.security_style != web::SECURITY_STYLE_UNKNOWN;
-}
-
-// Returns whether the |webState| is presenting an offline page.
-bool IsCurrentPageOffline(web::WebState* webState) {
- if (!webState)
- return false;
- auto* navigationManager = webState->GetNavigationManager();
- auto* visibleItem = navigationManager->GetVisibleItem();
- if (!visibleItem)
- return false;
- const GURL& url = visibleItem->GetURL();
- return url.SchemeIs(kChromeUIScheme) && url.host() == kChromeUIOfflineHost;
-}
-
-} // namespace
-
-// An ObjC bridge class to allow taps on the clear button to be sent to a C++
-// class.
-@interface OmniboxClearButtonBridge : NSObject
-
-- (instancetype)initWithOmniboxView:(OmniboxViewIOS*)omniboxView
- NS_DESIGNATED_INITIALIZER;
-
-- (instancetype)init NS_UNAVAILABLE;
-
-- (void)clearText;
-
-@end
-
-@implementation OmniboxClearButtonBridge {
- OmniboxViewIOS* _omniboxView;
-}
-
-- (instancetype)initWithOmniboxView:(OmniboxViewIOS*)omniboxView {
- self = [super init];
- if (self) {
- _omniboxView = omniboxView;
- }
- return self;
-}
-
-- (instancetype)init {
- NOTREACHED();
- return nil;
-}
-
-- (void)clearText {
- _omniboxView->ClearText();
-}
-
-@end
-
-LocationBarViewIOS::LocationBarViewIOS(OmniboxTextFieldIOS* field,
- ios::ChromeBrowserState* browser_state,
- id<PreloadProvider> preloader,
- id<OmniboxPopupPositioner> positioner,
- id<LocationBarDelegate> delegate)
- : edit_view_(new OmniboxViewIOS(field,
- this,
- browser_state,
- preloader,
- positioner)),
- field_(field),
- delegate_(delegate) {
- DCHECK([delegate_ toolbarModel]);
- show_hint_text_ = true;
-
- InstallLocationIcon();
- CreateClearTextIcon(browser_state->IsOffTheRecord());
-}
-
-LocationBarViewIOS::~LocationBarViewIOS() {}
-
-void LocationBarViewIOS::HideKeyboardAndEndEditing() {
- edit_view_->HideKeyboardAndEndEditing();
-}
-
-void LocationBarViewIOS::SetShouldShowHintText(bool show_hint_text) {
- show_hint_text_ = show_hint_text;
-}
-
-const OmniboxView* LocationBarViewIOS::GetLocationEntry() const {
- return edit_view_.get();
-}
-
-OmniboxView* LocationBarViewIOS::GetLocationEntry() {
- return edit_view_.get();
-}
-
-void LocationBarViewIOS::OnToolbarUpdated() {
- edit_view_->UpdateAppearance();
- OnChanged();
-}
-
-void LocationBarViewIOS::OnAutocompleteAccept(
- const GURL& gurl,
- WindowOpenDisposition disposition,
- ui::PageTransition transition,
- AutocompleteMatchType::Type type) {
- if (gurl.is_valid()) {
- transition = ui::PageTransitionFromInt(
- transition | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR);
- [delegate_ loadGURLFromLocationBar:gurl transition:transition];
- }
-}
-
-void LocationBarViewIOS::OnChanged() {
- const bool page_is_offline = IsCurrentPageOffline(GetWebState());
- const int resource_id = edit_view_->GetIcon(page_is_offline);
- [field_ setPlaceholderImage:resource_id];
-
- // TODO(rohitrao): Can we get focus information from somewhere other than the
- // model?
- if (!IsIPadIdiom() && !edit_view_->model()->has_focus()) {
- ToolbarModel* toolbarModel = [delegate_ toolbarModel];
- if (toolbarModel) {
- bool show_icon_for_state = security_state::ShouldAlwaysShowIcon(
- toolbarModel->GetSecurityLevel(false));
- bool page_has_downgraded_HTTPS =
- experimental_flags::IsPageIconForDowngradedHTTPSEnabled() &&
- DoesCurrentPageHaveCertInfo(GetWebState());
- if (show_icon_for_state || page_has_downgraded_HTTPS || page_is_offline) {
- [field_ showPlaceholderImage];
- is_showing_placeholder_while_collapsed_ = true;
- } else {
- [field_ hidePlaceholderImage];
- is_showing_placeholder_while_collapsed_ = false;
- }
- }
- }
- UpdateRightDecorations();
- [delegate_ locationBarChanged];
-
- NSString* placeholderText =
- show_hint_text_ ? l10n_util::GetNSString(IDS_OMNIBOX_EMPTY_HINT) : nil;
- [field_ setPlaceholder:placeholderText];
-}
-
-bool LocationBarViewIOS::IsShowingPlaceholderWhileCollapsed() {
- return is_showing_placeholder_while_collapsed_;
-}
-
-void LocationBarViewIOS::OnInputInProgress(bool in_progress) {
- if ([delegate_ toolbarModel])
- [delegate_ toolbarModel]->set_input_in_progress(in_progress);
- if (in_progress)
- [delegate_ locationBarBeganEdit];
-}
-
-void LocationBarViewIOS::OnKillFocus() {
- // Hide the location icon on phone. A subsequent call to OnChanged() will
- // bring the icon back if needed.
- if (!IsIPadIdiom()) {
- [field_ hidePlaceholderImage];
- is_showing_placeholder_while_collapsed_ = false;
- }
-
- // Update the placeholder icon.
- const int resource_id =
- edit_view_->GetIcon(IsCurrentPageOffline(GetWebState()));
- [field_ setPlaceholderImage:resource_id];
-
- // Show the placeholder text on iPad.
- if (IsIPadIdiom()) {
- NSString* placeholderText = l10n_util::GetNSString(IDS_OMNIBOX_EMPTY_HINT);
- [field_ setPlaceholder:placeholderText];
- }
-
- UpdateRightDecorations();
- [delegate_ locationBarHasResignedFirstResponder];
-}
-
-void LocationBarViewIOS::OnSetFocus() {
- // Show the location icon on phone.
- if (!IsIPadIdiom())
- [field_ showPlaceholderImage];
-
- // Update the placeholder icon.
- const int resource_id =
- edit_view_->GetIcon(IsCurrentPageOffline(GetWebState()));
- [field_ setPlaceholderImage:resource_id];
-
- // Hide the placeholder text on iPad.
- if (IsIPadIdiom()) {
- [field_ setPlaceholder:nil];
- }
- UpdateRightDecorations();
- [delegate_ locationBarHasBecomeFirstResponder];
-}
-
-const ToolbarModel* LocationBarViewIOS::GetToolbarModel() const {
- return [delegate_ toolbarModel];
-}
-
-ToolbarModel* LocationBarViewIOS::GetToolbarModel() {
- return [delegate_ toolbarModel];
-}
-
-web::WebState* LocationBarViewIOS::GetWebState() {
- return [delegate_ getWebState];
-}
-
-void LocationBarViewIOS::InstallLocationIcon() {
- // Set the placeholder for empty omnibox.
- UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom];
- UIImage* image = NativeImage(IDR_IOS_OMNIBOX_SEARCH);
- [button setImage:image forState:UIControlStateNormal];
- [button setFrame:CGRectMake(0, 0, image.size.width, image.size.height)];
- [button addTarget:nil
- action:@selector(chromeExecuteCommand:)
- forControlEvents:UIControlEventTouchUpInside];
- [button setTag:IDC_SHOW_PAGE_INFO];
- SetA11yLabelAndUiAutomationName(
- button, IDS_IOS_PAGE_INFO_SECURITY_BUTTON_ACCESSIBILITY_LABEL,
- @"Page Security Info");
- [button setIsAccessibilityElement:YES];
-
- // Set chip text options.
- [button setTitleColor:[UIColor colorWithWhite:0.631 alpha:1]
- forState:UIControlStateNormal];
- [button titleLabel].font =
- [[MDFRobotoFontLoader sharedInstance] regularFontOfSize:12];
- [field_ setLeftView:button];
-
- // The placeholder image is only shown when in edit mode on iPhone, and always
- // shown on iPad.
- if (IsIPadIdiom())
- [field_ setLeftViewMode:UITextFieldViewModeAlways];
- else
- [field_ setLeftViewMode:UITextFieldViewModeNever];
-}
-
-void LocationBarViewIOS::CreateClearTextIcon(bool is_incognito) {
- UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom];
- UIImage* omniBoxClearImage = is_incognito
- ? NativeImage(IDR_IOS_OMNIBOX_CLEAR_OTR)
- : NativeImage(IDR_IOS_OMNIBOX_CLEAR);
- UIImage* omniBoxClearPressedImage =
- is_incognito ? NativeImage(IDR_IOS_OMNIBOX_CLEAR_OTR_PRESSED)
- : NativeImage(IDR_IOS_OMNIBOX_CLEAR_PRESSED);
- [button setImage:omniBoxClearImage forState:UIControlStateNormal];
- [button setImage:omniBoxClearPressedImage forState:UIControlStateHighlighted];
-
- CGRect frame = CGRectZero;
- frame.size = CGSizeMake(kClearTextButtonWidth, kClearTextButtonHeight);
- [button setFrame:frame];
-
- clear_button_bridge_.reset(
- [[OmniboxClearButtonBridge alloc] initWithOmniboxView:edit_view_.get()]);
- [button addTarget:clear_button_bridge_
- action:@selector(clearText)
- forControlEvents:UIControlEventTouchUpInside];
- clear_text_button_.reset(button);
-
- SetA11yLabelAndUiAutomationName(clear_text_button_,
- IDS_IOS_ACCNAME_CLEAR_TEXT, @"Clear Text");
-}
-
-void LocationBarViewIOS::UpdateRightDecorations() {
- DCHECK(clear_text_button_);
- if (!edit_view_->model()->has_focus()) {
- // Do nothing for iPhone. The right view will be set to nil after the
- // omnibox animation is completed.
- if (IsIPadIdiom())
- [field_ setRightView:nil];
- } else if ([field_ displayedText].empty() &&
- ![field_ isShowingQueryRefinementChip]) {
- [field_ setRightView:nil];
- } else {
- [field_ setRightView:clear_text_button_];
- [clear_text_button_ setAlpha:1];
- }
-}
« no previous file with comments | « ios/chrome/browser/ui/omnibox/location_bar_view_ios.h ('k') | ios/chrome/browser/ui/omnibox/omnibox_view_ios.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698