| // Copyright 2011 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/cocoa/find_pasteboard.h" |
| |
| #import <Cocoa/Cocoa.h> |
| |
| #include "base/memory/ref_counted.h" |
| #import "chrome/browser/ui/cocoa/test/cocoa_test_helper.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "testing/platform_test.h" |
| #include "ui/base/clipboard/clipboard_util_mac.h" |
| |
| // A subclass of FindPasteboard that doesn't write to the real find pasteboard. |
| @interface FindPasteboardTesting : FindPasteboard { |
| @private |
| scoped_refptr<ui::UniquePasteboard> _pasteboard; |
| } |
| - (NSPasteboard*)findPasteboard; |
| |
| // These are for checking that pasteboard content is copied to/from the |
| // FindPasteboard correctly. |
| - (NSString*)findPasteboardText; |
| - (void)setFindPasteboardText:(NSString*)text; |
| @end |
| |
| @implementation FindPasteboardTesting |
| |
| - (NSPasteboard*)findPasteboard { |
| // This method is called by the super class's -init, otherwise initialization |
| // would go into this class's -init. |
| if (!_pasteboard) { |
| _pasteboard = new ui::UniquePasteboard; |
| } |
| return _pasteboard->get(); |
| } |
| |
| - (void)setFindPasteboardText:(NSString*)text { |
| NSPasteboard* pasteboard = _pasteboard->get(); |
| [pasteboard clearContents]; |
| [pasteboard writeObjects:@[ text ]]; |
| } |
| |
| - (NSString*)findPasteboardText { |
| NSArray* objects = |
| [_pasteboard->get() readObjectsForClasses:@[ [NSString class] ] |
| options:nil]; |
| return objects.firstObject; |
| } |
| @end |
| |
| namespace { |
| |
| class FindPasteboardTest : public CocoaTest { |
| public: |
| FindPasteboardTest() = default; |
| |
| void SetUp() override { |
| CocoaTest::SetUp(); |
| pasteboard_ = [[FindPasteboardTesting alloc] init]; |
| ASSERT_TRUE(pasteboard_); |
| } |
| |
| void TearDown() override { |
| pasteboard_ = nil; |
| CocoaTest::TearDown(); |
| } |
| |
| protected: |
| FindPasteboardTesting* __strong pasteboard_; |
| }; |
| |
| TEST_F(FindPasteboardTest, SettingTextUpdatesPboard) { |
| [pasteboard_ setFindText:@"text"]; |
| EXPECT_EQ(NSOrderedSame, [[pasteboard_ findPasteboardText] compare:@"text"]); |
| } |
| |
| TEST_F(FindPasteboardTest, ReadingFromPboardUpdatesFindText) { |
| [pasteboard_ setFindPasteboardText:@"text"]; |
| [pasteboard_ loadTextFromPasteboard:nil]; |
| EXPECT_EQ(NSOrderedSame, [[pasteboard_ findText] compare:@"text"]); |
| } |
| |
| TEST_F(FindPasteboardTest, SendsNotificationWhenTextChanges) { |
| __block int notification_count = 0; |
| [NSNotificationCenter.defaultCenter |
| addObserverForName:kFindPasteboardChangedNotification |
| object:pasteboard_ |
| queue:nil |
| usingBlock:^(NSNotification* note) { |
| ++notification_count; |
| }]; |
| EXPECT_EQ(0, notification_count); |
| [pasteboard_ setFindText:@"text"]; |
| EXPECT_EQ(1, notification_count); |
| [pasteboard_ setFindText:@"text"]; |
| EXPECT_EQ(1, notification_count); |
| [pasteboard_ setFindText:@"other text"]; |
| EXPECT_EQ(2, notification_count); |
| |
| [pasteboard_ setFindPasteboardText:@"other text"]; |
| [pasteboard_ loadTextFromPasteboard:nil]; |
| EXPECT_EQ(2, notification_count); |
| |
| [pasteboard_ setFindPasteboardText:@"otherer text"]; |
| [pasteboard_ loadTextFromPasteboard:nil]; |
| EXPECT_EQ(3, notification_count); |
| |
| [NSNotificationCenter.defaultCenter removeObserver:pasteboard_]; |
| } |
| |
| } // namespace |