| Index: ios/chrome/browser/ui/tab/tab_coordinator.mm
|
| diff --git a/ios/chrome/browser/ui/tab/tab_coordinator.mm b/ios/chrome/browser/ui/tab/tab_coordinator.mm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..59da7ef5a0fe5b6dbf1e895e46e90d7b572ac3e3
|
| --- /dev/null
|
| +++ b/ios/chrome/browser/ui/tab/tab_coordinator.mm
|
| @@ -0,0 +1,120 @@
|
| +// Copyright 2016 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.
|
| +
|
| +// ====== New Architecture =====
|
| +// = This code is only used in the new iOS Chrome architecture. =
|
| +// ============================================================================
|
| +
|
| +#import "ios/chrome/browser/ui/tab/tab_coordinator.h"
|
| +
|
| +#include <memory>
|
| +
|
| +#include "base/mac/foundation_util.h"
|
| +#include "base/memory/ptr_util.h"
|
| +#import "ios/chrome/browser/browser_coordinator+internal.h"
|
| +#import "ios/chrome/browser/ui/animators/zoom_transition_animator.h"
|
| +#import "ios/chrome/browser/ui/tab/tab_container_view_controller.h"
|
| +#import "ios/chrome/browser/ui/toolbar/toolbar_coordinator.h"
|
| +#import "ios/chrome/browser/ui/web_contents/web_coordinator.h"
|
| +#import "ios/web/public/web_state/web_state_observer_bridge.h"
|
| +
|
| +#if !defined(__has_feature) || !__has_feature(objc_arc)
|
| +#error "This file requires ARC support."
|
| +#endif
|
| +
|
| +namespace {
|
| +// Placeholder "experiment" flag. Change this to YES to have the toolbar at the
|
| +// bottom.
|
| +const BOOL kUseBottomToolbar = NO;
|
| +} // namespace
|
| +
|
| +@interface TabCoordinator ()<UIViewControllerTransitioningDelegate>
|
| +@property(nonatomic, strong) TabContainerViewController* viewController;
|
| +@end
|
| +
|
| +@implementation TabCoordinator {
|
| + std::unique_ptr<web::WebStateObserverBridge> _webStateObserver;
|
| +}
|
| +
|
| +@synthesize webState = _webState;
|
| +@synthesize presentationKey = _presentationKey;
|
| +@synthesize viewController = _viewController;
|
| +
|
| +- (void)start {
|
| + self.viewController = [self newTabContainer];
|
| + self.viewController.transitioningDelegate = self;
|
| + self.viewController.modalPresentationStyle = UIModalPresentationCustom;
|
| +
|
| + WebCoordinator* webCoordinator = [[WebCoordinator alloc] init];
|
| + webCoordinator.webState = self.webState;
|
| + [self addChildCoordinator:webCoordinator];
|
| + // Unset the root view controller, so |webCoordinator| doesn't present its
|
| + // view controller.
|
| + webCoordinator.rootViewController = nil;
|
| + [webCoordinator start];
|
| +
|
| + ToolbarCoordinator* toolbarCoordinator = [[ToolbarCoordinator alloc] init];
|
| + [self addChildCoordinator:toolbarCoordinator];
|
| + // TODO: Instead of this, let WebMediator maintain a set of webStateObservers
|
| + // and just provide -addObserver and -stopObserving methods.
|
| + _webStateObserver = base::MakeUnique<web::WebStateObserverBridge>(
|
| + self.webState, toolbarCoordinator);
|
| + // Unset the .base view controller, so |toolbarCoordinator| doesn't present
|
| + // its view controller.
|
| + toolbarCoordinator.rootViewController = nil;
|
| + [toolbarCoordinator start];
|
| +
|
| + self.viewController.toolbarViewController = toolbarCoordinator.viewController;
|
| + self.viewController.contentViewController = webCoordinator.viewController;
|
| +
|
| + [self.rootViewController presentViewController:self.viewController
|
| + animated:YES
|
| + completion:nil];
|
| +}
|
| +
|
| +- (void)stop {
|
| + [self.viewController dismissViewControllerAnimated:YES completion:nil];
|
| + _webStateObserver.reset();
|
| +}
|
| +
|
| +- (BOOL)canAddOverlayCoordinator:(BrowserCoordinator*)overlayCoordinator {
|
| + // This coordinator will always accept overlay coordinators.
|
| + return YES;
|
| +}
|
| +
|
| +#pragma mark - Experiment support
|
| +
|
| +// Create and return a new view controller for use as a tab container;
|
| +// experimental configurations determine which subclass of
|
| +// TabContainerViewController to return.
|
| +- (TabContainerViewController*)newTabContainer {
|
| + if (kUseBottomToolbar) {
|
| + return [[BottomToolbarTabViewController alloc] init];
|
| + }
|
| + return [[TopToolbarTabViewController alloc] init];
|
| +}
|
| +
|
| +#pragma mark - UIViewControllerTransitioningDelegate
|
| +
|
| +- (id<UIViewControllerAnimatedTransitioning>)
|
| +animationControllerForPresentedController:(UIViewController*)presented
|
| + presentingController:(UIViewController*)presenting
|
| + sourceController:(UIViewController*)source {
|
| + ZoomTransitionAnimator* animator = [[ZoomTransitionAnimator alloc] init];
|
| + animator.presenting = YES;
|
| + animator.presentationKey = self.presentationKey;
|
| + [animator selectDelegate:@[ source, presenting ]];
|
| + return animator;
|
| +}
|
| +
|
| +- (id<UIViewControllerAnimatedTransitioning>)
|
| +animationControllerForDismissedController:(UIViewController*)dismissed {
|
| + ZoomTransitionAnimator* animator = [[ZoomTransitionAnimator alloc] init];
|
| + animator.presenting = NO;
|
| + animator.presentationKey = self.presentationKey;
|
| + [animator selectDelegate:@[ dismissed.presentingViewController ]];
|
| + return animator;
|
| +}
|
| +
|
| +@end
|
|
|