📄 pasteboardmac.mm
字号:
/* * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */#import "config.h"#import "Pasteboard.h"#import "CachedResource.h"#import "CharacterNames.h"#import "DOMRangeInternal.h"#import "Document.h"#import "DocumentFragment.h"#import "Editor.h"#import "EditorClient.h"#import "Frame.h"#import "HitTestResult.h"#import "Image.h"#import "KURL.h"#import "LegacyWebArchive.h"#import "LoaderNSURLExtras.h"#import "MIMETypeRegistry.h"#import "RenderImage.h"#import "WebCoreNSStringExtras.h"#import "markup.h"#import <wtf/StdLibExtras.h>#import <wtf/RetainPtr.h>#import <wtf/UnusedParam.h>@interface NSAttributedString (AppKitSecretsIKnowAbout)- (id)_initWithDOMRange:(DOMRange *)domRange;@endnamespace WebCore {// FIXME: It's not great to have these both here and in WebKit.NSString *WebArchivePboardType = @"Apple Web Archive pasteboard type";NSString *WebSmartPastePboardType = @"NeXT smart paste pasteboard type";NSString *WebURLNamePboardType = @"public.url-name";NSString *WebURLPboardType = @"public.url";NSString *WebURLsWithTitlesPboardType = @"WebURLsWithTitlesPboardType";#ifndef BUILDING_ON_TIGERstatic NSArray* selectionPasteboardTypes(bool canSmartCopyOrDelete, bool selectionContainsAttachments){ if (selectionContainsAttachments) { if (canSmartCopyOrDelete) return [NSArray arrayWithObjects:WebSmartPastePboardType, WebArchivePboardType, NSRTFDPboardType, NSRTFPboardType, NSStringPboardType, nil]; else return [NSArray arrayWithObjects:WebArchivePboardType, NSRTFDPboardType, NSRTFPboardType, NSStringPboardType, nil]; } else { // Don't write RTFD to the pasteboard when the copied attributed string has no attachments. if (canSmartCopyOrDelete) return [NSArray arrayWithObjects:WebSmartPastePboardType, WebArchivePboardType, NSRTFPboardType, NSStringPboardType, nil]; else return [NSArray arrayWithObjects:WebArchivePboardType, NSRTFPboardType, NSStringPboardType, nil]; }}#endifstatic NSArray* writableTypesForURL(){ DEFINE_STATIC_LOCAL(RetainPtr<NSArray>, types, ([[NSArray alloc] initWithObjects: WebURLsWithTitlesPboardType, NSURLPboardType, WebURLPboardType, WebURLNamePboardType, NSStringPboardType, nil])); return types.get();}static inline NSArray* createWritableTypesForImage(){ NSMutableArray *types = [[NSMutableArray alloc] initWithObjects:NSTIFFPboardType, nil]; [types addObjectsFromArray:writableTypesForURL()]; [types addObject:NSRTFDPboardType]; return types;}static NSArray* writableTypesForImage(){ DEFINE_STATIC_LOCAL(RetainPtr<NSArray>, types, (createWritableTypesForImage())); return types.get();}Pasteboard* Pasteboard::generalPasteboard() { static Pasteboard* pasteboard = new Pasteboard([NSPasteboard generalPasteboard]); return pasteboard;}Pasteboard::Pasteboard(NSPasteboard* pboard) : m_pasteboard(pboard){}void Pasteboard::clear(){ [m_pasteboard.get() declareTypes:[NSArray array] owner:nil];}static NSAttributedString *stripAttachmentCharacters(NSAttributedString *string){ const unichar attachmentCharacter = NSAttachmentCharacter; DEFINE_STATIC_LOCAL(RetainPtr<NSString>, attachmentCharacterString, ([NSString stringWithCharacters:&attachmentCharacter length:1])); NSMutableAttributedString *result = [[string mutableCopy] autorelease]; NSRange attachmentRange = [[result string] rangeOfString:attachmentCharacterString.get()]; while (attachmentRange.location != NSNotFound) { [result replaceCharactersInRange:attachmentRange withString:@""]; attachmentRange = [[result string] rangeOfString:attachmentCharacterString.get()]; } return result;}void Pasteboard::writeSelection(NSPasteboard* pasteboard, Range* selectedRange, bool canSmartCopyOrDelete, Frame* frame){ if (WebArchivePboardType == nil) Pasteboard::generalPasteboard(); //Initialises pasteboard types ASSERT(selectedRange); NSAttributedString *attributedString = [[[NSAttributedString alloc] _initWithDOMRange:[DOMRange _wrapRange:selectedRange]] autorelease];#ifdef BUILDING_ON_TIGER // 4930197: Mail overrides [WebHTMLView pasteboardTypesForSelection] in order to add another type to the pasteboard // after WebKit does. On Tiger we must call this function so that Mail code will be executed, meaning that // we can't call WebCore::Pasteboard's method for setting types. UNUSED_PARAM(canSmartCopyOrDelete); NSArray *types = frame->editor()->client()->pasteboardTypesForSelection(frame); // Don't write RTFD to the pasteboard when the copied attributed string has no attachments. NSMutableArray *mutableTypes = nil; if (![attributedString containsAttachments]) { mutableTypes = [[types mutableCopy] autorelease]; [mutableTypes removeObject:NSRTFDPboardType]; types = mutableTypes; } [pasteboard declareTypes:types owner:nil]; #else NSArray *types = selectionPasteboardTypes(canSmartCopyOrDelete, [attributedString containsAttachments]); [pasteboard declareTypes:types owner:nil]; frame->editor()->client()->didSetSelectionTypesForPasteboard();#endif // Put HTML on the pasteboard. if ([types containsObject:WebArchivePboardType]) { RefPtr<LegacyWebArchive> archive = LegacyWebArchive::createFromSelection(frame); RetainPtr<CFDataRef> data = archive ? archive->rawDataRepresentation() : 0; [pasteboard setData:(NSData *)data.get() forType:WebArchivePboardType]; } // Put the attributed string on the pasteboard (RTF/RTFD format). if ([types containsObject:NSRTFDPboardType]) { NSData *RTFDData = [attributedString RTFDFromRange:NSMakeRange(0, [attributedString length]) documentAttributes:nil]; [pasteboard setData:RTFDData forType:NSRTFDPboardType]; } if ([types containsObject:NSRTFPboardType]) { if ([attributedString containsAttachments]) attributedString = stripAttachmentCharacters(attributedString); NSData *RTFData = [attributedString RTFFromRange:NSMakeRange(0, [attributedString length]) documentAttributes:nil]; [pasteboard setData:RTFData forType:NSRTFPboardType]; } // Put plain string on the pasteboard. if ([types containsObject:NSStringPboardType]) { // Map to a plain old space because this is better for source code, other browsers do it, // and because HTML forces you to do this any time you want two spaces in a row. String text = frame->displayStringModifiedByEncoding(selectedRange->text()); NSMutableString *s = [[[(NSString*)text copy] autorelease] mutableCopy]; NSString *NonBreakingSpaceString = [NSString stringWithCharacters:&noBreakSpace length:1];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -