| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "ios/chrome/browser/ui/activity_services/activity_service_controller.h" | 5 #import "ios/chrome/browser/ui/activity_services/activity_service_controller.h" |
| 6 | 6 |
| 7 #import <MobileCoreServices/MobileCoreServices.h> | 7 #import <MobileCoreServices/MobileCoreServices.h> |
| 8 | 8 |
| 9 #include "base/mac/scoped_nsobject.h" | 9 #include "base/mac/scoped_nsobject.h" |
| 10 #import "base/test/ios/wait_util.h" | 10 #import "base/test/ios/wait_util.h" |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 protected: | 37 protected: |
| 38 void SetUp() override { | 38 void SetUp() override { |
| 39 PlatformTest::SetUp(); | 39 PlatformTest::SetUp(); |
| 40 parentController_.reset( | 40 parentController_.reset( |
| 41 [[UIViewController alloc] initWithNibName:nil bundle:nil]); | 41 [[UIViewController alloc] initWithNibName:nil bundle:nil]); |
| 42 [[UIApplication sharedApplication] keyWindow].rootViewController = | 42 [[UIApplication sharedApplication] keyWindow].rootViewController = |
| 43 parentController_; | 43 parentController_; |
| 44 shareToDelegate_.reset( | 44 shareToDelegate_.reset( |
| 45 [[OCMockObject mockForProtocol:@protocol(ShareToDelegate)] retain]); | 45 [[OCMockObject mockForProtocol:@protocol(ShareToDelegate)] retain]); |
| 46 shareData_.reset([[ShareToData alloc] | 46 shareData_.reset([[ShareToData alloc] |
| 47 initWithURL:GURL("https://chromium.org") | 47 initWithURL:GURL("https://chromium.org") |
| 48 title:@"" | 48 title:@"" |
| 49 isOriginalTitle:YES | 49 isOriginalTitle:YES |
| 50 isPagePrintable:YES]); | 50 isPagePrintable:YES |
| 51 thumbnailGenerator:DummyThumbnailGeneratorBlock()]); |
| 51 } | 52 } |
| 52 | 53 |
| 53 void TearDown() override { | 54 void TearDown() override { |
| 54 [[UIApplication sharedApplication] keyWindow].rootViewController = nil; | 55 [[UIApplication sharedApplication] keyWindow].rootViewController = nil; |
| 55 PlatformTest::TearDown(); | 56 PlatformTest::TearDown(); |
| 56 } | 57 } |
| 57 | 58 |
| 59 ThumbnailGeneratorBlock DummyThumbnailGeneratorBlock() { |
| 60 return ^UIImage*(CGSize const& size) { return nil; }; |
| 61 } |
| 62 |
| 58 id<ShareToDelegate> GetShareToDelegate() { | 63 id<ShareToDelegate> GetShareToDelegate() { |
| 59 return static_cast<id<ShareToDelegate>>(shareToDelegate_.get()); | 64 return static_cast<id<ShareToDelegate>>(shareToDelegate_.get()); |
| 60 } | 65 } |
| 61 | 66 |
| 62 CGRect AnchorRect() { | 67 CGRect AnchorRect() { |
| 63 // On iPad, UIPopovers must be anchored to rectangles that have a non zero | 68 // On iPad, UIPopovers must be anchored to rectangles that have a non zero |
| 64 // size. | 69 // size. |
| 65 return CGRectMake(0, 0, 1, 1); | 70 return CGRectMake(0, 0, 1, 1); |
| 66 } | 71 } |
| 67 | 72 |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 | 233 |
| 229 // Verifies that an UIActivityImageSource is sent to the | 234 // Verifies that an UIActivityImageSource is sent to the |
| 230 // UIActivityViewController if and only if the ShareToData contains an image. | 235 // UIActivityViewController if and only if the ShareToData contains an image. |
| 231 TEST_F(ActivityServiceControllerTest, ActivityItemsForData) { | 236 TEST_F(ActivityServiceControllerTest, ActivityItemsForData) { |
| 232 base::scoped_nsobject<ActivityServiceController> activityController( | 237 base::scoped_nsobject<ActivityServiceController> activityController( |
| 233 [[ActivityServiceController alloc] init]); | 238 [[ActivityServiceController alloc] init]); |
| 234 | 239 |
| 235 // ShareToData does not contain an image, so the result items array will not | 240 // ShareToData does not contain an image, so the result items array will not |
| 236 // contain an image source. | 241 // contain an image source. |
| 237 base::scoped_nsobject<ShareToData> data([[ShareToData alloc] | 242 base::scoped_nsobject<ShareToData> data([[ShareToData alloc] |
| 238 initWithURL:GURL("https://chromium.org") | 243 initWithURL:GURL("https://chromium.org") |
| 239 title:@"foo" | 244 title:@"foo" |
| 240 isOriginalTitle:YES | 245 isOriginalTitle:YES |
| 241 isPagePrintable:YES]); | 246 isPagePrintable:YES |
| 247 thumbnailGenerator:DummyThumbnailGeneratorBlock()]); |
| 242 NSArray* items = [activityController activityItemsForData:data]; | 248 NSArray* items = [activityController activityItemsForData:data]; |
| 243 EXPECT_FALSE(ArrayContainsImageSource(items)); | 249 EXPECT_FALSE(ArrayContainsImageSource(items)); |
| 244 | 250 |
| 245 // Adds an image to the ShareToData object and call -activityItemsForData: | 251 // Adds an image to the ShareToData object and call -activityItemsForData: |
| 246 // again. Verifies that the result items array contains an image source. | 252 // again. Verifies that the result items array contains an image source. |
| 247 [data setImage:[UIImage imageNamed:@"activity_services_print"]]; | 253 [data setImage:[UIImage imageNamed:@"activity_services_print"]]; |
| 248 items = [activityController activityItemsForData:data]; | 254 items = [activityController activityItemsForData:data]; |
| 249 EXPECT_TRUE(ArrayContainsImageSource(items)); | 255 EXPECT_TRUE(ArrayContainsImageSource(items)); |
| 250 } | 256 } |
| 251 | 257 |
| 252 // Verifies that when App Extension support is enabled, the URL string is | 258 // Verifies that when App Extension support is enabled, the URL string is |
| 253 // passed in a dictionary as part of the Activity Items to the App Extension. | 259 // passed in a dictionary as part of the Activity Items to the App Extension. |
| 254 TEST_F(ActivityServiceControllerTest, ActivityItemsForDataWithPasswordAppEx) { | 260 TEST_F(ActivityServiceControllerTest, ActivityItemsForDataWithPasswordAppEx) { |
| 255 base::scoped_nsobject<ActivityServiceController> activityController( | 261 base::scoped_nsobject<ActivityServiceController> activityController( |
| 256 [[ActivityServiceController alloc] init]); | 262 [[ActivityServiceController alloc] init]); |
| 257 base::scoped_nsobject<ShareToData> data([[ShareToData alloc] | 263 base::scoped_nsobject<ShareToData> data([[ShareToData alloc] |
| 258 initWithURL:GURL("https://chromium.org/login.html") | 264 initWithURL:GURL("https://chromium.org/login.html") |
| 259 title:@"kung fu fighting" | 265 title:@"kung fu fighting" |
| 260 isOriginalTitle:YES | 266 isOriginalTitle:YES |
| 261 isPagePrintable:YES]); | 267 isPagePrintable:YES |
| 268 thumbnailGenerator:DummyThumbnailGeneratorBlock()]); |
| 262 NSArray* items = [activityController activityItemsForData:data]; | 269 NSArray* items = [activityController activityItemsForData:data]; |
| 263 NSString* findLoginAction = | 270 NSString* findLoginAction = |
| 264 (NSString*)activity_services::kUTTypeAppExtensionFindLoginAction; | 271 (NSString*)activity_services::kUTTypeAppExtensionFindLoginAction; |
| 265 // Gets the list of NSExtensionItem objects returned by the array of | 272 // Gets the list of NSExtensionItem objects returned by the array of |
| 266 // id<UIActivityItemSource> objects returned by -activityItemsForData:. | 273 // id<UIActivityItemSource> objects returned by -activityItemsForData:. |
| 267 NSArray* extensionItems = FindItemsForActivityType( | 274 NSArray* extensionItems = FindItemsForActivityType( |
| 268 items, activity_services::kAppExtensionOnePassword); | 275 items, activity_services::kAppExtensionOnePassword); |
| 269 ASSERT_EQ(1U, [extensionItems count]); | 276 ASSERT_EQ(1U, [extensionItems count]); |
| 270 NSExtensionItem* item = extensionItems[0]; | 277 NSExtensionItem* item = extensionItems[0]; |
| 271 EXPECT_EQ(1U, item.attachments.count); | 278 EXPECT_EQ(1U, item.attachments.count); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 EXPECT_NSEQ(@"kung fu fighting", title); | 316 EXPECT_NSEQ(@"kung fu fighting", title); |
| 310 } | 317 } |
| 311 | 318 |
| 312 // Verifies that a Share extension can fetch a URL when Password App Extension | 319 // Verifies that a Share extension can fetch a URL when Password App Extension |
| 313 // is enabled. | 320 // is enabled. |
| 314 TEST_F(ActivityServiceControllerTest, | 321 TEST_F(ActivityServiceControllerTest, |
| 315 ActivityItemsForDataWithPasswordAppExReturnsURL) { | 322 ActivityItemsForDataWithPasswordAppExReturnsURL) { |
| 316 base::scoped_nsobject<ActivityServiceController> activityController( | 323 base::scoped_nsobject<ActivityServiceController> activityController( |
| 317 [[ActivityServiceController alloc] init]); | 324 [[ActivityServiceController alloc] init]); |
| 318 base::scoped_nsobject<ShareToData> data([[ShareToData alloc] | 325 base::scoped_nsobject<ShareToData> data([[ShareToData alloc] |
| 319 initWithURL:GURL("https://chromium.org/login.html") | 326 initWithURL:GURL("https://chromium.org/login.html") |
| 320 title:@"kung fu fighting" | 327 title:@"kung fu fighting" |
| 321 isOriginalTitle:YES | 328 isOriginalTitle:YES |
| 322 isPagePrintable:YES]); | 329 isPagePrintable:YES |
| 330 thumbnailGenerator:DummyThumbnailGeneratorBlock()]); |
| 323 NSArray* items = [activityController activityItemsForData:data]; | 331 NSArray* items = [activityController activityItemsForData:data]; |
| 324 NSString* shareAction = @"com.apple.UIKit.activity.PostToFacebook"; | 332 NSString* shareAction = @"com.apple.UIKit.activity.PostToFacebook"; |
| 325 NSArray* urlItems = | 333 NSArray* urlItems = |
| 326 FindItemsEqualsToUTType(items, shareAction, @"public.url"); | 334 FindItemsEqualsToUTType(items, shareAction, @"public.url"); |
| 327 ASSERT_EQ(1U, [urlItems count]); | 335 ASSERT_EQ(1U, [urlItems count]); |
| 328 id<UIActivityItemSource> itemSource = urlItems[0]; | 336 id<UIActivityItemSource> itemSource = urlItems[0]; |
| 329 id mockActivityViewController = | 337 id mockActivityViewController = |
| 330 [OCMockObject niceMockForClass:[UIActivityViewController class]]; | 338 [OCMockObject niceMockForClass:[UIActivityViewController class]]; |
| 331 id item = [itemSource activityViewController:mockActivityViewController | 339 id item = [itemSource activityViewController:mockActivityViewController |
| 332 itemForActivityType:shareAction]; | 340 itemForActivityType:shareAction]; |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 419 } | 427 } |
| 420 | 428 |
| 421 // Verifies that the PrintActivity is sent to the UIActivityViewController if | 429 // Verifies that the PrintActivity is sent to the UIActivityViewController if |
| 422 // and only if the activity is "printable". | 430 // and only if the activity is "printable". |
| 423 TEST_F(ActivityServiceControllerTest, ApplicationActivitiesForData) { | 431 TEST_F(ActivityServiceControllerTest, ApplicationActivitiesForData) { |
| 424 base::scoped_nsobject<ActivityServiceController> activityController( | 432 base::scoped_nsobject<ActivityServiceController> activityController( |
| 425 [[ActivityServiceController alloc] init]); | 433 [[ActivityServiceController alloc] init]); |
| 426 | 434 |
| 427 // Verify printable data. | 435 // Verify printable data. |
| 428 base::scoped_nsobject<ShareToData> data([[ShareToData alloc] | 436 base::scoped_nsobject<ShareToData> data([[ShareToData alloc] |
| 429 initWithURL:GURL("https://chromium.org/printable") | 437 initWithURL:GURL("https://chromium.org/printable") |
| 430 title:@"bar" | 438 title:@"bar" |
| 431 isOriginalTitle:YES | 439 isOriginalTitle:YES |
| 432 isPagePrintable:YES]); | 440 isPagePrintable:YES |
| 441 thumbnailGenerator:DummyThumbnailGeneratorBlock()]); |
| 433 | 442 |
| 434 NSArray* items = | 443 NSArray* items = |
| 435 [activityController applicationActivitiesForData:data controller:nil]; | 444 [activityController applicationActivitiesForData:data controller:nil]; |
| 436 NSUInteger expected_items_count = | 445 NSUInteger expected_items_count = |
| 437 reading_list::switches::IsReadingListEnabled() ? 2U : 1U; | 446 reading_list::switches::IsReadingListEnabled() ? 2U : 1U; |
| 438 ASSERT_EQ(expected_items_count, [items count]); | 447 ASSERT_EQ(expected_items_count, [items count]); |
| 439 EXPECT_EQ([PrintActivity class], [[items objectAtIndex:0] class]); | 448 EXPECT_EQ([PrintActivity class], [[items objectAtIndex:0] class]); |
| 440 | 449 |
| 441 // Verify non-printable data. | 450 // Verify non-printable data. |
| 442 data.reset([[ShareToData alloc] | 451 data.reset([[ShareToData alloc] |
| 443 initWithURL:GURL("https://chromium.org/unprintable") | 452 initWithURL:GURL("https://chromium.org/unprintable") |
| 444 title:@"baz" | 453 title:@"baz" |
| 445 isOriginalTitle:YES | 454 isOriginalTitle:YES |
| 446 isPagePrintable:NO]); | 455 isPagePrintable:NO |
| 456 thumbnailGenerator:DummyThumbnailGeneratorBlock()]); |
| 447 items = [activityController applicationActivitiesForData:data controller:nil]; | 457 items = [activityController applicationActivitiesForData:data controller:nil]; |
| 448 EXPECT_EQ(expected_items_count - 1, [items count]); | 458 EXPECT_EQ(expected_items_count - 1, [items count]); |
| 449 } | 459 } |
| 450 | 460 |
| 451 TEST_F(ActivityServiceControllerTest, FindLoginActionTypeConformsToPublicURL) { | 461 TEST_F(ActivityServiceControllerTest, FindLoginActionTypeConformsToPublicURL) { |
| 452 // If this test fails, it is probably due to missing or incorrect | 462 // If this test fails, it is probably due to missing or incorrect |
| 453 // UTImportedTypeDeclarations in Info.plist. Note that there are | 463 // UTImportedTypeDeclarations in Info.plist. Note that there are |
| 454 // two Info.plist, | 464 // two Info.plist, |
| 455 // - ios/chrome/app/resources/Info.plist for Chrome app | 465 // - ios/chrome/app/resources/Info.plist for Chrome app |
| 456 // - testing/gtest_ios/unittest-Info.plist for ios_chrome_unittests | 466 // - testing/gtest_ios/unittest-Info.plist for ios_chrome_unittests |
| (...skipping 14 matching lines...) Expand all Loading... |
| 471 // public.url UTType in order to allow Share actions (e.g. Facebook, Twitter, | 481 // public.url UTType in order to allow Share actions (e.g. Facebook, Twitter, |
| 472 // etc) to appear on UIActivityViewController opened by Chrome). | 482 // etc) to appear on UIActivityViewController opened by Chrome). |
| 473 CFStringRef chromeFindLoginAction = reinterpret_cast<CFStringRef>( | 483 CFStringRef chromeFindLoginAction = reinterpret_cast<CFStringRef>( |
| 474 activity_services::kUTTypeAppExtensionFindLoginAction); | 484 activity_services::kUTTypeAppExtensionFindLoginAction); |
| 475 EXPECT_TRUE(UTTypeConformsTo(chromeFindLoginAction, kUTTypeURL)); | 485 EXPECT_TRUE(UTTypeConformsTo(chromeFindLoginAction, kUTTypeURL)); |
| 476 EXPECT_TRUE( | 486 EXPECT_TRUE( |
| 477 UTTypeConformsTo(chromeFindLoginAction, onePasswordFindLoginAction)); | 487 UTTypeConformsTo(chromeFindLoginAction, onePasswordFindLoginAction)); |
| 478 } | 488 } |
| 479 | 489 |
| 480 } // namespace | 490 } // namespace |
| OLD | NEW |