Index: chrome/browser/ui/cocoa/renderer_context_menu/share_menu_controller.mm |
diff --git a/chrome/browser/ui/cocoa/renderer_context_menu/share_menu_controller.mm b/chrome/browser/ui/cocoa/renderer_context_menu/share_menu_controller.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6ecf93bcfed22a967644d0cd11efddbd32e1ce13 |
--- /dev/null |
+++ b/chrome/browser/ui/cocoa/renderer_context_menu/share_menu_controller.mm |
@@ -0,0 +1,176 @@ |
+#import "chrome/browser/ui/cocoa/renderer_context_menu/share_menu_controller.h" |
Avi (use Gerrit)
2015/05/15 16:13:08
Where is your copyright header?
Also, same questi
|
+ |
+#include "base/strings/sys_string_conversions.h" |
+#include "base/strings/utf_string_conversions.h" |
+#include "chrome/app/chrome_command_ids.h" |
+#import "chrome/browser/app_controller_mac.h" |
+#include "chrome/browser/ui/browser_commands.h" |
+#include "chrome/browser/ui/browser_finder.h" |
+#include "chrome/browser/ui/browser_list.h" |
+#include "chrome/browser/ui/browser_list_observer.h" |
+#include "chrome/browser/ui/cocoa/last_active_browser_cocoa.h" |
+#include "chrome/browser/ui/cocoa/last_active_browser_cocoa.h" |
+#include "chrome/browser/ui/tabs/tab_strip_model.h" |
+#include "chrome/grit/generated_resources.h" |
+#include "ui/base/l10n/l10n_util.h" |
+#include "ui/base/l10n/l10n_util_mac.h" |
+#include "net/base/escape.h" |
+ |
+@interface ShareMenuController() <NSSharingServiceDelegate> |
+- (void)buildShareItemsFor:(Browser* )browser; |
+- (NSMenuItem*)createItemWithTitle:(NSString*)title action:(SEL)sel; |
+- (NSString *)currentPageUrlFor:(Browser* )browser; |
+- (void)enableShareMenuItemsFor:(Browser *)browser; |
+- (NSArray*)shareMenuItemsFor:(NSArray*)items; |
Avi (use Gerrit)
2015/05/15 16:13:09
Lots of bad formatting.
For types, it's always (N
|
+@end |
+ |
+namespace ShareMenuControllerInternal { |
+ |
+class Observer : public chrome::BrowserListObserver { |
+ public: |
+ Observer(ShareMenuController* controller) : controller_(controller) { |
+ BrowserList::AddObserver(this); |
+ } |
+ |
+ ~Observer() override { BrowserList::RemoveObserver(this); } |
+ |
+ // Wait for a browser tab to become active before building the share menu. |
+ void OnBrowserSetLastActive(Browser* browser) override { |
+ if (browser && ![controller_ menuItemsLoaded]) { |
+ [controller_ initShareMenuItem]; |
+ [controller_ buildShareItemsFor:browser]; |
+ } |
+ [controller_ enableShareMenuItemsFor:browser]; |
+ } |
+ |
+ private: |
+ ShareMenuController* controller_; // Weak; owns this. |
+ }; |
+ |
+} // namespace ShareMenuControllerInternal |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+ |
+@implementation ShareMenuController |
+ |
+- (id)initWithMainMenu:(NSMenu*)menu { |
+ if (self = [super init]) { |
+ mainMenu_ = menu; |
+ shareItems_.reset([[NSMutableArray alloc] init]); |
+ menuItemsLoaded_ = NO; |
+ observer_.reset(new ShareMenuControllerInternal::Observer(self)); |
+ } |
+ return self; |
+} |
+ |
+- (BOOL) menuItemsLoaded { |
Avi (use Gerrit)
2015/05/15 16:13:08
No space after )
|
+ return menuItemsLoaded_; |
+} |
+ |
+// Create a submenu for displaying various system wide sharing options. |
Avi (use Gerrit)
2015/05/15 16:13:08
Comments go in the header file, not the .mm file.
|
+- (void)initShareMenuItem { |
+ shareSubMenu_.reset([[NSMenu alloc] initWithTitle:@"ShareSubMenu"]); |
+ fileMenuItem_ = [mainMenu_ itemWithTag:IDC_FILE_MENU]; |
+ NSString* shareMenuName = |
+ l10n_util::GetNSStringWithFixup(IDS_SHARE_MENU_MAC); |
+ shareMenuItem_ = [self createItemWithTitle:shareMenuName action:nil]; |
+ [shareMenuItem_ setTag:IDC_SHARE_MENU]; |
+} |
+ |
+- (NSMenu*)shareSubMenu { |
+ return shareSubMenu_; |
+} |
+ |
+- (NSMenuItem*)shareSubMenuItem { |
+ return shareMenuItem_; |
+} |
+ |
+- (void)buildShareItemsFor:(Browser *)browser { |
Avi (use Gerrit)
2015/05/15 16:13:09
No space before *.
|
+ if (!shareSubMenu_) |
+ return; |
+ |
+ [shareItems_ removeAllObjects]; |
+ [shareItems_ addObject:[self currentPageUrlFor:browser]]; |
+ |
+ // If the sharemenu had already been built, remove all items and rebuild. |
+ if ([shareSubMenu_ numberOfItems] > 0) { |
+ [shareSubMenu_ removeAllItems]; |
+ } |
+ |
+ NSArray* menuItems = [self shareMenuItemsFor:shareItems_]; |
+ for (NSMenuItem* item in menuItems) { |
+ [shareSubMenu_ addItem:item]; |
+ } |
+ |
+ // Make sure the Share menu item is created only once. |
+ if (![[fileMenuItem_ submenu] itemWithTag:IDC_SHARE_MENU]) { |
+ NSMenuItem* savePageItem = [[fileMenuItem_ submenu] |
+ itemWithTag:IDC_SAVE_PAGE]; |
+ NSInteger idxSavePage = [[fileMenuItem_ submenu] indexOfItem:savePageItem]; |
+ [[fileMenuItem_ submenu] insertItem:shareMenuItem_ atIndex:idxSavePage + 2]; |
+ } |
Avi (use Gerrit)
2015/05/15 16:13:09
?
Why do you have to do this? This code looks lik
sarka
2015/05/15 16:36:55
Were you referring to the line containing '[[fileM
Avi (use Gerrit)
2015/05/15 16:40:33
I mean this whole "if" block.
You are modifying t
sarka
2015/05/15 16:45:47
You are right. The Share menu and its submenu shou
|
+ |
+ [[fileMenuItem_ submenu] setSubmenu:shareSubMenu_ forItem:shareMenuItem_]; |
+ menuItemsLoaded_ = YES; |
+} |
+ |
+- (NSMenuItem*)createItemWithTitle:(NSString*)title action:(SEL)sel { |
+ NSMenuItem* item = [[[NSMenuItem alloc] initWithTitle:title action:sel |
+ keyEquivalent:@""] |
+ autorelease]; |
Avi (use Gerrit)
2015/05/15 16:13:09
Align on :
|
+ [item setTarget:self]; |
+ return item; |
+} |
+ |
+- (NSString*)currentPageUrlFor:(Browser*)browser { |
+ TabStripModel* tabStrip = browser->tab_strip_model(); |
+ content::WebContents* wc = tabStrip->GetActiveWebContents(); |
+ std::string pageUrl = net::EscapeQueryParamValue(wc->GetVisibleURL().spec(), |
+ false); |
+ return base::SysUTF8ToNSString(pageUrl); |
+} |
+ |
+- (void)enableShareMenuItemsFor:(Browser *)browser { |
Avi (use Gerrit)
2015/05/15 16:13:09
No space before *
|
+ [shareSubMenu_ setAutoenablesItems:NO]; |
+ for (NSMenuItem* item in [shareSubMenu_ itemArray]) { |
+ BOOL enabled = chrome::CanEmailPageLocation(browser) ? |
+ [self validateMenuItem:item] : NO; |
Avi (use Gerrit)
2015/05/15 16:13:09
indent
|
+ [item setEnabled:enabled]; |
+ } |
+} |
+ |
+// Retrieve the list of possible sharing options and create menu item for each. |
Avi (use Gerrit)
2015/05/15 16:13:09
comments go in the header file
|
+- (NSArray*)shareMenuItemsFor:(NSArray*)items { |
+ base::scoped_nsobject<NSMutableArray> |
+ menuItems([[NSMutableArray alloc] init]); |
Avi (use Gerrit)
2015/05/15 16:13:08
indent!
|
+ NSArray *sharingServices = [NSSharingService sharingServicesForItems:items]; |
Avi (use Gerrit)
2015/05/15 16:13:08
space after the *, not before
|
+ for (NSSharingService* currentService in sharingServices) { |
+ NSString* titleText = nil; |
+ if ([currentService isEqualTo:[NSSharingService sharingServiceNamed |
+ :NSSharingServiceNameComposeEmail]]) { |
Avi (use Gerrit)
2015/05/15 16:13:08
Do not break there! You're breaking a method name
|
+ titleText = l10n_util::GetNSString(IDS_EMAIL_PAGE_LOCATION_MAC); |
+ } else { |
+ titleText = currentService.title; |
+ } |
+ NSMenuItem* item = [self createItemWithTitle:titleText |
+ action:@selector( |
+ systemShareService:)]; |
Avi (use Gerrit)
2015/05/15 16:13:08
One line. Don't align ALL colons, just the ones th
|
+ item.image = currentService.image; |
+ item.representedObject = currentService; |
+ [item setTarget:self]; |
+ currentService.delegate = self; |
+ [menuItems addObject:item]; |
+ } |
+ return [menuItems copy]; |
Avi (use Gerrit)
2015/05/15 16:13:09
1) You're leaking.
2) Why do you need to copy this
|
+} |
+ |
+- (BOOL)validateMenuItem:(NSMenuItem *)menuItem { |
Avi (use Gerrit)
2015/05/15 16:13:08
no space before *
|
+ return ([menuItem action] == @selector(systemShareService:)); |
+} |
+ |
+- (void)systemShareService:(id)sender { |
+ NSMenuItem* currentMenuItem = (NSMenuItem*)sender; |
+ [currentMenuItem.representedObject performWithItems:shareItems_]; |
+} |
+ |
+@end |