15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2009 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import "ui/base/cocoa/find_pasteboard.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/sys_string_conversions.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSString* kFindPasteboardChangedNotification = 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @"kFindPasteboardChangedNotification_Chrome"; 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@implementation FindPasteboard 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)+ (FindPasteboard*)sharedInstance { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static FindPasteboard* instance = nil; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance) { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance = [[FindPasteboard alloc] init]; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return instance; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (id)init { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((self = [super init])) { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) findText_.reset([[NSString alloc] init]); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if the text in the findboard has changed on app activate. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [[NSNotificationCenter defaultCenter] 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addObserver:self 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selector:@selector(loadTextFromPasteboard:) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name:NSApplicationDidBecomeActiveNotification 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) object:nil]; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [self loadTextFromPasteboard:nil]; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return self; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)dealloc { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since this is a singleton, this should only be executed in test code. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [[NSNotificationCenter defaultCenter] removeObserver:self]; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [super dealloc]; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (NSPasteboard*)findPboard { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return [NSPasteboard pasteboardWithName:NSFindPboard]; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)loadTextFromPasteboard:(NSNotification*)notification { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSPasteboard* findPboard = [self findPboard]; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ([[findPboard types] containsObject:NSStringPboardType]) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [self setFindText:[findPboard stringForType:NSStringPboardType]]; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (NSString*)findText { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return findText_; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)setFindText:(NSString*)newText { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(newText); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!newText) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK([NSThread isMainThread]); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BOOL needToSendNotification = ![findText_.get() isEqualToString:newText]; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (needToSendNotification) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) findText_.reset([newText copy]); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSPasteboard* findPboard = [self findPboard]; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [findPboard declareTypes:[NSArray arrayWithObject:NSStringPboardType] 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) owner:nil]; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [findPboard setString:findText_.get() forType:NSStringPboardType]; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [[NSNotificationCenter defaultCenter] 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) postNotificationName:kFindPasteboardChangedNotification 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) object:self]; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@end 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 GetFindPboardText() { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::SysNSStringToUTF16([[FindPasteboard sharedInstance] findText]); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 83