⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pasteboardmac.mm

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 MM
📖 第 1 页 / 共 2 页
字号:
/* * 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 &nbsp; 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 + -