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_grid/tab_grid_coordinator.h" | 5 #import "ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "base/mac/foundation_util.h" | |
9 #include "base/strings/sys_string_conversions.h" | 10 #include "base/strings/sys_string_conversions.h" |
10 #include "ios/chrome/browser/browser_state/chrome_browser_state.h" | 11 #include "ios/chrome/browser/browser_state/chrome_browser_state.h" |
11 #import "ios/chrome/browser/web_state_list/web_state_list.h" | 12 #import "ios/chrome/browser/web_state_list/web_state_list.h" |
13 #import "ios/clean/chrome/browser/ui/commands/context_menu_commands.h" | |
12 #import "ios/clean/chrome/browser/ui/commands/settings_commands.h" | 14 #import "ios/clean/chrome/browser/ui/commands/settings_commands.h" |
13 #import "ios/clean/chrome/browser/ui/commands/tab_grid_commands.h" | 15 #import "ios/clean/chrome/browser/ui/commands/tab_grid_commands.h" |
14 #import "ios/clean/chrome/browser/ui/commands/tools_menu_commands.h" | 16 #import "ios/clean/chrome/browser/ui/commands/tools_menu_commands.h" |
17 #import "ios/clean/chrome/browser/ui/context_menu/context_menu_context_impl.h" | |
15 #import "ios/clean/chrome/browser/ui/settings/settings_coordinator.h" | 18 #import "ios/clean/chrome/browser/ui/settings/settings_coordinator.h" |
16 #import "ios/clean/chrome/browser/ui/tab/tab_coordinator.h" | 19 #import "ios/clean/chrome/browser/ui/tab/tab_coordinator.h" |
17 #import "ios/clean/chrome/browser/ui/tab_grid/tab_grid_mediator.h" | 20 #import "ios/clean/chrome/browser/ui/tab_grid/tab_grid_mediator.h" |
18 #import "ios/clean/chrome/browser/ui/tab_grid/tab_grid_view_controller.h" | 21 #import "ios/clean/chrome/browser/ui/tab_grid/tab_grid_view_controller.h" |
19 #import "ios/clean/chrome/browser/ui/tools/tools_coordinator.h" | 22 #import "ios/clean/chrome/browser/ui/tools/tools_coordinator.h" |
20 #import "ios/shared/chrome/browser/ui/browser_list/browser.h" | 23 #import "ios/shared/chrome/browser/ui/browser_list/browser.h" |
21 #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h" | 24 #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h" |
22 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal. h" | 25 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal. h" |
23 #import "ios/shared/chrome/browser/ui/tools_menu/tools_menu_configuration.h" | 26 #import "ios/shared/chrome/browser/ui/tools_menu/tools_menu_configuration.h" |
24 #import "ios/web/public/navigation_manager.h" | 27 #import "ios/web/public/navigation_manager.h" |
25 #include "ios/web/public/web_state/web_state.h" | 28 #include "ios/web/public/web_state/web_state.h" |
26 #import "net/base/mac/url_conversions.h" | 29 #import "net/base/mac/url_conversions.h" |
27 #include "ui/base/page_transition_types.h" | 30 #include "ui/base/page_transition_types.h" |
28 | 31 |
29 #if !defined(__has_feature) || !__has_feature(objc_arc) | 32 #if !defined(__has_feature) || !__has_feature(objc_arc) |
30 #error "This file requires ARC support." | 33 #error "This file requires ARC support." |
31 #endif | 34 #endif |
32 | 35 |
33 @interface TabGridCoordinator ()<SettingsCommands, | 36 @interface TabGridCoordinator ()<ContextMenuCommands, |
37 SettingsCommands, | |
34 TabGridCommands, | 38 TabGridCommands, |
35 ToolsMenuCommands> | 39 ToolsMenuCommands> |
36 @property(nonatomic, strong) TabGridViewController* viewController; | 40 @property(nonatomic, strong) TabGridViewController* viewController; |
37 @property(nonatomic, weak) SettingsCoordinator* settingsCoordinator; | 41 @property(nonatomic, weak) SettingsCoordinator* settingsCoordinator; |
38 @property(nonatomic, weak) ToolsCoordinator* toolsMenuCoordinator; | 42 @property(nonatomic, weak) ToolsCoordinator* toolsMenuCoordinator; |
43 @property(nonatomic, weak) TabCoordinator* activeTabCoordinator; | |
39 @property(nonatomic, readonly) WebStateList& webStateList; | 44 @property(nonatomic, readonly) WebStateList& webStateList; |
40 @property(nonatomic, strong) TabGridMediator* mediator; | 45 @property(nonatomic, strong) TabGridMediator* mediator; |
41 @end | 46 @end |
42 | 47 |
43 @implementation TabGridCoordinator | 48 @implementation TabGridCoordinator |
44 @synthesize viewController = _viewController; | 49 @synthesize viewController = _viewController; |
45 @synthesize settingsCoordinator = _settingsCoordinator; | 50 @synthesize settingsCoordinator = _settingsCoordinator; |
46 @synthesize toolsMenuCoordinator = _toolsMenuCoordinator; | 51 @synthesize toolsMenuCoordinator = _toolsMenuCoordinator; |
52 @synthesize activeTabCoordinator = _activeTabCoordinator; | |
47 @synthesize mediator = _mediator; | 53 @synthesize mediator = _mediator; |
48 | 54 |
49 #pragma mark - Properties | 55 #pragma mark - Properties |
50 | 56 |
51 - (WebStateList&)webStateList { | 57 - (WebStateList&)webStateList { |
52 return self.browser->web_state_list(); | 58 return self.browser->web_state_list(); |
53 } | 59 } |
54 | 60 |
55 #pragma mark - BrowserCoordinator | 61 #pragma mark - BrowserCoordinator |
56 | 62 |
57 - (void)start { | 63 - (void)start { |
58 self.mediator = [[TabGridMediator alloc] init]; | 64 self.mediator = [[TabGridMediator alloc] init]; |
59 self.mediator.webStateList = &self.webStateList; | 65 self.mediator.webStateList = &self.webStateList; |
60 | 66 |
67 [self registerForContextMenuCommands]; | |
61 [self registerForSettingsCommands]; | 68 [self registerForSettingsCommands]; |
62 [self registerForTabGridCommands]; | 69 [self registerForTabGridCommands]; |
63 [self registerForToolsMenuCommands]; | 70 [self registerForToolsMenuCommands]; |
64 | 71 |
65 self.viewController = [[TabGridViewController alloc] init]; | 72 self.viewController = [[TabGridViewController alloc] init]; |
66 self.viewController.dispatcher = static_cast<id>(self.browser->dispatcher()); | 73 self.viewController.dispatcher = static_cast<id>(self.browser->dispatcher()); |
67 | 74 |
68 self.mediator.consumer = self.viewController; | 75 self.mediator.consumer = self.viewController; |
69 | 76 |
70 [super start]; | 77 [super start]; |
(...skipping 21 matching lines...) Expand all Loading... | |
92 | 99 |
93 - (void)childCoordinatorWillStop:(BrowserCoordinator*)childCoordinator { | 100 - (void)childCoordinatorWillStop:(BrowserCoordinator*)childCoordinator { |
94 DCHECK([childCoordinator isKindOfClass:[SettingsCoordinator class]] || | 101 DCHECK([childCoordinator isKindOfClass:[SettingsCoordinator class]] || |
95 [childCoordinator isKindOfClass:[TabCoordinator class]] || | 102 [childCoordinator isKindOfClass:[TabCoordinator class]] || |
96 [childCoordinator isKindOfClass:[ToolsCoordinator class]]); | 103 [childCoordinator isKindOfClass:[ToolsCoordinator class]]); |
97 [childCoordinator.viewController.presentingViewController | 104 [childCoordinator.viewController.presentingViewController |
98 dismissViewControllerAnimated:YES | 105 dismissViewControllerAnimated:YES |
99 completion:nil]; | 106 completion:nil]; |
100 } | 107 } |
101 | 108 |
109 #pragma mark - ContextMenuCommands | |
110 | |
111 - (void)openContextMenuLinkInNewTab:(ContextMenuContext*)context { | |
112 [self createAndShowNewTabInTabGrid]; | |
113 ContextMenuContextImpl* contextImpl = | |
114 base::mac::ObjCCastStrict<ContextMenuContextImpl>(context); | |
115 [self openURL:net::NSURLWithGURL(contextImpl.linkURL)]; | |
116 } | |
117 | |
118 - (void)openContextMenuImageInNewTab:(ContextMenuContext*)context { | |
119 [self createAndShowNewTabInTabGrid]; | |
120 ContextMenuContextImpl* contextImpl = | |
121 base::mac::ObjCCastStrict<ContextMenuContextImpl>(context); | |
122 [self openURL:net::NSURLWithGURL(contextImpl.imageURL)]; | |
123 } | |
124 | |
125 #pragma mark - SettingsCommands | |
kkhorimoto
2017/05/24 08:48:46
These were just moved to match the order in which
| |
126 | |
127 - (void)showSettings { | |
128 CommandDispatcher* dispatcher = self.browser->dispatcher(); | |
129 [dispatcher startDispatchingToTarget:self | |
130 forSelector:@selector(closeSettings)]; | |
131 SettingsCoordinator* settingsCoordinator = [[SettingsCoordinator alloc] init]; | |
132 [self addOverlayCoordinator:settingsCoordinator]; | |
133 self.settingsCoordinator = settingsCoordinator; | |
134 [settingsCoordinator start]; | |
135 } | |
136 | |
137 - (void)closeSettings { | |
138 CommandDispatcher* dispatcher = self.browser->dispatcher(); | |
139 [dispatcher stopDispatchingForSelector:@selector(closeSettings)]; | |
140 [self.settingsCoordinator stop]; | |
141 [self.settingsCoordinator.parentCoordinator | |
142 removeChildCoordinator:self.settingsCoordinator]; | |
143 // self.settingsCoordinator should be presumed to be nil after this point. | |
144 } | |
145 | |
102 #pragma mark - TabGridCommands | 146 #pragma mark - TabGridCommands |
103 | 147 |
104 - (void)showTabGridTabAtIndex:(int)index { | 148 - (void)showTabGridTabAtIndex:(int)index { |
105 self.webStateList.ActivateWebStateAt(index); | 149 self.webStateList.ActivateWebStateAt(index); |
106 // PLACEHOLDER: The tab coordinator should be able to get the active webState | 150 // PLACEHOLDER: The tab coordinator should be able to get the active webState |
107 // on its own. | 151 // on its own. |
152 [self.activeTabCoordinator stop]; | |
153 [self removeChildCoordinator:self.activeTabCoordinator]; | |
108 TabCoordinator* tabCoordinator = [[TabCoordinator alloc] init]; | 154 TabCoordinator* tabCoordinator = [[TabCoordinator alloc] init]; |
155 self.activeTabCoordinator = tabCoordinator; | |
109 tabCoordinator.webState = self.webStateList.GetWebStateAt(index); | 156 tabCoordinator.webState = self.webStateList.GetWebStateAt(index); |
110 tabCoordinator.presentationKey = | 157 tabCoordinator.presentationKey = |
111 [NSIndexPath indexPathForItem:index inSection:0]; | 158 [NSIndexPath indexPathForItem:index inSection:0]; |
112 [self addChildCoordinator:tabCoordinator]; | 159 [self addChildCoordinator:tabCoordinator]; |
113 [self deRegisterFromToolsMenuCommands]; | 160 [self deRegisterFromToolsMenuCommands]; |
114 [tabCoordinator start]; | 161 [tabCoordinator start]; |
115 } | 162 } |
116 | 163 |
117 - (void)closeTabGridTabAtIndex:(int)index { | 164 - (void)closeTabGridTabAtIndex:(int)index { |
118 self.webStateList.DetachWebStateAt(index); | 165 self.webStateList.DetachWebStateAt(index); |
(...skipping 29 matching lines...) Expand all Loading... | |
148 toolsCoordinator.toolsMenuConfiguration = menuConfiguration; | 195 toolsCoordinator.toolsMenuConfiguration = menuConfiguration; |
149 [toolsCoordinator start]; | 196 [toolsCoordinator start]; |
150 self.toolsMenuCoordinator = toolsCoordinator; | 197 self.toolsMenuCoordinator = toolsCoordinator; |
151 } | 198 } |
152 | 199 |
153 - (void)closeToolsMenu { | 200 - (void)closeToolsMenu { |
154 [self.toolsMenuCoordinator stop]; | 201 [self.toolsMenuCoordinator stop]; |
155 [self removeChildCoordinator:self.toolsMenuCoordinator]; | 202 [self removeChildCoordinator:self.toolsMenuCoordinator]; |
156 } | 203 } |
157 | 204 |
158 #pragma mark - SettingsCommands | |
159 | |
160 - (void)showSettings { | |
161 CommandDispatcher* dispatcher = self.browser->dispatcher(); | |
162 [dispatcher startDispatchingToTarget:self | |
163 forSelector:@selector(closeSettings)]; | |
164 SettingsCoordinator* settingsCoordinator = [[SettingsCoordinator alloc] init]; | |
165 [self addOverlayCoordinator:settingsCoordinator]; | |
166 self.settingsCoordinator = settingsCoordinator; | |
167 [settingsCoordinator start]; | |
168 } | |
169 | |
170 - (void)closeSettings { | |
171 CommandDispatcher* dispatcher = self.browser->dispatcher(); | |
172 [dispatcher stopDispatchingForSelector:@selector(closeSettings)]; | |
173 [self.settingsCoordinator stop]; | |
174 [self.settingsCoordinator.parentCoordinator | |
175 removeChildCoordinator:self.settingsCoordinator]; | |
176 // self.settingsCoordinator should be presumed to be nil after this point. | |
177 } | |
178 | |
179 #pragma mark - URLOpening | 205 #pragma mark - URLOpening |
180 | 206 |
181 - (void)openURL:(NSURL*)URL { | 207 - (void)openURL:(NSURL*)URL { |
182 if (self.webStateList.active_index() == WebStateList::kInvalidIndex) { | 208 if (self.webStateList.active_index() == WebStateList::kInvalidIndex) { |
183 return; | 209 return; |
184 } | 210 } |
185 [self.overlayCoordinator stop]; | 211 [self.overlayCoordinator stop]; |
186 [self removeOverlayCoordinator]; | 212 [self removeOverlayCoordinator]; |
187 web::WebState* activeWebState = self.webStateList.GetActiveWebState(); | 213 web::WebState* activeWebState = self.webStateList.GetActiveWebState(); |
188 web::NavigationManager::WebLoadParams params(net::GURLWithNSURL(URL)); | 214 web::NavigationManager::WebLoadParams params(net::GURLWithNSURL(URL)); |
189 params.transition_type = ui::PAGE_TRANSITION_LINK; | 215 params.transition_type = ui::PAGE_TRANSITION_LINK; |
190 activeWebState->GetNavigationManager()->LoadURLWithParams(params); | 216 activeWebState->GetNavigationManager()->LoadURLWithParams(params); |
191 if (!self.children.count) { | 217 if (!self.children.count) { |
192 [self showTabGridTabAtIndex:self.webStateList.active_index()]; | 218 [self showTabGridTabAtIndex:self.webStateList.active_index()]; |
193 } | 219 } |
194 } | 220 } |
195 | 221 |
196 #pragma mark - PrivateMethods | 222 #pragma mark - PrivateMethods |
197 | 223 |
224 - (void)registerForContextMenuCommands { | |
225 // Right now these are unregistered in |-stop|. However, once incognito is | |
226 // implemented, these commands will need to be unregistered before switching | |
227 // to incognito mode, as "open in new tab" commands are meant to be handled | |
228 // by the incognito TabGridCoordinator. | |
229 [self.browser->dispatcher() | |
230 startDispatchingToTarget:self | |
231 forSelector:@selector(openContextMenuLinkInNewTab:)]; | |
232 [self.browser->dispatcher() | |
233 startDispatchingToTarget:self | |
234 forSelector:@selector(openContextMenuImageInNewTab:)]; | |
235 } | |
236 | |
198 - (void)registerForSettingsCommands { | 237 - (void)registerForSettingsCommands { |
199 [self.browser->dispatcher() startDispatchingToTarget:self | 238 [self.browser->dispatcher() startDispatchingToTarget:self |
200 forSelector:@selector(showSettings)]; | 239 forSelector:@selector(showSettings)]; |
201 } | 240 } |
202 | 241 |
203 - (void)registerForTabGridCommands { | 242 - (void)registerForTabGridCommands { |
204 [self.browser->dispatcher() startDispatchingToTarget:self | 243 [self.browser->dispatcher() startDispatchingToTarget:self |
205 forSelector:@selector(showTabGrid)]; | 244 forSelector:@selector(showTabGrid)]; |
206 [self.browser->dispatcher() | 245 [self.browser->dispatcher() |
207 startDispatchingToTarget:self | 246 startDispatchingToTarget:self |
(...skipping 16 matching lines...) Expand all Loading... | |
224 } | 263 } |
225 | 264 |
226 - (void)deRegisterFromToolsMenuCommands { | 265 - (void)deRegisterFromToolsMenuCommands { |
227 [self.browser->dispatcher() | 266 [self.browser->dispatcher() |
228 stopDispatchingForSelector:@selector(showToolsMenu)]; | 267 stopDispatchingForSelector:@selector(showToolsMenu)]; |
229 [self.browser->dispatcher() | 268 [self.browser->dispatcher() |
230 stopDispatchingForSelector:@selector(closeToolsMenu)]; | 269 stopDispatchingForSelector:@selector(closeToolsMenu)]; |
231 } | 270 } |
232 | 271 |
233 @end | 272 @end |
OLD | NEW |