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 |