| // Copyright 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. |
| |
| #include "ios/chrome/browser/infobars/infobar.h" |
| |
| #include <utility> |
| |
| #include "base/logging.h" |
| #include "components/infobars/core/confirm_infobar_delegate.h" |
| #include "components/translate/core/browser/translate_infobar_delegate.h" |
| #import "ios/chrome/browser/infobars/confirm_infobar_controller.h" |
| #include "ios/chrome/browser/infobars/infobar_controller.h" |
| #include "ios/chrome/browser/translate/translate_infobar_tags.h" |
| |
| #if !defined(__has_feature) || !__has_feature(objc_arc) |
| #error "This file requires ARC support." |
| #endif |
| |
| using infobars::InfoBar; |
| using infobars::InfoBarDelegate; |
| |
| InfoBarIOS::InfoBarIOS(std::unique_ptr<InfoBarDelegate> delegate) |
| : InfoBar(std::move(delegate)) {} |
| |
| InfoBarIOS::~InfoBarIOS() { |
| DCHECK(controller_); |
| [controller_ detachView]; |
| controller_.reset(); |
| } |
| |
| void InfoBarIOS::SetController(InfoBarController* controller) { |
| controller_.reset(controller); |
| } |
| |
| void InfoBarIOS::Layout(CGRect container_bounds) { |
| DCHECK(controller_); |
| if ([controller_ view]) { |
| [[controller_ view] setFrame:container_bounds]; |
| } else { |
| [controller_ layoutForDelegate:delegate() frame:container_bounds]; |
| } |
| SetBarTargetHeight([controller_ barHeight]); |
| } |
| |
| UIView* InfoBarIOS::view() { |
| DCHECK(controller_); |
| return [controller_ view]; |
| } |
| |
| void InfoBarIOS::RemoveView() { |
| DCHECK(controller_); |
| [controller_ removeView]; |
| } |
| |
| void InfoBarIOS::PlatformSpecificOnHeightsRecalculated() { |
| DCHECK(controller_); |
| [controller_ onHeightsRecalculated:bar_height()]; |
| } |
| |
| #pragma mark - InfoBarViewDelegate |
| |
| void InfoBarIOS::SetInfoBarTargetHeight(int height) { |
| SetBarTargetHeight(height); |
| } |
| |
| // Some infobar button was pressed. |
| void InfoBarIOS::InfoBarButtonDidPress(NSUInteger button_id) { |
| // Do not add new logic for specific info bar delegates. |
| // TODO(droger): Move the logic elsewhere, http://crbug.com/307552. |
| // If not owned, the infobar has already been removed. |
| if (!owner()) |
| return; |
| if (delegate()->AsConfirmInfoBarDelegate()) { |
| ConfirmInfoBarDelegate* confirmDelegate = |
| delegate()->AsConfirmInfoBarDelegate(); |
| if ((button_id == ConfirmInfoBarDelegate::BUTTON_OK && |
| confirmDelegate->Accept()) || |
| (button_id == ConfirmInfoBarDelegate::BUTTON_CANCEL && |
| delegate()->AsConfirmInfoBarDelegate()->Cancel())) { |
| RemoveSelf(); |
| } |
| } else if (delegate()->AsTranslateInfoBarDelegate()) { |
| translate::TranslateInfoBarDelegate* translateDelegate = |
| delegate()->AsTranslateInfoBarDelegate(); |
| switch (button_id) { |
| case TranslateInfoBarIOSTag::AFTER_DONE: |
| InfoBarDidCancel(); |
| break; |
| case TranslateInfoBarIOSTag::AFTER_REVERT: |
| translateDelegate->RevertTranslation(); |
| break; |
| case TranslateInfoBarIOSTag::BEFORE_ACCEPT: |
| translateDelegate->Translate(); |
| break; |
| case TranslateInfoBarIOSTag::BEFORE_DENY: |
| translateDelegate->TranslationDeclined(); |
| if (translateDelegate->ShouldShowNeverTranslateShortcut()) |
| translateDelegate->ShowNeverTranslateInfobar(); |
| else |
| RemoveSelf(); |
| break; |
| case TranslateInfoBarIOSTag::DENY_LANGUAGE: |
| translateDelegate->NeverTranslatePageLanguage(); |
| RemoveSelf(); |
| break; |
| case TranslateInfoBarIOSTag::DENY_WEBSITE: |
| if (!translateDelegate->IsSiteBlacklisted()) |
| translateDelegate->ToggleSiteBlacklist(); |
| RemoveSelf(); |
| break; |
| case TranslateInfoBarIOSTag::MESSAGE: |
| translateDelegate->MessageInfoBarButtonPressed(); |
| break; |
| default: |
| NOTREACHED() << "Unexpected Translate button label"; |
| break; |
| } |
| } |
| } |
| |
| void InfoBarIOS::InfoBarDidCancel() { |
| // If not owned, the infobar has already been removed. |
| if (!owner()) |
| return; |
| delegate()->InfoBarDismissed(); |
| RemoveSelf(); |
| } |