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

Unified Diff: chrome/browser/ui/cocoa/share_menu_controller_browsertest.mm

Issue 2950403002: [Mac] Add system share menu
Patch Set: CL comments Created 3 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/cocoa/share_menu_controller_browsertest.mm
diff --git a/chrome/browser/ui/cocoa/share_menu_controller_browsertest.mm b/chrome/browser/ui/cocoa/share_menu_controller_browsertest.mm
new file mode 100644
index 0000000000000000000000000000000000000000..faa46eb819bd01596063ea0842404d5c109389b1
--- /dev/null
+++ b/chrome/browser/ui/cocoa/share_menu_controller_browsertest.mm
@@ -0,0 +1,167 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "chrome/browser/ui/cocoa/share_menu_controller.h"
+
+#import "base/mac/scoped_nsobject.h"
+#import "base/path_service.h"
+#include "base/strings/sys_string_conversions.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/ui/cocoa/test/cocoa_profile_test.h"
+#import "chrome/browser/ui/cocoa/test/cocoa_test_helper.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/common/chrome_paths.h"
+#include "chrome/grit/generated_resources.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "net/base/mac/url_conversions.h"
+#include "testing/gtest_mac.h"
+#include "ui/base/l10n/l10n_util_mac.h"
+
+// Mock sharing service for sensing shared items.
+@interface MockSharingService : NSSharingService
+
+// Weak since both this object and the shared item
+// should only live in the scope of the test.
+@property(nonatomic, assign) id sharedItem;
+
+@end
+
+@implementation MockSharingService
+
+// The real one is backed by SHKSharingService parameters which
+// don't appear to be present when inheriting from vanilla
+// |NSSharingService|.
+@synthesize subject;
+@synthesize sharedItem = sharedItem_;
+
+- (void)performWithItems:(NSArray*)items {
+ [self setSharedItem:[items firstObject]];
+}
+
+@end
+
+class ShareMenuControllerTest : public InProcessBrowserTest {
+ public:
+ ShareMenuControllerTest() {}
+
+ void SetUpOnMainThread() override {
+ base::FilePath test_data_dir;
+ PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir);
+ embedded_test_server()->ServeFilesFromDirectory(test_data_dir);
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ url_ = embedded_test_server()->GetURL("/title2.html");
+ AddTabAtIndex(0, url_, ui::PAGE_TRANSITION_TYPED);
+ controller_.reset([[ShareMenuController alloc] init]);
+ }
+
+ protected:
+ // Create a menu item for |service| and trigger it using
+ // the target/action of real menu items created by
+ // |controller_|
+ void PerformShare(NSSharingService* service) {
+ base::scoped_nsobject<NSMenu> menu([[NSMenu alloc] initWithTitle:@"Share"]);
+
+ [controller_ menuNeedsUpdate:menu];
+
+ base::scoped_nsobject<NSMenuItem> mock_menu_item([[NSMenuItem alloc]
+ initWithTitle:@"test"
+ action:nil
+ keyEquivalent:@""]);
+ [mock_menu_item setRepresentedObject:service];
+
+ NSMenuItem* first_menu_item = [menu itemAtIndex:0];
+ id target = [first_menu_item target];
+ SEL action = [first_menu_item action];
+ [target performSelector:action withObject:mock_menu_item.get()];
+ }
+ GURL url_;
+ base::scoped_nsobject<ShareMenuController> controller_;
+};
+
+IN_PROC_BROWSER_TEST_F(ShareMenuControllerTest, PopulatesMenu) {
+ base::scoped_nsobject<NSMenu> menu([[NSMenu alloc] initWithTitle:@"Share"]);
+ NSArray* sharing_services_for_url = [NSSharingService
+ sharingServicesForItems:@[ [NSURL URLWithString:@"http://example.com"] ]];
+ EXPECT_GT([sharing_services_for_url count], 0U);
+
+ [controller_ menuNeedsUpdate:menu];
+
+ // -1 for reading list, +1 for "More..." if it's showing.
+ NSInteger expected_count = [sharing_services_for_url count];
+ if (![ShareMenuController shouldShowMoreItem]) {
+ expected_count--;
+ }
+ EXPECT_EQ([menu numberOfItems], expected_count);
+
+ NSSharingService* reading_list_service = [NSSharingService
+ sharingServiceNamed:NSSharingServiceNameAddToSafariReadingList];
+
+ NSUInteger i = 0;
+ // Ensure there's a menu item for each service besides reading list.
+ for (NSSharingService* service in sharing_services_for_url) {
+ if ([service isEqual:reading_list_service])
+ continue;
+ NSMenuItem* menu_item = [menu itemAtIndex:i];
+ EXPECT_NSEQ([menu_item representedObject], service);
+ EXPECT_EQ([menu_item target], static_cast<id>(controller_));
+ i++;
+ }
+
+ // Ensure the menu is cleared between updates.
+ [controller_ menuNeedsUpdate:menu];
+ EXPECT_EQ([menu numberOfItems], expected_count);
+}
+
+IN_PROC_BROWSER_TEST_F(ShareMenuControllerTest, AddsMoreButton) {
+ if (![ShareMenuController shouldShowMoreItem]) {
+ return;
+ }
+ base::scoped_nsobject<NSMenu> menu([[NSMenu alloc] initWithTitle:@"Share"]);
+ [controller_ menuNeedsUpdate:menu];
+
+ NSInteger number_of_items = [menu numberOfItems];
+ EXPECT_GT(number_of_items, 0);
+ NSMenuItem* last_item = [menu itemAtIndex:number_of_items - 1];
+ EXPECT_NSEQ(last_item.title, l10n_util::GetNSString(IDS_SHARING_MORE_MAC));
+}
+
+IN_PROC_BROWSER_TEST_F(ShareMenuControllerTest, ActionPerformsShare) {
+ base::scoped_nsobject<MockSharingService> service(
+ [[MockSharingService alloc] init]);
+ EXPECT_FALSE([service sharedItem]);
+
+ PerformShare(service);
+
+ EXPECT_NSEQ([service sharedItem], net::NSURLWithGURL(url_));
+ // Title of chrome/test/data/title2.html
+ EXPECT_NSEQ([service subject], @"Title Of Awesomeness");
+ EXPECT_EQ([service delegate],
+ static_cast<id<NSSharingServiceDelegate>>(controller_));
+}
+
+IN_PROC_BROWSER_TEST_F(ShareMenuControllerTest, SharingDelegate) {
+ NSURL* url = [NSURL URLWithString:@"http://google.com"];
+ base::scoped_nsobject<NSSharingService> service(
+ [[NSSharingService alloc] init]);
+
+ PerformShare(service);
+
+ NSWindow* browser_window = browser()->window()->GetNativeWindow();
+ EXPECT_FALSE(NSEqualRects([controller_ sharingService:service.get()
+ sourceFrameOnScreenForShareItem:url],
+ NSZeroRect));
+ NSSharingContentScope scope = NSSharingContentScopeItem;
+ EXPECT_NSEQ([controller_ sharingService:service.get()
+ sourceWindowForShareItems:@[ url ]
+ sharingContentScope:&scope],
+ browser_window);
+ EXPECT_EQ(scope, NSSharingContentScopeFull);
+ NSRect contentRect;
+ EXPECT_FALSE([controller_ sharingService:service.get()
+ transitionImageForShareItem:url
+ contentRect:&contentRect] == nil);
+}

Powered by Google App Engine
This is Rietveld 408576698