blob: 3fffcc28508f598f4145937d45ea5e5bb843a1d8 [file] [log] [blame]
// 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();
}