| // Copyright 2016 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #import "ui/base/clipboard/clipboard_util_mac.h" |
| |
| #include "base/mac/mac_util.h" |
| #include "base/memory/ref_counted.h" |
| #include "build/build_config.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "testing/gtest_mac.h" |
| #include "testing/platform_test.h" |
| #include "ui/base/clipboard/clipboard_constants.h" |
| |
| namespace ui { |
| namespace { |
| |
| using ClipboardUtilMacTest = PlatformTest; |
| |
| TEST_F(ClipboardUtilMacTest, PasteboardItemsFromUrlsRoundtrip) { |
| NSString* url_string_1 = |
| @"https://www.google.com/" |
| @"search?q=test&oq=test&aqs=chrome..69i57l2j69i60l4.278j0j7&" |
| @"sourceid=chrome&ie=UTF-8"; |
| |
| NSString* url_string_2 = @"https://www.google.com/"; |
| NSString* title_2 = @"Burrowing Yams"; |
| |
| NSArray<NSPasteboardItem*>* items = clipboard_util::PasteboardItemsFromUrls( |
| @[ url_string_1, url_string_2 ], @[ @"", title_2 ]); |
| |
| scoped_refptr<UniquePasteboard> pasteboard = new UniquePasteboard; |
| [pasteboard->get() writeObjects:items]; |
| |
| NSArray<URLAndTitle*>* urls_and_titles = |
| clipboard_util::URLsAndTitlesFromPasteboard(pasteboard->get(), |
| /*include_files=*/false); |
| |
| ASSERT_EQ(2u, urls_and_titles.count); |
| EXPECT_NSEQ(url_string_1, urls_and_titles[0].URL); |
| EXPECT_NSEQ(url_string_2, urls_and_titles[1].URL); |
| EXPECT_NSEQ(@"", urls_and_titles[0].title); |
| EXPECT_NSEQ(title_2, urls_and_titles[1].title); |
| |
| NSURL* url = [NSURL URLFromPasteboard:pasteboard->get()]; |
| EXPECT_NSEQ(url.absoluteString, url_string_1); |
| |
| // Only the first item should have the "web urls and titles" data. |
| EXPECT_TRUE([items[0].types containsObject:kUTTypeWebKitWebUrlsWithTitles]); |
| EXPECT_FALSE([items[1].types containsObject:kUTTypeWebKitWebUrlsWithTitles]); |
| } |
| |
| TEST_F(ClipboardUtilMacTest, PasteboardUrlsFromString) { |
| { |
| NSString* url_string = @" https://www.google.com/ "; |
| |
| scoped_refptr<UniquePasteboard> pasteboard = new UniquePasteboard; |
| [pasteboard->get() writeObjects:@[ url_string ]]; |
| |
| NSArray<URLAndTitle*>* urls_and_titles = |
| clipboard_util::URLsAndTitlesFromPasteboard(pasteboard->get(), |
| /*include_files=*/false); |
| |
| ASSERT_EQ(1u, urls_and_titles.count); |
| EXPECT_NSEQ(@"https://www.google.com/", urls_and_titles[0].URL); |
| EXPECT_NSEQ(@"www.google.com", urls_and_titles[0].title); |
| } |
| |
| // Even when renderer-tainted, HTTPS URLs should be synthesized from |
| // NSPasteboard's text content. |
| { |
| NSString* url_string = @" https://www.google.com/ "; |
| NSPasteboardItem* item = [[NSPasteboardItem alloc] init]; |
| [item setString:url_string forType:NSPasteboardTypeString]; |
| [item setString:@"https://www.google.com/" |
| forType:kUTTypeChromiumRendererInitiatedDrag]; |
| |
| scoped_refptr<UniquePasteboard> pasteboard = new UniquePasteboard; |
| [pasteboard->get() writeObjects:@[ item ]]; |
| |
| NSArray<URLAndTitle*>* urls_and_titles = |
| clipboard_util::URLsAndTitlesFromPasteboard(pasteboard->get(), |
| /*include_files=*/false); |
| |
| ASSERT_EQ(1u, urls_and_titles.count); |
| EXPECT_NSEQ(@"https://www.google.com/", urls_and_titles[0].URL); |
| EXPECT_NSEQ(@"www.google.com", urls_and_titles[0].title); |
| } |
| } |
| |
| TEST_F(ClipboardUtilMacTest, PasteboardUrlsFromNonHttpAndNonHttpsUrlString) { |
| { |
| NSString* url_string = @"chrome://settings/"; |
| |
| scoped_refptr<UniquePasteboard> pasteboard = new UniquePasteboard; |
| [pasteboard->get() writeObjects:@[ url_string ]]; |
| |
| NSArray<URLAndTitle*>* urls_and_titles = |
| clipboard_util::URLsAndTitlesFromPasteboard(pasteboard->get(), |
| /*include_files=*/false); |
| |
| ASSERT_EQ(1u, urls_and_titles.count); |
| EXPECT_NSEQ(@"chrome://settings/", urls_and_titles[0].URL); |
| EXPECT_NSEQ(@"settings", urls_and_titles[0].title); |
| } |
| |
| // A non-HTTP / non-HTTPS URL should not be synthesized from a |
| // renderer-tainted NSPasteboard's text content. |
| { |
| NSString* url_string = @"chrome://settings/"; |
| NSPasteboardItem* item = [[NSPasteboardItem alloc] init]; |
| [item setString:url_string forType:NSPasteboardTypeString]; |
| [item setString:@"chrome://settings/" |
| forType:kUTTypeChromiumRendererInitiatedDrag]; |
| |
| scoped_refptr<UniquePasteboard> pasteboard = new UniquePasteboard; |
| [pasteboard->get() writeObjects:@[ item ]]; |
| |
| NSArray<URLAndTitle*>* urls_and_titles = |
| clipboard_util::URLsAndTitlesFromPasteboard(pasteboard->get(), |
| /*include_files=*/false); |
| |
| ASSERT_EQ(0u, urls_and_titles.count); |
| } |
| } |
| |
| TEST_F(ClipboardUtilMacTest, PasteboardUrlsWithFilePath) { |
| NSURL* url = [NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES]; |
| ASSERT_TRUE(url); |
| NSString* url_string = url.absoluteString; |
| |
| NSPasteboardItem* item = [[NSPasteboardItem alloc] init]; |
| [item setString:url_string forType:NSPasteboardTypeFileURL]; |
| |
| scoped_refptr<UniquePasteboard> pasteboard = new UniquePasteboard; |
| [pasteboard->get() writeObjects:@[ item ]]; |
| |
| // Read without translating file URLs, expect to not find it. |
| |
| NSArray<URLAndTitle*>* urls_and_titles = |
| clipboard_util::URLsAndTitlesFromPasteboard(pasteboard->get(), |
| /*include_files=*/false); |
| |
| ASSERT_EQ(0u, urls_and_titles.count); |
| |
| // Read with translating file URLs, expect to find it. |
| |
| urls_and_titles = |
| clipboard_util::URLsAndTitlesFromPasteboard(pasteboard->get(), |
| /*include_files=*/true); |
| |
| ASSERT_EQ(1u, urls_and_titles.count); |
| EXPECT_NSEQ(url_string, urls_and_titles[0].URL); |
| } |
| |
| TEST_F(ClipboardUtilMacTest, CheckForLeak) { |
| for (int i = 0; i < 10000; ++i) { |
| @autoreleasepool { |
| scoped_refptr<UniquePasteboard> pboard = new UniquePasteboard; |
| EXPECT_TRUE(pboard->get()); |
| } |
| } |
| } |
| |
| } // namespace |
| } // namespace ui |