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

Side by Side Diff: chrome/browser/ui/cocoa/share_menu_controller_browsertest.mm

Issue 2950403002: [Mac] Add system share menu
Patch Set: Guard against empty web contents Created 3 years, 5 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 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #import "chrome/browser/ui/cocoa/share_menu_controller.h"
6
7 #import "base/mac/scoped_nsobject.h"
8 #import "base/path_service.h"
9 #include "base/strings/sys_string_conversions.h"
10 #include "chrome/browser/ui/browser.h"
11 #include "chrome/browser/ui/browser_list.h"
12 #include "chrome/browser/ui/browser_window.h"
13 #include "chrome/browser/ui/cocoa/test/cocoa_profile_test.h"
14 #import "chrome/browser/ui/cocoa/test/cocoa_test_helper.h"
15 #include "chrome/browser/ui/tabs/tab_strip_model.h"
16 #include "chrome/common/chrome_paths.h"
17 #include "chrome/grit/generated_resources.h"
18 #include "chrome/test/base/in_process_browser_test.h"
19 #include "net/base/mac/url_conversions.h"
20 #include "testing/gtest_mac.h"
21 #include "ui/base/l10n/l10n_util_mac.h"
22
23 // Mock sharing service for sensing shared items.
24 @interface MockSharingService : NSSharingService
25
26 // Weak since both this object and the shared item
27 // should only live in the scope of the test.
28 @property(nonatomic, assign) id sharedItem;
29
30 @end
31
32 @implementation MockSharingService
33
34 // The real one is backed by SHKSharingService parameters which
35 // don't appear to be present when inheriting from vanilla
36 // |NSSharingService|.
37 @synthesize subject;
38 @synthesize sharedItem = sharedItem_;
39
40 - (void)performWithItems:(NSArray*)items {
41 [self setSharedItem:[items firstObject]];
42 }
43
44 @end
45
46 class ShareMenuControllerTest : public InProcessBrowserTest {
47 public:
48 ShareMenuControllerTest() {}
49
50 void SetUpOnMainThread() override {
51 base::FilePath test_data_dir;
52 PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir);
53 embedded_test_server()->ServeFilesFromDirectory(test_data_dir);
54 ASSERT_TRUE(embedded_test_server()->Start());
55
56 url_ = embedded_test_server()->GetURL("/title2.html");
57 AddTabAtIndex(0, url_, ui::PAGE_TRANSITION_TYPED);
58 controller_.reset([[ShareMenuController alloc] init]);
59 }
60
61 protected:
62 // Create a menu item for |service| and trigger it using
63 // the target/action of real menu items created by
64 // |controller_|
65 void PerformShare(NSSharingService* service) {
66 base::scoped_nsobject<NSMenu> menu([[NSMenu alloc] initWithTitle:@"Share"]);
67
68 [controller_ menuNeedsUpdate:menu];
69
70 NSMenuItem* mockMenuItem =
71 [[NSMenuItem alloc] initWithTitle:@"test" action:nil keyEquivalent:@""];
Robert Sesek 2017/06/28 15:37:55 This is leaked. (Use scoped_nsobject).
lgrey 2017/06/29 21:11:50 Done.
72 [mockMenuItem setRepresentedObject:service];
73
74 NSMenuItem* firstMenuItem = [menu itemAtIndex:0];
75 id target = [firstMenuItem target];
76 SEL action = [firstMenuItem action];
77 [target performSelector:action withObject:mockMenuItem];
78 }
79 GURL url_;
80 base::scoped_nsobject<ShareMenuController> controller_;
81 };
82
83 IN_PROC_BROWSER_TEST_F(ShareMenuControllerTest, PopulatesMenu) {
84 base::scoped_nsobject<NSMenu> menu([[NSMenu alloc] initWithTitle:@"Share"]);
85 NSArray* sharingServicesForURL = [NSSharingService
Robert Sesek 2017/06/28 15:37:55 Nit (and throughout this file): Since this is a C+
86 sharingServicesForItems:@[ [NSURL URLWithString:@"http://example.com"] ]];
87 EXPECT_GT([sharingServicesForURL count], 0U);
88
89 [controller_ menuNeedsUpdate:menu];
90
91 // -1 for reading list, +1 for "More..." if it's showing.
92 NSInteger expectedCount = [sharingServicesForURL count];
93 if (![ShareMenuController shouldShowMoreItem]) {
94 expectedCount--;
95 }
96 EXPECT_EQ([menu numberOfItems], expectedCount);
97
98 NSSharingService* readingListService = [NSSharingService
99 sharingServiceNamed:NSSharingServiceNameAddToSafariReadingList];
100
101 NSUInteger i = 0;
102 // Ensure there's a menu item for each service besides reading list.
103 for (NSSharingService* service in sharingServicesForURL) {
104 if ([service isEqual:readingListService])
105 continue;
106 NSMenuItem* menuItem = [menu itemAtIndex:i];
107 EXPECT_NSEQ([menuItem representedObject], service);
108 EXPECT_EQ([menuItem target], static_cast<id>(controller_));
109 i++;
110 }
111
112 // Ensure the menu is cleared between updates.
113 [controller_ menuNeedsUpdate:menu];
114 EXPECT_EQ([menu numberOfItems], expectedCount);
115 }
116
117 IN_PROC_BROWSER_TEST_F(ShareMenuControllerTest, AddsMoreButton) {
118 if (![ShareMenuController shouldShowMoreItem]) {
119 return;
120 }
121 base::scoped_nsobject<NSMenu> menu([[NSMenu alloc] initWithTitle:@"Share"]);
122 [controller_ menuNeedsUpdate:menu];
123
124 NSInteger numberOfItems = [menu numberOfItems];
125 EXPECT_GT(numberOfItems, 0);
126 NSMenuItem* lastItem = [menu itemAtIndex:numberOfItems - 1];
127 EXPECT_NSEQ(lastItem.title, l10n_util::GetNSString(IDS_SHARING_MORE_MAC));
128 }
129
130 IN_PROC_BROWSER_TEST_F(ShareMenuControllerTest, ActionPerformsShare) {
131 base::scoped_nsobject<MockSharingService> service(
132 [[MockSharingService alloc] init]);
133 EXPECT_FALSE([service sharedItem]);
134
135 PerformShare(service);
136
137 EXPECT_NSEQ([service sharedItem], net::NSURLWithGURL(url_));
138 // Title of chrome/test/data/title2.html
139 EXPECT_NSEQ([service subject], @"Title Of Awesomeness");
140 EXPECT_EQ([service delegate],
141 static_cast<id<NSSharingServiceDelegate>>(controller_));
142 }
143
144 IN_PROC_BROWSER_TEST_F(ShareMenuControllerTest, SharingDelegate) {
145 NSURL* url = [NSURL URLWithString:@"http://google.com"];
146 base::scoped_nsobject<NSSharingService> service(
147 [[NSSharingService alloc] init]);
148
149 PerformShare(service);
150
151 NSWindow* browserWindow = browser()->window()->GetNativeWindow();
152 EXPECT_FALSE(NSEqualRects([controller_ sharingService:service.get()
153 sourceFrameOnScreenForShareItem:url],
154 NSZeroRect));
155 NSSharingContentScope scope = NSSharingContentScopeItem;
156 EXPECT_NSEQ([controller_ sharingService:service.get()
157 sourceWindowForShareItems:@[ url ]
158 sharingContentScope:&scope],
159 browserWindow);
160 EXPECT_EQ(scope, NSSharingContentScopeFull);
161 NSRect contentRect;
162 EXPECT_FALSE([controller_ sharingService:service.get()
163 transitionImageForShareItem:url
164 contentRect:&contentRect] == nil);
165 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698