OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "ios/clean/chrome/browser/ui/tab/tab_coordinator.h" | 5 #import "ios/clean/chrome/browser/ui/tab/tab_coordinator.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "base/mac/foundation_util.h" | 9 #include "base/mac/foundation_util.h" |
10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
11 #include "ios/chrome/browser/chrome_url_constants.h" | 11 #include "ios/chrome/browser/chrome_url_constants.h" |
12 #import "ios/clean/chrome/browser/ui/animators/zoom_transition_animator.h" | 12 #import "ios/clean/chrome/browser/ui/animators/zoom_transition_animator.h" |
13 #import "ios/clean/chrome/browser/ui/commands/tab_commands.h" | 13 #import "ios/clean/chrome/browser/ui/commands/tab_commands.h" |
14 #import "ios/clean/chrome/browser/ui/find_in_page/find_in_page_coordinator.h" | 14 #import "ios/clean/chrome/browser/ui/find_in_page/find_in_page_coordinator.h" |
15 #import "ios/clean/chrome/browser/ui/ntp/ntp_coordinator.h" | 15 #import "ios/clean/chrome/browser/ui/ntp/ntp_coordinator.h" |
16 #import "ios/clean/chrome/browser/ui/tab/tab_container_view_controller.h" | 16 #import "ios/clean/chrome/browser/ui/tab/tab_container_view_controller.h" |
17 #import "ios/clean/chrome/browser/ui/tab_strip/tab_strip_coordinator.h" | 17 #import "ios/clean/chrome/browser/ui/tab_strip/tab_strip_coordinator.h" |
18 #import "ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.h" | 18 #import "ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.h" |
19 #import "ios/clean/chrome/browser/ui/web_contents/web_coordinator.h" | 19 #import "ios/clean/chrome/browser/ui/web_contents/web_coordinator.h" |
20 #import "ios/shared/chrome/browser/ui/browser_list/browser.h" | 20 #import "ios/shared/chrome/browser/ui/browser_list/browser.h" |
21 #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h" | 21 #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h" |
22 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal. h" | 22 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal. h" |
23 #import "ios/web/public/web_state/web_state.h" | 23 #import "ios/web/public/web_state/web_state.h" |
24 #import "ios/web/public/web_state/web_state_observer_bridge.h" | 24 #import "ios/web/public/web_state/web_state_observer_bridge.h" |
25 | 25 |
26 #if !defined(__has_feature) || !__has_feature(objc_arc) | 26 #if !defined(__has_feature) || !__has_feature(objc_arc) |
27 #error "This file requires ARC support." | 27 #error "This file requires ARC support." |
28 #endif | 28 #endif |
29 | 29 |
30 namespace { | |
31 // Placeholder "experiment" flag. Change this to YES to have the toolbar at the | |
32 // bottom. | |
33 const BOOL kUseBottomToolbar = NO; | |
34 } // namespace | |
35 | |
36 @interface TabCoordinator ()<CRWWebStateObserver, | 30 @interface TabCoordinator ()<CRWWebStateObserver, |
37 TabCommands, | 31 TabCommands, |
38 UIViewControllerTransitioningDelegate> | 32 UIViewControllerTransitioningDelegate> |
39 @property(nonatomic, strong) TabContainerViewController* viewController; | 33 @property(nonatomic, strong) TabContainerViewController* viewController; |
40 @property(nonatomic, weak) NTPCoordinator* ntpCoordinator; | 34 @property(nonatomic, weak) NTPCoordinator* ntpCoordinator; |
41 @property(nonatomic, weak) WebCoordinator* webCoordinator; | 35 @property(nonatomic, weak) WebCoordinator* webCoordinator; |
42 @end | 36 @end |
43 | 37 |
44 @implementation TabCoordinator { | 38 @implementation TabCoordinator { |
45 std::unique_ptr<web::WebStateObserverBridge> _webStateObserver; | 39 std::unique_ptr<web::WebStateObserverBridge> _webStateObserver; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
92 if (self.webState->GetLastCommittedURL() == GURL(kChromeUINewTabURL)) { | 86 if (self.webState->GetLastCommittedURL() == GURL(kChromeUINewTabURL)) { |
93 self.viewController.contentViewController = | 87 self.viewController.contentViewController = |
94 self.ntpCoordinator.viewController; | 88 self.ntpCoordinator.viewController; |
95 } | 89 } |
96 | 90 |
97 [super start]; | 91 [super start]; |
98 } | 92 } |
99 | 93 |
100 - (void)stop { | 94 - (void)stop { |
101 [super stop]; | 95 [super stop]; |
96 for (BrowserCoordinator* child in self.children) { | |
97 [self removeChildCoordinator:child]; | |
lpromero
2017/04/21 08:08:34
This is necessary to balance the addChildCoordinat
marq (ping after 24h)
2017/04/21 08:26:32
This goes away with crrev.com/2832473003, right?
lpromero
2017/04/21 09:00:26
In tests, this coordinator is never removed (becau
lpromero
2017/04/26 17:59:19
Kindly ping
lpromero
2017/05/03 09:15:39
Ping :)
| |
98 } | |
102 _webStateObserver.reset(); | 99 _webStateObserver.reset(); |
103 [self.browser->dispatcher() stopDispatchingToTarget:self]; | 100 [self.browser->dispatcher() stopDispatchingToTarget:self]; |
104 } | 101 } |
105 | 102 |
106 - (void)childCoordinatorDidStart:(BrowserCoordinator*)childCoordinator { | 103 - (void)childCoordinatorDidStart:(BrowserCoordinator*)childCoordinator { |
107 if ([childCoordinator isKindOfClass:[ToolbarCoordinator class]]) { | 104 if ([childCoordinator isKindOfClass:[ToolbarCoordinator class]]) { |
108 self.viewController.toolbarViewController = childCoordinator.viewController; | 105 self.viewController.toolbarViewController = childCoordinator.viewController; |
109 } else if ([childCoordinator isKindOfClass:[WebCoordinator class]] || | 106 } else if ([childCoordinator isKindOfClass:[WebCoordinator class]] || |
110 [childCoordinator isKindOfClass:[NTPCoordinator class]]) { | 107 [childCoordinator isKindOfClass:[NTPCoordinator class]]) { |
111 self.viewController.contentViewController = childCoordinator.viewController; | 108 self.viewController.contentViewController = childCoordinator.viewController; |
(...skipping 14 matching lines...) Expand all Loading... | |
126 } | 123 } |
127 } | 124 } |
128 | 125 |
129 - (BOOL)canAddOverlayCoordinator:(BrowserCoordinator*)overlayCoordinator { | 126 - (BOOL)canAddOverlayCoordinator:(BrowserCoordinator*)overlayCoordinator { |
130 // This coordinator will always accept overlay coordinators. | 127 // This coordinator will always accept overlay coordinators. |
131 return YES; | 128 return YES; |
132 } | 129 } |
133 | 130 |
134 #pragma mark - Experiment support | 131 #pragma mark - Experiment support |
135 | 132 |
136 // Create and return a new view controller for use as a tab container; | 133 - (BOOL)usesBottomToolbar { |
134 NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; | |
135 NSString* bottomToolbarPreference = | |
136 [defaults stringForKey:@"EnableBottomToolbar"]; | |
137 return [bottomToolbarPreference isEqualToString:@"Enabled"]; | |
138 } | |
139 | |
140 // Creates and returns a new view controller for use as a tab container; | |
137 // experimental configurations determine which subclass of | 141 // experimental configurations determine which subclass of |
138 // TabContainerViewController to return. | 142 // TabContainerViewController to return. |
139 - (TabContainerViewController*)newTabContainer { | 143 - (TabContainerViewController*)newTabContainer { |
140 if (kUseBottomToolbar) { | 144 if ([self usesBottomToolbar]) { |
141 return [[BottomToolbarTabViewController alloc] init]; | 145 return [[BottomToolbarTabViewController alloc] init]; |
142 } | 146 } |
143 return [[TopToolbarTabViewController alloc] init]; | 147 return [[TopToolbarTabViewController alloc] init]; |
144 } | 148 } |
145 | 149 |
146 #pragma mark - CRWWebStateObserver | 150 #pragma mark - CRWWebStateObserver |
147 | 151 |
148 // This will eventually be called in -didFinishNavigation and perhaps as an | 152 // This will eventually be called in -didFinishNavigation and perhaps as an |
149 // optimization in some equivalent to loadURL. | 153 // optimization in some equivalent to loadURL. |
150 - (void)webState:(web::WebState*)webState | 154 - (void)webState:(web::WebState*)webState |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
189 return animator; | 193 return animator; |
190 } | 194 } |
191 | 195 |
192 #pragma mark - TabCommands | 196 #pragma mark - TabCommands |
193 | 197 |
194 - (void)loadURL:(web::NavigationManager::WebLoadParams)params { | 198 - (void)loadURL:(web::NavigationManager::WebLoadParams)params { |
195 self.webState->GetNavigationManager()->LoadURLWithParams(params); | 199 self.webState->GetNavigationManager()->LoadURLWithParams(params); |
196 } | 200 } |
197 | 201 |
198 @end | 202 @end |
OLD | NEW |