Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 #import "chrome/browser/ui/cocoa/renderer_context_menu/share_menu_controller.h" | |
| 2 | |
| 3 #include "base/strings/sys_string_conversions.h" | |
| 4 #include "base/strings/utf_string_conversions.h" | |
| 5 #include "chrome/app/chrome_command_ids.h" | |
| 6 #import "chrome/browser/app_controller_mac.h" | |
|
Avi (use Gerrit)
2015/05/05 18:47:51
one space after #import, not 2
| |
| 7 #include "chrome/browser/ui/browser.h" | |
| 8 #include "chrome/browser/ui/browser_commands.h" | |
| 9 #include "chrome/browser/ui/browser_finder.h" | |
| 10 #include "chrome/browser/ui/browser_list.h" | |
| 11 #include "chrome/browser/ui/browser_list_observer.h" | |
| 12 #include "chrome/browser/ui/cocoa/last_active_browser_cocoa.h" | |
| 13 #include "chrome/browser/ui/cocoa/last_active_browser_cocoa.h" | |
| 14 #include "chrome/browser/ui/tabs/tab_strip_model.h" | |
| 15 #include "chrome/grit/generated_resources.h" | |
| 16 #include "ui/base/l10n/l10n_util.h" | |
| 17 #include "ui/base/l10n/l10n_util_mac.h" | |
| 18 #include "net/base/escape.h" | |
| 19 | |
| 20 @interface ShareMenuController() <NSSharingServiceDelegate> | |
|
shrike
2015/05/05 18:20:23
Should (NSArray*)items; (no extra space)
| |
| 21 - (NSMutableArray*)shareMenuItemsFor:(NSArray*) items; | |
|
shrike
2015/05/05 18:20:23
No extra space after (void).
| |
| 22 - (void) initShareMenuItem; | |
|
shrike
2015/05/05 18:20:23
No extra space after (void), or in (Browser*)
| |
| 23 - (void) buildShareItemsFor:(Browser* )browser; | |
|
shrike
2015/05/05 18:20:23
Similar extra space problems.
| |
| 24 - (NSString *)currentPageUrlFor:(Browser* )browser; | |
| 25 - (NSMenuItem*)createItemWithTitle:(NSString*)title action:(SEL)sel; | |
| 26 @end | |
| 27 | |
| 28 namespace ShareMenuControllerInternal { | |
| 29 | |
| 30 class Observer : public chrome::BrowserListObserver { | |
| 31 public: | |
| 32 Observer(ShareMenuController* controller) : controller_(controller) { | |
| 33 BrowserList::AddObserver(this); | |
| 34 } | |
| 35 | |
| 36 ~Observer() override { BrowserList::RemoveObserver(this); } | |
| 37 | |
| 38 // chrome::BrowserListObserver: | |
| 39 void OnBrowserAdded(Browser* browser) override {} | |
|
Avi (use Gerrit)
2015/05/05 18:47:51
Why are you overriding OnBrowserAdded/Removed if y
| |
| 40 void OnBrowserRemoved(Browser* browser) override {} | |
|
shrike
2015/05/05 18:20:23
Too many spaces after //
| |
| 41 // Allow the browser to add Share Menu once. | |
| 42 void OnBrowserSetLastActive(Browser* browser) override { | |
| 43 if (browser && ![controller_ menuItemsLoaded]) { | |
|
shrike
2015/05/05 18:20:23
Next line indented too far.
| |
| 44 [controller_ initShareMenuItem]; | |
| 45 } | |
| 46 [controller_ buildShareItemsFor:browser]; | |
| 47 } | |
| 48 | |
| 49 private: | |
| 50 ShareMenuController* controller_; // Weak; owns this. | |
| 51 }; | |
| 52 | |
|
shrike
2015/05/05 18:20:23
Two spaces after }, one after //
| |
| 53 } // namespace ShareMenuControllerInternal | |
| 54 | |
|
shrike
2015/05/05 18:20:24
Is there someplace else in the code base where the
sarka
2015/05/15 03:35:44
Yes, I have seen it in profile_menu_controller.
| |
| 55 //////////////////////////////////////////////////////////////////////////////// | |
| 56 | |
| 57 @implementation ShareMenuController | |
| 58 | |
| 59 - (id)initWithMainMenu:(NSMenu*)menu { | |
| 60 if (self = [super init]) { | |
| 61 mainMenu_ = menu; | |
|
shrike
2015/05/05 18:20:23
There needs to be a runtime check somewhere to mak
sarka
2015/05/15 03:35:43
Done that in app_controller_mac to make sure it is
| |
| 62 shareItems_ = [[NSMutableArray alloc] init]; | |
|
Avi (use Gerrit)
2015/05/05 18:47:51
You leak shareItems_. Use a scoped_nsobject.
| |
| 63 menuItemsLoaded_ = NO; | |
| 64 observer_.reset(new ShareMenuControllerInternal::Observer(self)); | |
| 65 } | |
| 66 return self; | |
| 67 } | |
| 68 | |
|
shrike
2015/05/05 18:20:23
No space after (BOOL)
| |
| 69 - (BOOL) menuItemsLoaded { | |
| 70 return menuItemsLoaded_; | |
| 71 } | |
| 72 | |
| 73 #pragma mark - Private Methods | |
|
Avi (use Gerrit)
2015/05/05 18:47:50
Don't #pragma mark.
| |
| 74 // Retrieve the list of possible sharing options and create menu item for each. | |
|
shrike
2015/05/05 18:20:23
No space after (NSArray*)
| |
| 75 - (NSMutableArray*)shareMenuItemsFor:(NSArray*) items { | |
| 76 NSMutableArray* menuItems = [NSMutableArray array]; | |
|
shrike
2015/05/05 18:20:23
Should be NSArray* sharingServices
| |
| 77 NSArray *sharingServices = [NSSharingService sharingServicesForItems:items]; | |
| 78 for (NSSharingService* currentService in sharingServices) { | |
| 79 NSString* titleText = nil; | |
|
shrike
2015/05/05 18:20:23
I don't think it's kosher to look for a service wi
| |
| 80 if ([currentService.title isEqualToString:@"Mail"]) { | |
|
shrike
2015/05/05 18:20:23
Lines should be indented 2 more spaces, not 4.
| |
| 81 titleText = l10n_util::GetNSString(IDS_EMAIL_PAGE_LOCATION_MAC); | |
| 82 } else { | |
|
shrike
2015/05/05 18:20:24
I would think you'd want to take currentService.me
| |
| 83 titleText = currentService.title; | |
| 84 } | |
|
shrike
2015/05/05 18:20:23
Colons should be aligned.
| |
| 85 NSMenuItem* item = [self createItemWithTitle:titleText | |
| 86 action:@selector(systemShareService:)]; | |
| 87 item.image = currentService.image; | |
| 88 item.representedObject = currentService; | |
| 89 [item setTarget:self]; | |
| 90 currentService.delegate = self; | |
| 91 [menuItems addObject:item]; | |
| 92 } | |
| 93 return menuItems; | |
| 94 } | |
| 95 | |
| 96 - (void) initShareMenuItem { | |
|
shrike
2015/05/05 18:20:23
1 space after //
| |
| 97 // Create a submenu for displaying various system wide sharing options. | |
| 98 shareSubMenu_ = [[NSMenu alloc] initWithTitle:@"ShareSubMenu"]; | |
|
Avi (use Gerrit)
2015/05/05 18:47:50
It's not clear what the ownership story is here, b
| |
| 99 fileMeuItem_ = [mainMenu_ itemWithTag:IDC_FILE_MENU]; | |
| 100 NSString* shareMenuName = | |
|
shrike
2015/05/05 18:20:23
Next line should be indented just 4 spaces.
| |
| 101 l10n_util::GetNSStringWithFixup(IDS_SHARE_MENU_MAC); | |
| 102 shareMenuItem_ = [self createItemWithTitle:shareMenuName action:nil]; | |
| 103 [shareMenuItem_ setTag:IDC_SHARE_MENU]; | |
| 104 } | |
| 105 | |
| 106 - (void) buildShareItemsFor:(Browser *)browser { | |
|
Avi (use Gerrit)
2015/05/05 18:47:50
No space after )
| |
| 107 if (!shareSubMenu_) | |
|
shrike
2015/05/05 18:20:23
Indented too far.
| |
| 108 return; | |
| 109 NSMutableArray* items = [NSMutableArray array]; | |
| 110 [items addObject:[self currentPageUrlFor:browser]]; | |
| 111 [shareItems_ removeAllObjects]; | |
| 112 [shareItems_ addObject:[self currentPageUrlFor:browser]]; | |
| 113 [shareSubMenu_ setAutoenablesItems:NO]; | |
|
shrike
2015/05/05 18:20:24
Why is it called twice?
| |
| 114 // Since this method is called twice, we don't want to add duplicate items. | |
| 115 if ([shareSubMenu_ numberOfItems] > 0) { | |
| 116 [shareSubMenu_ removeAllItems]; | |
| 117 } | |
|
Avi (use Gerrit)
2015/05/05 18:47:50
Why are you casting to NSArray below? Don't cast;
| |
| 118 NSArray* menuItems = (NSArray*)[self shareMenuItemsFor:items]; | |
|
shrike
2015/05/05 18:20:24
Should be NSMenuItem* item
| |
| 119 for (NSMenuItem *item in menuItems) { | |
| 120 [shareSubMenu_ addItem:item]; | |
| 121 BOOL enabled = chrome::CanEmailPageLocation(browser) ? | |
|
shrike
2015/05/05 18:20:23
Space before and after colon.
| |
| 122 [self validateMenuItem:item]:NO; | |
| 123 [item setEnabled:enabled]; | |
| 124 } | |
| 125 // Make sure we don't insert ShareMenuItem twice. | |
| 126 if (![[fileMeuItem_ submenu] itemWithTag:IDC_SHARE_MENU]) { | |
|
shrike
2015/05/05 18:20:24
Where does the # 12 come from? In general I think
| |
| 127 [[fileMeuItem_ submenu] insertItem:shareMenuItem_ atIndex:12]; | |
| 128 } | |
| 129 [[fileMeuItem_ submenu] setSubmenu:shareSubMenu_ forItem:shareMenuItem_]; | |
| 130 menuItemsLoaded_ = YES; | |
| 131 } | |
| 132 | |
| 133 - (NSString *)currentPageUrlFor:(Browser* )browser { | |
|
Avi (use Gerrit)
2015/05/05 18:47:50
No spaces before the *, no space after the *.
| |
| 134 TabStripModel* tabStrip = browser->tab_strip_model(); | |
| 135 content::WebContents* wc = tabStrip->GetActiveWebContents(); | |
| 136 std::string pageUrl = net::EscapeQueryParamValue(wc->GetURL().spec(), false); | |
|
Avi (use Gerrit)
2015/05/05 18:47:50
DO NOT CALL GetURL on WebContents.
In web_content
| |
| 137 return base::SysUTF8ToNSString(pageUrl); | |
| 138 } | |
| 139 | |
| 140 - (NSMenuItem*)createItemWithTitle:(NSString*)title action:(SEL)sel { | |
|
Avi (use Gerrit)
2015/05/05 18:47:51
Do not call this "createItemWithTitle". That makes
| |
| 141 base::scoped_nsobject<NSMenuItem> item( | |
| 142 [[NSMenuItem alloc] initWithTitle:title action:sel keyEquivalent:@""]); | |
| 143 [item setTarget:self]; | |
|
shrike
2015/05/05 18:20:23
I don't think saying item.release() is quite corre
Avi (use Gerrit)
2015/05/05 18:47:51
Yeah. Don't use scoped_nsobject here. Above, do [[
| |
| 144 return [item.release() autorelease]; | |
| 145 } | |
| 146 | |
| 147 #pragma mark - validate NSMenuItems | |
| 148 - (BOOL)validateMenuItem:(NSMenuItem *)menuItem { | |
|
shrike
2015/05/05 18:20:23
Why not just
return [menuItem action] == @sele
| |
| 149 BOOL ret = NO; | |
| 150 SEL action = [menuItem action]; | |
| 151 if (action == @selector(systemShareService:)) { | |
| 152 ret = YES; | |
| 153 } | |
| 154 return ret; | |
| 155 } | |
| 156 | |
| 157 #pragma mark - Handle Actions for individual MenuItems | |
| 158 | |
|
shrike
2015/05/05 18:20:23
Why is this defined as an IBAction (it's not hooke
| |
| 159 - (IBAction)systemShareService:(id)sender { | |
| 160 NSMenuItem* currentMenuItem = (NSMenuItem*)sender; | |
| 161 [currentMenuItem.representedObject performWithItems:shareItems_]; | |
| 162 } | |
| 163 | |
| 164 | |
| 165 @end | |
| OLD | NEW |