Commit dfafd36d authored by sczs's avatar sczs Committed by Commit Bot

[ios] Creates InfobarContainerCoordinator unittests.

This CL also makes some improvements to InfobarContainerCoordinator so
the test can pass:
- isPresentingInfobarBanner is now directly based on the ChildCoordinator
Banner presentation and not just the existence of a VC.
- A disconnect method is added to make sure the mediator stops observing
WebStateList before being dealloced (This is a common pattern throughout
mediators since the memory de-alloaction order in unittest can cause this)
- Adds a legacyContainerFullscrenSupportDisabled to disable FullScreen
support in the legacyContainer. This is needed to avoid a crash after
cleaning up each test case, in order to properly fix this we'd need to
know when the legacyContainer has been dismissed, that would require
some refactoring and the effort/risk is not worth it at this point.
- Removes a DCHECK in the legacyContainer since now the count of total
Infobars doesn't necessarily match the count of total Infobars in the
legacy Container. This because one of them can be a message. The iOS
implementation of the container was merely sending infobar.count() for
position, meaning we were never using position anyways.

Bug: 911864
Change-Id: Ie46c9dc88d2f5277401eb1d08aa54a09d4dbaf82
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1566756
Commit-Queue: Sergio Collazos <sczs@chromium.org>
Reviewed-by: default avatarPeter Lee <pkl@chromium.org>
Reviewed-by: default avatarChris Lu <thegreenfrog@chromium.org>
Cr-Commit-Position: refs/heads/master@{#652604}
parent c7f7bcc3
...@@ -94,10 +94,27 @@ source_set("unit_tests") { ...@@ -94,10 +94,27 @@ source_set("unit_tests") {
testonly = true testonly = true
sources = [ sources = [
"confirm_infobar_view_unittest.mm", "confirm_infobar_view_unittest.mm",
"infobar_container_coordinator_unittest.mm",
] ]
deps = [ deps = [
":feature_flags",
":infobars",
":infobars_ui", ":infobars_ui",
":public",
":test_support",
"//base/test:test_support",
"//ios/chrome/browser/browser_state:test_support",
"//ios/chrome/browser/infobars",
"//ios/chrome/browser/infobars:badge",
"//ios/chrome/browser/ui/commands",
"//ios/chrome/browser/ui/infobars/coordinators",
"//ios/chrome/browser/web_state_list",
"//ios/chrome/browser/web_state_list:test_support",
"//ios/chrome/test:test_support",
"//ios/web/public/test/fakes",
"//testing/gtest",
"//testing/gtest", "//testing/gtest",
"//third_party/ocmock",
] ]
} }
......
...@@ -80,6 +80,10 @@ class InfoBarDelegate; ...@@ -80,6 +80,10 @@ class InfoBarDelegate;
// baseViewController will be set on init. // baseViewController will be set on init.
@property(nonatomic, weak) UIViewController* baseViewController; @property(nonatomic, weak) UIViewController* baseViewController;
// YES if an InfobarBanner is being presented.
@property(nonatomic, assign, getter=isPresentingInfobarBanner)
BOOL presentingInfobarBanner;
@end @end
#endif // IOS_CHROME_BROWSER_UI_INFOBARS_COORDINATORS_INFOBAR_COORDINATOR_H_ #endif // IOS_CHROME_BROWSER_UI_INFOBARS_COORDINATORS_INFOBAR_COORDINATOR_H_
...@@ -84,7 +84,11 @@ const CGFloat kBannerOverlapWithOmnibox = 5.0; ...@@ -84,7 +84,11 @@ const CGFloat kBannerOverlapWithOmnibox = 5.0;
self.bannerViewController.transitioningDelegate = self.bannerTransitionDriver; self.bannerViewController.transitioningDelegate = self.bannerTransitionDriver;
[self.baseViewController presentViewController:self.bannerViewController [self.baseViewController presentViewController:self.bannerViewController
animated:animated animated:animated
completion:completion]; completion:^{
self.presentingInfobarBanner = YES;
if (completion)
completion();
}];
} }
- (void)presentInfobarModal { - (void)presentInfobarModal {
...@@ -154,6 +158,7 @@ const CGFloat kBannerOverlapWithOmnibox = 5.0; ...@@ -154,6 +158,7 @@ const CGFloat kBannerOverlapWithOmnibox = 5.0;
[self.baseViewController [self.baseViewController
dismissViewControllerAnimated:animated dismissViewControllerAnimated:animated
completion:^{ completion:^{
weakSelf.presentingInfobarBanner = NO;
[weakSelf.badgeDelegate infobarBannerWasDismissed]; [weakSelf.badgeDelegate infobarBannerWasDismissed];
weakSelf.bannerTransitionDriver = nil; weakSelf.bannerTransitionDriver = nil;
animatedFullscreenDisabler_ = nullptr; animatedFullscreenDisabler_ = nullptr;
......
...@@ -13,4 +13,8 @@ extern const int kInfobarBackgroundColor; ...@@ -13,4 +13,8 @@ extern const int kInfobarBackgroundColor;
extern NSString* const kConfirmInfobarButton1AccessibilityIdentifier; extern NSString* const kConfirmInfobarButton1AccessibilityIdentifier;
extern NSString* const kConfirmInfobarButton2AccessibilityIdentifier; extern NSString* const kConfirmInfobarButton2AccessibilityIdentifier;
// The duration in seconds that the InfobarCoordinator banner will be presented
// for.
extern const NSTimeInterval kInfobarBannerPresentationDurationInSeconds;
#endif // IOS_CHROME_BROWSER_UI_INFOBARS_INFOBAR_CONSTANTS_H_ #endif // IOS_CHROME_BROWSER_UI_INFOBARS_INFOBAR_CONSTANTS_H_
...@@ -15,3 +15,5 @@ NSString* const kConfirmInfobarButton1AccessibilityIdentifier = ...@@ -15,3 +15,5 @@ NSString* const kConfirmInfobarButton1AccessibilityIdentifier =
@"confirmInfobarButton1AXID"; @"confirmInfobarButton1AXID";
NSString* const kConfirmInfobarButton2AccessibilityIdentifier = NSString* const kConfirmInfobarButton2AccessibilityIdentifier =
@"confirmInfobarButton2AXID"; @"confirmInfobarButton2AXID";
const NSTimeInterval kInfobarBannerPresentationDurationInSeconds = 6.0;
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#import "ios/chrome/browser/ui/commands/command_dispatcher.h" #import "ios/chrome/browser/ui/commands/command_dispatcher.h"
#import "ios/chrome/browser/ui/fullscreen/fullscreen_controller_factory.h" #import "ios/chrome/browser/ui/fullscreen/fullscreen_controller_factory.h"
#import "ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.h" #import "ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.h"
#import "ios/chrome/browser/ui/infobars/infobar_constants.h"
#import "ios/chrome/browser/ui/infobars/infobar_container_consumer.h" #import "ios/chrome/browser/ui/infobars/infobar_container_consumer.h"
#include "ios/chrome/browser/ui/infobars/infobar_container_mediator.h" #include "ios/chrome/browser/ui/infobars/infobar_container_mediator.h"
#import "ios/chrome/browser/ui/infobars/infobar_feature.h" #import "ios/chrome/browser/ui/infobars/infobar_feature.h"
...@@ -23,12 +24,6 @@ ...@@ -23,12 +24,6 @@
#error "This file requires ARC support." #error "This file requires ARC support."
#endif #endif
namespace {
// The duration in seconds that the InfobarCoordinator banner will be presented
// for.
const double kBannerPresentationDurationInSeconds = 6.0;
} // namespace
@interface InfobarContainerCoordinator () <InfobarContainerConsumer> @interface InfobarContainerCoordinator () <InfobarContainerConsumer>
@property(nonatomic, assign) WebStateList* webStateList; @property(nonatomic, assign) WebStateList* webStateList;
...@@ -42,6 +37,10 @@ const double kBannerPresentationDurationInSeconds = 6.0; ...@@ -42,6 +37,10 @@ const double kBannerPresentationDurationInSeconds = 6.0;
@property(nonatomic, strong) InfobarContainerMediator* mediator; @property(nonatomic, strong) InfobarContainerMediator* mediator;
// The dispatcher for this Coordinator. // The dispatcher for this Coordinator.
@property(nonatomic, weak) id<ApplicationCommands> dispatcher; @property(nonatomic, weak) id<ApplicationCommands> dispatcher;
// If YES the legacyContainer Fullscreen support will be disabled.
// TODO(crbug.com/927064): Remove this once the legacy container is no longer
// needed.
@property(nonatomic, assign) BOOL legacyContainerFullscrenSupportDisabled;
@end @end
...@@ -76,6 +75,8 @@ const double kBannerPresentationDurationInSeconds = 6.0; ...@@ -76,6 +75,8 @@ const double kBannerPresentationDurationInSeconds = 6.0;
aboveSubview:self.positioner.parentView]; aboveSubview:self.positioner.parentView];
[legacyContainer didMoveToParentViewController:self.baseViewController]; [legacyContainer didMoveToParentViewController:self.baseViewController];
legacyContainer.positioner = self.positioner; legacyContainer.positioner = self.positioner;
legacyContainer.disableFullscreenSupport =
self.legacyContainerFullscrenSupportDisabled;
self.legacyContainerViewController = legacyContainer; self.legacyContainerViewController = legacyContainer;
// Creates the mediator using both consumers. // Creates the mediator using both consumers.
...@@ -92,7 +93,14 @@ const double kBannerPresentationDurationInSeconds = 6.0; ...@@ -92,7 +93,14 @@ const double kBannerPresentationDurationInSeconds = 6.0;
- (void)stop { - (void)stop {
[[UpgradeCenter sharedInstance] unregisterClient:self.mediator]; [[UpgradeCenter sharedInstance] unregisterClient:self.mediator];
self.mediator = nil; [self.mediator disconnect];
if (!self.legacyContainerViewController)
return;
[self.legacyContainerViewController willMoveToParentViewController:nil];
[self.legacyContainerViewController.view removeFromSuperview];
[self.legacyContainerViewController removeFromParentViewController];
self.legacyContainerViewController = nil;
} }
#pragma mark - Public Interface #pragma mark - Public Interface
...@@ -149,7 +157,9 @@ const double kBannerPresentationDurationInSeconds = 6.0; ...@@ -149,7 +157,9 @@ const double kBannerPresentationDurationInSeconds = 6.0;
- (BOOL)isPresentingInfobarBanner { - (BOOL)isPresentingInfobarBanner {
DCHECK(IsInfobarUIRebootEnabled()); DCHECK(IsInfobarUIRebootEnabled());
_presentingInfobarBanner = self.infobarViewController ? YES : NO; InfobarCoordinator* infobarCoordinator =
static_cast<InfobarCoordinator*>(self.activeChildCoordinator);
_presentingInfobarBanner = [infobarCoordinator isPresentingInfobarBanner];
return _presentingInfobarBanner; return _presentingInfobarBanner;
} }
...@@ -169,10 +179,11 @@ const double kBannerPresentationDurationInSeconds = 6.0; ...@@ -169,10 +179,11 @@ const double kBannerPresentationDurationInSeconds = 6.0;
self.infobarViewController = infobarCoordinator.bannerViewController; self.infobarViewController = infobarCoordinator.bannerViewController;
[self.childCoordinators addObject:infobarCoordinator]; [self.childCoordinators addObject:infobarCoordinator];
// Dismissed the presented InfobarCoordinator banner after // Dismisses the presented InfobarCoordinator banner after
// kBannerPresentationDuration seconds. // kInfobarBannerPresentationDurationInSeconds seconds.
dispatch_time_t popTime = dispatch_time( dispatch_time_t popTime =
DISPATCH_TIME_NOW, kBannerPresentationDurationInSeconds * NSEC_PER_SEC); dispatch_time(DISPATCH_TIME_NOW,
kInfobarBannerPresentationDurationInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void) { dispatch_after(popTime, dispatch_get_main_queue(), ^(void) {
[infobarCoordinator dismissInfobarBannerAfterInteraction]; [infobarCoordinator dismissInfobarBannerAfterInteraction];
}); });
......
// Copyright 2019 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 "ios/chrome/browser/ui/infobars/infobar_container_coordinator.h"
#import "base/test/ios/wait_util.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/scoped_task_environment.h"
#include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
#include "ios/chrome/browser/infobars/confirm_infobar_controller.h"
#include "ios/chrome/browser/infobars/infobar.h"
#include "ios/chrome/browser/infobars/infobar_badge_tab_helper.h"
#include "ios/chrome/browser/infobars/infobar_manager_impl.h"
#import "ios/chrome/browser/ui/commands/command_dispatcher.h"
#import "ios/chrome/browser/ui/infobars/coordinators/infobar_confirm_coordinator.h"
#import "ios/chrome/browser/ui/infobars/infobar_constants.h"
#import "ios/chrome/browser/ui/infobars/infobar_feature.h"
#import "ios/chrome/browser/ui/infobars/infobar_positioner.h"
#import "ios/chrome/browser/ui/infobars/test_infobar_delegate.h"
#import "ios/chrome/browser/web_state_list/fake_web_state_list_delegate.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h"
#import "ios/chrome/browser/web_state_list/web_state_opener.h"
#import "ios/chrome/test/scoped_key_window.h"
#import "ios/web/public/test/fakes/test_navigation_manager.h"
#import "ios/web/public/test/fakes/test_web_state.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/platform_test.h"
#import "third_party/ocmock/OCMock/OCMock.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
// Exposed for testing.
@interface InfobarContainerCoordinator (Testing)
@property(nonatomic, assign) BOOL legacyContainerFullscrenSupportDisabled;
@end
// Test ContainerCoordinatorPositioner.
@interface TestContainerCoordinatorPositioner : NSObject <InfobarPositioner>
@property(nonatomic, strong) UIView* baseView;
@end
@implementation TestContainerCoordinatorPositioner
- (UIView*)parentView {
return self.baseView;
}
@end
// Test fixture for testing InfobarContainerCoordinatorTest.
class InfobarContainerCoordinatorTest : public PlatformTest {
protected:
InfobarContainerCoordinatorTest()
: browser_state_(TestChromeBrowserState::Builder().Build()),
web_state_list_(
std::make_unique<WebStateList>(&web_state_list_delegate_)),
base_view_controller_([[UIViewController alloc] init]),
positioner_([[TestContainerCoordinatorPositioner alloc] init]) {
// Enable kInfobarUIReboot flag.
feature_list_.InitAndEnableFeature(kInfobarUIReboot);
// Setup WebstateList, Webstate and NavigationManager (Needed for
// InfobarManager).
std::unique_ptr<web::TestWebState> web_state =
std::make_unique<web::TestWebState>();
std::unique_ptr<web::TestNavigationManager> navigation_manager =
std::make_unique<web::TestNavigationManager>();
navigation_manager->SetBrowserState(browser_state_.get());
navigation_manager_ = navigation_manager.get();
web_state->SetNavigationManager(std::move(navigation_manager));
web_state->SetBrowserState(browser_state_.get());
web_state_list_->InsertWebState(0, std::move(web_state),
WebStateList::INSERT_NO_FLAGS,
WebStateOpener());
web_state_list_->ActivateWebStateAt(0);
// Setup InfobarBadgeTabHelper and InfoBarManager
InfobarBadgeTabHelper::CreateForWebState(
web_state_list_->GetActiveWebState());
InfoBarManagerImpl::CreateForWebState(web_state_list_->GetActiveWebState());
// Setup the InfobarContainerCoordinator.
infobar_container_coordinator_ = [[InfobarContainerCoordinator alloc]
initWithBaseViewController:base_view_controller_
browserState:browser_state_.get()
webStateList:web_state_list_.get()];
[scoped_key_window_.Get() setRootViewController:base_view_controller_];
positioner_.baseView = base_view_controller_.view;
infobar_container_coordinator_.positioner = positioner_;
infobar_container_coordinator_.commandDispatcher =
OCMClassMock([CommandDispatcher class]);
infobar_container_coordinator_.legacyContainerFullscrenSupportDisabled =
YES;
[infobar_container_coordinator_ start];
// Setup the InfobarCoordinator and InfobarDelegate.
TestInfoBarDelegate* test_infobar_delegate =
new TestInfoBarDelegate(@"Title");
coordinator_ = [[InfobarConfirmCoordinator alloc]
initWithInfoBarDelegate:test_infobar_delegate];
infobar_delegate_ =
std::unique_ptr<ConfirmInfoBarDelegate>(test_infobar_delegate);
// Setup the Legacy InfobarController and InfobarDelegate.
TestInfoBarDelegate* test_legacy_infobar_delegate =
new TestInfoBarDelegate(@"Legacy Infobar");
legacy_controller_ = [[ConfirmInfoBarController alloc]
initWithInfoBarDelegate:test_legacy_infobar_delegate];
legacy_infobar_delegate_ =
std::unique_ptr<ConfirmInfoBarDelegate>(test_legacy_infobar_delegate);
}
~InfobarContainerCoordinatorTest() override {
// Make sure InfobarBanner has been dismissed.
if (infobar_container_coordinator_.presentingInfobarBanner) {
[infobar_container_coordinator_ dismissInfobarBannerAnimated:NO
completion:nil];
EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
base::test::ios::kWaitForUIElementTimeout, ^bool {
return ![infobar_container_coordinator_ isPresentingInfobarBanner];
}));
}
[infobar_container_coordinator_ stop];
}
// Adds an Infobar to the InfobarManager, triggering an InfobarBanner
// presentation.
void AddInfobar() {
GetInfobarManager()->AddInfoBar(std::make_unique<InfoBarIOS>(
coordinator_, std::move(infobar_delegate_)));
}
// Adds a Legacy Infobar to the InfobarManager, triggering an InfobarBanner
// presentation.
void AddLegacyInfobar() {
GetInfobarManager()->AddInfoBar(std::make_unique<InfoBarIOS>(
legacy_controller_, std::move(legacy_infobar_delegate_)));
}
// Returns InfoBarManager attached to web_state_.
infobars::InfoBarManager* GetInfobarManager() {
return InfoBarManagerImpl::FromWebState(
web_state_list_->GetActiveWebState());
}
base::test::ScopedTaskEnvironment environment_;
std::unique_ptr<ios::ChromeBrowserState> browser_state_;
InfobarContainerCoordinator* infobar_container_coordinator_;
base::test::ScopedFeatureList feature_list_;
std::unique_ptr<WebStateList> web_state_list_;
FakeWebStateListDelegate web_state_list_delegate_;
web::TestNavigationManager* navigation_manager_;
ScopedKeyWindow scoped_key_window_;
UIViewController* base_view_controller_;
TestContainerCoordinatorPositioner* positioner_;
InfobarConfirmCoordinator* coordinator_;
std::unique_ptr<ConfirmInfoBarDelegate> infobar_delegate_;
ConfirmInfoBarController* legacy_controller_;
std::unique_ptr<ConfirmInfoBarDelegate> legacy_infobar_delegate_;
};
// Tests isPresentingInfobarBanner returns YES once an InfobarBanner is
// presented.
TEST_F(InfobarContainerCoordinatorTest, TestIsPresentingInfobarBanner) {
EXPECT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
this->AddInfobar();
ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
base::test::ios::kWaitForUIElementTimeout, ^bool {
return [infobar_container_coordinator_ isPresentingInfobarBanner];
}));
ASSERT_TRUE([infobar_container_coordinator_ isPresentingInfobarBanner]);
}
// Tests that the InfobarBanner is automatically dismissed after
// kInfobarBannerPresentationDurationInSeconds seconds.
TEST_F(InfobarContainerCoordinatorTest, TestAutomaticInfobarBannerDismissal) {
EXPECT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
this->AddInfobar();
EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
base::test::ios::kWaitForUIElementTimeout, ^bool {
return [infobar_container_coordinator_ isPresentingInfobarBanner];
}));
ASSERT_TRUE([infobar_container_coordinator_ isPresentingInfobarBanner]);
EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
kInfobarBannerPresentationDurationInSeconds, ^bool {
return ![infobar_container_coordinator_ isPresentingInfobarBanner];
}));
ASSERT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
}
// Tests that the InfobarBanner is correctly dismissed after calling
// dismissInfobarBannerAnimated.
TEST_F(InfobarContainerCoordinatorTest, TestInfobarBannerDismissal) {
EXPECT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
this->AddInfobar();
EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
base::test::ios::kWaitForUIElementTimeout, ^bool {
return [infobar_container_coordinator_ isPresentingInfobarBanner];
}));
ASSERT_TRUE([infobar_container_coordinator_ isPresentingInfobarBanner]);
[infobar_container_coordinator_ dismissInfobarBannerAnimated:NO
completion:nil];
ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
base::test::ios::kWaitForUIElementTimeout, ^bool {
return ![infobar_container_coordinator_ isPresentingInfobarBanner];
}));
ASSERT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
}
// Tests that a legacy Infobar can be presented and isPresentingInfobarBanner is
// still NO.
TEST_F(InfobarContainerCoordinatorTest, TestLegacyInfobarPresentation) {
EXPECT_FALSE([infobar_container_coordinator_
isInfobarPresentingForWebState:web_state_list_->GetActiveWebState()]);
EXPECT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
this->AddLegacyInfobar();
EXPECT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
EXPECT_TRUE([infobar_container_coordinator_
isInfobarPresentingForWebState:web_state_list_->GetActiveWebState()]);
}
// Tests that the presentation of a LegacyInfobar doesn't dismiss the previously
// presented InfobarBanner.
TEST_F(InfobarContainerCoordinatorTest,
TestInfobarBannerPresentationBeforeLegacyPresentation) {
EXPECT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
this->AddInfobar();
ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
base::test::ios::kWaitForUIElementTimeout, ^bool {
return [infobar_container_coordinator_ isPresentingInfobarBanner];
}));
ASSERT_TRUE([infobar_container_coordinator_ isPresentingInfobarBanner]);
this->AddLegacyInfobar();
EXPECT_TRUE([infobar_container_coordinator_ isPresentingInfobarBanner]);
}
// Tests that a presented LegacyInfobar doesn't interfere with presenting an
// InfobarBanner.
TEST_F(InfobarContainerCoordinatorTest,
TestInfobarBannerPresentationAfterLegacyPresentation) {
EXPECT_FALSE([infobar_container_coordinator_
isInfobarPresentingForWebState:web_state_list_->GetActiveWebState()]);
this->AddLegacyInfobar();
ASSERT_TRUE([infobar_container_coordinator_
isInfobarPresentingForWebState:web_state_list_->GetActiveWebState()]);
ASSERT_FALSE([infobar_container_coordinator_ isPresentingInfobarBanner]);
this->AddInfobar();
ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
base::test::ios::kWaitForUIElementTimeout, ^bool {
return [infobar_container_coordinator_ isPresentingInfobarBanner];
}));
ASSERT_TRUE([infobar_container_coordinator_ isPresentingInfobarBanner]);
}
...@@ -35,6 +35,9 @@ class WebStateList; ...@@ -35,6 +35,9 @@ class WebStateList;
// The SigninPresenter delegate for this Mediator. // The SigninPresenter delegate for this Mediator.
@property(nonatomic, weak) id<SigninPresenter> signinPresenter; @property(nonatomic, weak) id<SigninPresenter> signinPresenter;
// Stops observing all objects.
- (void)disconnect;
@end @end
#endif // IOS_CHROME_BROWSER_UI_INFOBARS_INFOBAR_CONTAINER_MEDIATOR_H_ #endif // IOS_CHROME_BROWSER_UI_INFOBARS_INFOBAR_CONTAINER_MEDIATOR_H_
...@@ -57,8 +57,15 @@ ...@@ -57,8 +57,15 @@
} }
- (void)dealloc { - (void)dealloc {
[self disconnect];
}
- (void)disconnect {
if (_webStateList) {
_webStateList->RemoveObserver(_webStateListObserver.get()); _webStateList->RemoveObserver(_webStateListObserver.get());
_webStateListObserver.reset(); _webStateListObserver.reset();
_webStateList = nullptr;
}
} }
#pragma mark - WebStateListObserver #pragma mark - WebStateListObserver
......
...@@ -32,6 +32,9 @@ class FullscreenController; ...@@ -32,6 +32,9 @@ class FullscreenController;
// The delegate used to position the InfoBarContainer in the view. // The delegate used to position the InfoBarContainer in the view.
@property(nonatomic, weak) id<InfobarPositioner> positioner; @property(nonatomic, weak) id<InfobarPositioner> positioner;
// If YES the Container Fullscreen support will be disabled.
@property(nonatomic, assign) BOOL disableFullscreenSupport;
@end @end
#endif // IOS_CHROME_BROWSER_UI_INFOBARS_LEGACY_INFOBAR_CONTAINER_VIEW_CONTROLLER_H_ #endif // IOS_CHROME_BROWSER_UI_INFOBARS_LEGACY_INFOBAR_CONTAINER_VIEW_CONTROLLER_H_
...@@ -61,14 +61,14 @@ const CGFloat kAlphaChangeAnimationDuration = 0.35; ...@@ -61,14 +61,14 @@ const CGFloat kAlphaChangeAnimationDuration = 0.35;
[super viewDidAppear:animated]; [super viewDidAppear:animated];
self.visible = YES; self.visible = YES;
if (!_fullscreenObserver) { if (!_fullscreenObserver && !self.disableFullscreenSupport) {
_fullscreenObserver = std::make_unique<FullscreenUIUpdater>(self); _fullscreenObserver = std::make_unique<FullscreenUIUpdater>(self);
self.fullscreenController->AddObserver(_fullscreenObserver.get()); self.fullscreenController->AddObserver(_fullscreenObserver.get());
} }
} }
- (void)viewDidDisappear:(BOOL)animated { - (void)viewDidDisappear:(BOOL)animated {
if (_fullscreenObserver) { if (_fullscreenObserver && !self.disableFullscreenSupport) {
self.fullscreenController->RemoveObserver(_fullscreenObserver.get()); self.fullscreenController->RemoveObserver(_fullscreenObserver.get());
_fullscreenObserver = nullptr; _fullscreenObserver = nullptr;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment