Index: ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm |
diff --git a/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm b/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm |
index 091bbecee47975f6be77d6ed58155cfcee3181ac..104978959777a314246cb43c5cda533d5725bd58 100644 |
--- a/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm |
+++ b/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm |
@@ -6,12 +6,15 @@ |
#include <memory> |
+#include "base/mac/foundation_util.h" |
#include "base/strings/sys_string_conversions.h" |
#include "ios/chrome/browser/browser_state/chrome_browser_state.h" |
#import "ios/chrome/browser/web_state_list/web_state_list.h" |
+#import "ios/clean/chrome/browser/ui/commands/context_menu_commands.h" |
#import "ios/clean/chrome/browser/ui/commands/settings_commands.h" |
#import "ios/clean/chrome/browser/ui/commands/tab_grid_commands.h" |
#import "ios/clean/chrome/browser/ui/commands/tools_menu_commands.h" |
+#import "ios/clean/chrome/browser/ui/context_menu/context_menu_context_impl.h" |
#import "ios/clean/chrome/browser/ui/settings/settings_coordinator.h" |
#import "ios/clean/chrome/browser/ui/tab/tab_coordinator.h" |
#import "ios/clean/chrome/browser/ui/tab_grid/tab_grid_mediator.h" |
@@ -30,12 +33,14 @@ |
#error "This file requires ARC support." |
#endif |
-@interface TabGridCoordinator ()<SettingsCommands, |
+@interface TabGridCoordinator ()<ContextMenuCommands, |
+ SettingsCommands, |
TabGridCommands, |
ToolsMenuCommands> |
@property(nonatomic, strong) TabGridViewController* viewController; |
@property(nonatomic, weak) SettingsCoordinator* settingsCoordinator; |
@property(nonatomic, weak) ToolsCoordinator* toolsMenuCoordinator; |
+@property(nonatomic, weak) TabCoordinator* activeTabCoordinator; |
@property(nonatomic, readonly) WebStateList& webStateList; |
@property(nonatomic, strong) TabGridMediator* mediator; |
@end |
@@ -44,6 +49,7 @@ @implementation TabGridCoordinator |
@synthesize viewController = _viewController; |
@synthesize settingsCoordinator = _settingsCoordinator; |
@synthesize toolsMenuCoordinator = _toolsMenuCoordinator; |
+@synthesize activeTabCoordinator = _activeTabCoordinator; |
@synthesize mediator = _mediator; |
#pragma mark - Properties |
@@ -58,6 +64,7 @@ - (void)start { |
self.mediator = [[TabGridMediator alloc] init]; |
self.mediator.webStateList = &self.webStateList; |
+ [self registerForContextMenuCommands]; |
[self registerForSettingsCommands]; |
[self registerForTabGridCommands]; |
[self registerForToolsMenuCommands]; |
@@ -99,13 +106,53 @@ - (void)childCoordinatorWillStop:(BrowserCoordinator*)childCoordinator { |
completion:nil]; |
} |
+#pragma mark - ContextMenuCommands |
+ |
+- (void)openContextMenuLinkInNewTab:(ContextMenuContext*)context { |
+ [self createAndShowNewTabInTabGrid]; |
+ ContextMenuContextImpl* contextImpl = |
+ base::mac::ObjCCastStrict<ContextMenuContextImpl>(context); |
+ [self openURL:net::NSURLWithGURL(contextImpl.linkURL)]; |
+} |
+ |
+- (void)openContextMenuImageInNewTab:(ContextMenuContext*)context { |
+ [self createAndShowNewTabInTabGrid]; |
+ ContextMenuContextImpl* contextImpl = |
+ base::mac::ObjCCastStrict<ContextMenuContextImpl>(context); |
+ [self openURL:net::NSURLWithGURL(contextImpl.imageURL)]; |
+} |
+ |
+#pragma mark - SettingsCommands |
+ |
+- (void)showSettings { |
+ CommandDispatcher* dispatcher = self.browser->dispatcher(); |
+ [dispatcher startDispatchingToTarget:self |
+ forSelector:@selector(closeSettings)]; |
+ SettingsCoordinator* settingsCoordinator = [[SettingsCoordinator alloc] init]; |
+ [self addOverlayCoordinator:settingsCoordinator]; |
+ self.settingsCoordinator = settingsCoordinator; |
+ [settingsCoordinator start]; |
+} |
+ |
+- (void)closeSettings { |
+ CommandDispatcher* dispatcher = self.browser->dispatcher(); |
+ [dispatcher stopDispatchingForSelector:@selector(closeSettings)]; |
+ [self.settingsCoordinator stop]; |
+ [self.settingsCoordinator.parentCoordinator |
+ removeChildCoordinator:self.settingsCoordinator]; |
+ // self.settingsCoordinator should be presumed to be nil after this point. |
+} |
+ |
#pragma mark - TabGridCommands |
- (void)showTabGridTabAtIndex:(int)index { |
self.webStateList.ActivateWebStateAt(index); |
// PLACEHOLDER: The tab coordinator should be able to get the active webState |
// on its own. |
+ [self.activeTabCoordinator stop]; |
+ [self removeChildCoordinator:self.activeTabCoordinator]; |
TabCoordinator* tabCoordinator = [[TabCoordinator alloc] init]; |
+ self.activeTabCoordinator = tabCoordinator; |
tabCoordinator.webState = self.webStateList.GetWebStateAt(index); |
tabCoordinator.presentationKey = |
[NSIndexPath indexPathForItem:index inSection:0]; |
@@ -155,27 +202,6 @@ - (void)closeToolsMenu { |
[self removeChildCoordinator:self.toolsMenuCoordinator]; |
} |
-#pragma mark - SettingsCommands |
- |
-- (void)showSettings { |
- CommandDispatcher* dispatcher = self.browser->dispatcher(); |
- [dispatcher startDispatchingToTarget:self |
- forSelector:@selector(closeSettings)]; |
- SettingsCoordinator* settingsCoordinator = [[SettingsCoordinator alloc] init]; |
- [self addOverlayCoordinator:settingsCoordinator]; |
- self.settingsCoordinator = settingsCoordinator; |
- [settingsCoordinator start]; |
-} |
- |
-- (void)closeSettings { |
- CommandDispatcher* dispatcher = self.browser->dispatcher(); |
- [dispatcher stopDispatchingForSelector:@selector(closeSettings)]; |
- [self.settingsCoordinator stop]; |
- [self.settingsCoordinator.parentCoordinator |
- removeChildCoordinator:self.settingsCoordinator]; |
- // self.settingsCoordinator should be presumed to be nil after this point. |
-} |
- |
#pragma mark - URLOpening |
- (void)openURL:(NSURL*)URL { |
@@ -195,6 +221,19 @@ - (void)openURL:(NSURL*)URL { |
#pragma mark - PrivateMethods |
+- (void)registerForContextMenuCommands { |
+ // Right now these are unregistered in |-stop|. However, once incognito is |
+ // implemented, these commands will need to be unregistered before switching |
+ // to incognito mode, as "open in new tab" commands are meant to be handled |
+ // by the incognito TabGridCoordinator. |
+ [self.browser->dispatcher() |
+ startDispatchingToTarget:self |
+ forSelector:@selector(openContextMenuLinkInNewTab:)]; |
+ [self.browser->dispatcher() |
+ startDispatchingToTarget:self |
+ forSelector:@selector(openContextMenuImageInNewTab:)]; |
+} |
+ |
- (void)registerForSettingsCommands { |
[self.browser->dispatcher() startDispatchingToTarget:self |
forSelector:@selector(showSettings)]; |