Fix disappearing omnibox on iPhone X.
The old-school layout logic in BVC was also re-inserting views on each
update, which is unnecessary, and in some cases causes views to show up
in the wrong z-order. Insert only needs to happen on initial layout,
so gating this in a flag should fix the issues.
Bug: 782373
Change-Id: I326f3b9199717c0ad014267fa0239581574a826d
Reviewed-on: https://chromium-review.googlesource.com/763711
Reviewed-by: Stepan Khapugin <[email protected]>
Reviewed-by: Mark Cogan <[email protected]>
Commit-Queue: Justin Cohen <[email protected]>
Cr-Commit-Position: refs/heads/master@{#515987}
diff --git a/ios/chrome/browser/ui/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view_controller.mm
index 3133b2a6..c5bdd7f5 100644
--- a/ios/chrome/browser/ui/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view_controller.mm
@@ -686,8 +686,9 @@
// Updates view-related functionality with the given tab model and browser
// state. The view must have been loaded. Uses |_browserState| and |_model|.
- (void)addUIFunctionalityForModelAndBrowserState;
-// Sets the correct frame and hierarchy for subviews and helper views.
-- (void)setUpViewLayout;
+// Sets the correct frame and hierarchy for subviews and helper views. Only
+// insert views on |initialLayout|.
+- (void)setUpViewLayout:(BOOL)initialLayout;
// Makes |tab| the currently visible tab, displaying its view. Calls
// -selectedTabChanged on the toolbar only if |newSelection| is YES.
- (void)displayTab:(Tab*)tab isNewSelection:(BOOL)newSelection;
@@ -1308,7 +1309,7 @@
// Install fake status bar for iPad iOS7
[self installFakeStatusBar];
[self buildToolbarAndTabStrip];
- [self setUpViewLayout];
+ [self setUpViewLayout:YES];
if (IsSafeAreaCompatibleToolbarEnabled()) {
[self addConstraintsToToolbar];
}
@@ -1331,7 +1332,7 @@
// Gate this behind iPhone X, since it's currently the only device that
// needs layout updates here after startup.
if (IsIPhoneX()) {
- [self setUpViewLayout];
+ [self setUpViewLayout:NO];
}
if (IsSafeAreaCompatibleToolbarEnabled()) {
// TODO(crbug.com/778236): Check if this call can be removed once the
@@ -2042,7 +2043,7 @@
}
// Set the frame for the various views. View must be loaded.
-- (void)setUpViewLayout {
+- (void)setUpViewLayout:(BOOL)initialLayout {
DCHECK([self isViewLoaded]);
CGFloat widthOfView = CGRectGetWidth([self view].bounds);
CGFloat minY = [self headerOffset];
@@ -2058,7 +2059,8 @@
// Position the toolbar next, either at the top of the browser view or
// directly under the tabstrip.
- [self addChildViewController:_toolbarCoordinator.toolbarViewController];
+ if (initialLayout)
+ [self addChildViewController:_toolbarCoordinator.toolbarViewController];
CGRect toolbarFrame = _toolbarCoordinator.toolbarViewController.view.frame;
toolbarFrame.origin = CGPointMake(0, minY);
toolbarFrame.size.width = widthOfView;
@@ -2068,14 +2070,17 @@
// Place the infobar container above the content area.
InfoBarContainerView* infoBarContainerView = _infoBarContainer->view();
- [self.view insertSubview:infoBarContainerView aboveSubview:_contentArea];
+ if (initialLayout)
+ [self.view insertSubview:infoBarContainerView aboveSubview:_contentArea];
// Place the toolbar controller above the infobar container.
- [[self view] insertSubview:_toolbarCoordinator.toolbarViewController.view
- aboveSubview:infoBarContainerView];
+ if (initialLayout)
+ [[self view] insertSubview:_toolbarCoordinator.toolbarViewController.view
+ aboveSubview:infoBarContainerView];
minY += CGRectGetHeight(toolbarFrame);
- [_toolbarCoordinator.toolbarViewController
- didMoveToParentViewController:self];
+ if (initialLayout)
+ [_toolbarCoordinator.toolbarViewController
+ didMoveToParentViewController:self];
// Account for the toolbar's drop shadow. The toolbar overlaps with the web
// content slightly.
@@ -2098,7 +2103,8 @@
// Attach the typing shield to the content area but have it hidden.
[_typingShield setFrame:[_contentArea frame]];
- [[self view] insertSubview:_typingShield aboveSubview:_contentArea];
+ if (initialLayout)
+ [[self view] insertSubview:_typingShield aboveSubview:_contentArea];
[_typingShield setHidden:YES];
_typingShield.accessibilityIdentifier = @"Typing Shield";
_typingShield.accessibilityLabel = l10n_util::GetNSString(IDS_CANCEL);