Chromium Code Reviews| Index: ios/clean/chrome/browser/ui/context_menu/context_menu_mediator.mm |
| diff --git a/ios/clean/chrome/browser/ui/context_menu/context_menu_mediator.mm b/ios/clean/chrome/browser/ui/context_menu/context_menu_mediator.mm |
| index fade9f30af58ed9a648d0c6941780f080649daef..c9c3be67195cbf380bd774852120020a12e60ad5 100644 |
| --- a/ios/clean/chrome/browser/ui/context_menu/context_menu_mediator.mm |
| +++ b/ios/clean/chrome/browser/ui/context_menu/context_menu_mediator.mm |
| @@ -4,41 +4,117 @@ |
| #import "ios/clean/chrome/browser/ui/context_menu/context_menu_mediator.h" |
| +#import "ios/clean/chrome/browser/ui/commands/context_menu_commands.h" |
| #import "ios/clean/chrome/browser/ui/context_menu/context_menu_consumer.h" |
| -#import "ios/web/public/web_state/context_menu_params.h" |
| +#import "ios/clean/chrome/browser/ui/context_menu/context_menu_context_impl.h" |
| +#import "ios/shared/chrome/browser/ui/browser_list/browser.h" |
| +#import "ios/web/public/url_scheme_util.h" |
| +#include "url/gurl.h" |
| #if !defined(__has_feature) || !__has_feature(objc_arc) |
| #error "This file requires ARC support." |
| #endif |
| @interface ContextMenuMediator () |
| -@property(nonatomic, weak) id<ContextMenuConsumer> consumer; |
| +// The consumer for context menu functionality mediated by this class. |
| +@property(nonatomic, readonly, weak) id<ContextMenuConsumer> consumer; |
|
edchin
2017/05/25 21:41:53
The consumer is only used in the -init method so t
kkhorimoto
2017/05/26 23:20:09
Done.
|
| + |
| +// The ContextMenuItem to use for script menus. |
| +- (ContextMenuItem*)scriptItem; |
| + |
| +// The ContextMenuItems to use for link menus. |
| +- (NSArray<ContextMenuItem*>*)linkItems; |
| + |
| +// The ContextMenuItems to use for image menus. |
| +- (NSArray<ContextMenuItem*>*)imageItems; |
| + |
| +// The cancel item to use. |
| +- (ContextMenuItem*)cancelItem; |
| + |
| @end |
| @implementation ContextMenuMediator |
| @synthesize consumer = _consumer; |
| -- (instancetype)initWithConsumer:(id<ContextMenuConsumer>)consumer { |
| +- (instancetype)initWithConsumer:(id<ContextMenuConsumer>)consumer |
| + context:(ContextMenuContextImpl*)context { |
| if ((self = [super init])) { |
| + DCHECK(consumer); |
| _consumer = consumer; |
| - [self updateConsumer]; |
| + DCHECK(context); |
| + // Set the context and menu title. |
| + [_consumer setContextMenuContext:context]; |
| + [_consumer setContextMenuTitle:context.menuTitle]; |
| + // Add the appropriate items. |
| + NSMutableArray<ContextMenuItem*>* items = [[NSMutableArray alloc] init]; |
| + if (context.script.size()) |
| + [items addObject:[self scriptItem]]; |
| + BOOL showLinkOptions = |
| + context.linkURL.is_valid() && web::UrlHasWebScheme(context.linkURL); |
| + if (showLinkOptions) |
| + [items addObjectsFromArray:[self linkItems]]; |
| + BOOL showImageOptions = context.imageURL.is_valid(); |
| + if (showImageOptions) |
| + [items addObjectsFromArray:[self imageItems]]; |
| + [_consumer setContextMenuItems:[items copy] cancelItem:[self cancelItem]]; |
| } |
| return self; |
| } |
| -// Update the consumer. |
| -- (void)updateConsumer { |
| - // PLACEHOLDER. Fake title. |
| - [self.consumer setContextMenuTitle:@"http://some/link.html"]; |
| - NSMutableArray<ContextMenuItem*>* items = |
| - [[NSMutableArray<ContextMenuItem*> alloc] init]; |
| - |
| - // PLACEHOLDER. Two non-functional items. |
| - [items |
| - addObject:[ContextMenuItem itemWithTitle:@"Open in New Tab" command:nil]]; |
| - [items |
| - addObject:[ContextMenuItem itemWithTitle:@"Copy Link URL" command:nil]]; |
| - [self.consumer setContextMenuItems:[items copy]]; |
| +#pragma mark - |
| + |
| +- (ContextMenuItem*)scriptItem { |
| + std::vector<SEL> commands(2U); |
| + commands[0] = @selector(executeContextMenuScript:); |
| + commands[1] = @selector(hideContextMenu:); |
| + return [ContextMenuItem itemWithTitle:@"Execute Script" commands:commands]; |
| +} |
| + |
| +- (NSArray<ContextMenuItem*>*)linkItems { |
| + // Opening the link in a new Tab will stop this context menu's coordinator, so |
| + // there's no need to hide it. |
| + std::vector<SEL> newTabCommands(1U); |
| + newTabCommands[0] = @selector(openContextMenuLinkInNewTab:); |
| + // TODO: Add |-openContextMenuLinkInNewIncognitoTab:| as the first command for |
| + // "Open In New Incognito Tab" once the incognito tab grid is implemented. |
| + std::vector<SEL> newIncognitoTabCommands(1U); |
| + newIncognitoTabCommands[0] = @selector(hideContextMenu:); |
| + // TODO: Add |-copyContextMenuLink:| as the first command for "Copy Link" once |
| + // copying to pasteboard is implemented. |
| + std::vector<SEL> copyLinkCommands(1U); |
| + newIncognitoTabCommands[0] = @selector(hideContextMenu:); |
| + return @[ |
| + [ContextMenuItem itemWithTitle:@"Open In New Tab" commands:newTabCommands], |
| + [ContextMenuItem itemWithTitle:@"Open In New Incognito Tab" |
| + commands:newIncognitoTabCommands], |
| + [ContextMenuItem itemWithTitle:@"Copy Link" commands:copyLinkCommands], |
| + ]; |
| +} |
| + |
| +- (NSArray<ContextMenuItem*>*)imageItems { |
| + // TODO: Add |-saveContextMenuImage:| as the first command for "Save Image" |
| + // once camera roll access has been implemented. |
| + std::vector<SEL> saveImageCommands(1U); |
| + saveImageCommands[0] = @selector(hideContextMenu:); |
| + std::vector<SEL> openImageCommands(2U); |
| + openImageCommands[0] = @selector(openContextMenuImage:); |
| + openImageCommands[1] = @selector(hideContextMenu:); |
| + // Opening the image in a new Tab will stop this context menu's coordinator, |
| + // so there's no need to hide it. |
| + std::vector<SEL> openImageInNewTabCommands(1U); |
| + openImageInNewTabCommands[0] = @selector(openContextMenuImageInNewTab:); |
| + return @[ |
| + [ContextMenuItem itemWithTitle:@"Save Image" commands:saveImageCommands], |
| + [ContextMenuItem itemWithTitle:@"Open Image" commands:openImageCommands], |
| + [ContextMenuItem itemWithTitle:@"Open Image In New Tab" |
| + commands:openImageInNewTabCommands], |
| + ]; |
| +} |
| + |
| +- (ContextMenuItem*)cancelItem { |
| + std::vector<SEL> cancelCommands(1U); |
| + cancelCommands[0] = @selector(hideContextMenu:); |
| + return [ContextMenuItem itemWithTitle:@"Cancel" commands:cancelCommands]; |
| } |
| @end |