Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(133)

Side by Side Diff: chrome/browser/ui/cocoa/renderer_context_menu/share_menu_controller.mm

Issue 1105143005: Issue 465302:System wide share options on Mac Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: System wide share menu for Mac Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698