summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/mac/ClipboardMac.mm
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/mac/ClipboardMac.mm')
-rw-r--r--WebCore/platform/mac/ClipboardMac.mm360
1 files changed, 0 insertions, 360 deletions
diff --git a/WebCore/platform/mac/ClipboardMac.mm b/WebCore/platform/mac/ClipboardMac.mm
deleted file mode 100644
index 8117b2b..0000000
--- a/WebCore/platform/mac/ClipboardMac.mm
+++ /dev/null
@@ -1,360 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006, 2008 Apple 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 "ClipboardMac.h"
-
-#import "DOMElementInternal.h"
-#import "DragClient.h"
-#import "DragController.h"
-#import "Editor.h"
-#import "FoundationExtras.h"
-#import "Frame.h"
-#import "Image.h"
-#import "Page.h"
-#import "Pasteboard.h"
-#import "RenderImage.h"
-#import "WebCoreSystemInterface.h"
-
-namespace WebCore {
-
-ClipboardMac::ClipboardMac(bool forDragging, NSPasteboard *pasteboard, ClipboardAccessPolicy policy, Frame *frame)
- : Clipboard(policy, forDragging)
- , m_pasteboard(pasteboard)
- , m_frame(frame)
-{
- m_changeCount = [m_pasteboard.get() changeCount];
-}
-
-ClipboardMac::~ClipboardMac()
-{
-}
-
-bool ClipboardMac::hasData()
-{
- return m_pasteboard && [m_pasteboard.get() types] && [[m_pasteboard.get() types] count] > 0;
-}
-
-static NSString *cocoaTypeFromMIMEType(const String& type)
-{
- String qType = type.stripWhiteSpace();
-
- // two special cases for IE compatibility
- if (qType == "Text")
- return NSStringPboardType;
- if (qType == "URL")
- return NSURLPboardType;
-
- // Ignore any trailing charset - JS strings are Unicode, which encapsulates the charset issue
- if (qType == "text/plain" || qType.startsWith("text/plain;"))
- return NSStringPboardType;
- if (qType == "text/uri-list")
- // special case because UTI doesn't work with Cocoa's URL type
- return NSURLPboardType; // note special case in getData to read NSFilenamesType
-
- // Try UTI now
- NSString *mimeType = qType;
- CFStringRef UTIType = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, (CFStringRef)mimeType, NULL);
- if (UTIType) {
- CFStringRef pbType = UTTypeCopyPreferredTagWithClass(UTIType, kUTTagClassNSPboardType);
- CFRelease(UTIType);
- if (pbType)
- return HardAutorelease(pbType);
- }
-
- // No mapping, just pass the whole string though
- return qType;
-}
-
-static String MIMETypeFromCocoaType(NSString *type)
-{
- // UTI may not do these right, so make sure we get the right, predictable result
- if ([type isEqualToString:NSStringPboardType])
- return "text/plain";
- if ([type isEqualToString:NSURLPboardType] || [type isEqualToString:NSFilenamesPboardType])
- return "text/uri-list";
-
- // Now try the general UTI mechanism
- CFStringRef UTIType = UTTypeCreatePreferredIdentifierForTag(kUTTagClassNSPboardType, (CFStringRef)type, NULL);
- if (UTIType) {
- CFStringRef mimeType = UTTypeCopyPreferredTagWithClass(UTIType, kUTTagClassMIMEType);
- CFRelease(UTIType);
- if (mimeType) {
- String result = mimeType;
- CFRelease(mimeType);
- return result;
- }
- }
-
- // No mapping, just pass the whole string though
- return type;
-}
-
-void ClipboardMac::clearData(const String& type)
-{
- if (policy() != ClipboardWritable)
- return;
-
- // note NSPasteboard enforces changeCount itself on writing - can't write if not the owner
-
- NSString *cocoaType = cocoaTypeFromMIMEType(type);
- if (cocoaType) {
- [m_pasteboard.get() setString:@"" forType:cocoaType];
- }
-}
-
-void ClipboardMac::clearAllData()
-{
- if (policy() != ClipboardWritable)
- return;
-
- // note NSPasteboard enforces changeCount itself on writing - can't write if not the owner
-
- [m_pasteboard.get() declareTypes:[NSArray array] owner:nil];
-}
-
-String ClipboardMac::getData(const String& type, bool& success) const
-{
- success = false;
- if (policy() != ClipboardReadable)
- return String();
-
- NSString *cocoaType = cocoaTypeFromMIMEType(type);
- NSString *cocoaValue = nil;
- NSArray *availableTypes = [m_pasteboard.get() types];
-
- // Fetch the data in different ways for the different Cocoa types
-
- if ([cocoaType isEqualToString:NSURLPboardType]) {
- // When both URL and filenames are present, filenames is superior since it can contain a list.
- // must check this or we get a printf from CF when there's no data of this type
- if ([availableTypes containsObject:NSFilenamesPboardType]) {
- NSArray *fileList = [m_pasteboard.get() propertyListForType:NSFilenamesPboardType];
- if (fileList && [fileList isKindOfClass:[NSArray class]]) {
- unsigned count = [fileList count];
- if (count > 0) {
- if (type != "text/uri-list")
- count = 1;
- NSMutableString *urls = [NSMutableString string];
- unsigned i;
- for (i = 0; i < count; i++) {
- if (i > 0) {
- [urls appendString:@"\n"];
- }
- NSString *string = [fileList objectAtIndex:i];
- if (![string isKindOfClass:[NSString class]])
- break;
- NSURL *url = [NSURL fileURLWithPath:string];
- [urls appendString:[url absoluteString]];
- }
- if (i == count)
- cocoaValue = urls;
- }
- }
- }
- if (!cocoaValue) {
- // must check this or we get a printf from CF when there's no data of this type
- if ([availableTypes containsObject:NSURLPboardType]) {
- NSURL *url = [NSURL URLFromPasteboard:m_pasteboard.get()];
- if (url) {
- cocoaValue = [url absoluteString];
- }
- }
- }
- } else if (cocoaType) {
- cocoaValue = [m_pasteboard.get() stringForType:cocoaType];
- }
-
- // Enforce changeCount ourselves for security. We check after reading instead of before to be
- // sure it doesn't change between our testing the change count and accessing the data.
- if (cocoaValue && m_changeCount == [m_pasteboard.get() changeCount]) {
- success = true;
- return cocoaValue;
- }
-
- return String();
-}
-
-bool ClipboardMac::setData(const String &type, const String &data)
-{
- if (policy() != ClipboardWritable)
- return false;
- // note NSPasteboard enforces changeCount itself on writing - can't write if not the owner
-
- NSString *cocoaType = cocoaTypeFromMIMEType(type);
- NSString *cocoaData = data;
-
- if ([cocoaType isEqualToString:NSURLPboardType]) {
- [m_pasteboard.get() addTypes:[NSArray arrayWithObject:NSURLPboardType] owner:nil];
- NSURL *url = [[NSURL alloc] initWithString:cocoaData];
- [url writeToPasteboard:m_pasteboard.get()];
-
- if ([url isFileURL]) {
- [m_pasteboard.get() addTypes:[NSArray arrayWithObject:NSFilenamesPboardType] owner:nil];
- NSArray *fileList = [NSArray arrayWithObject:[url path]];
- [m_pasteboard.get() setPropertyList:fileList forType:NSFilenamesPboardType];
- }
-
- [url release];
- return true;
- }
-
- if (cocoaType) {
- // everything else we know of goes on the pboard as a string
- [m_pasteboard.get() addTypes:[NSArray arrayWithObject:cocoaType] owner:nil];
- return [m_pasteboard.get() setString:cocoaData forType:cocoaType];
- }
-
- return false;
-}
-
-HashSet<String> ClipboardMac::types() const
-{
- if (policy() != ClipboardReadable && policy() != ClipboardTypesReadable)
- return HashSet<String>();
-
- NSArray *types = [m_pasteboard.get() types];
-
- // Enforce changeCount ourselves for security. We check after reading instead of before to be
- // sure it doesn't change between our testing the change count and accessing the data.
- if (m_changeCount != [m_pasteboard.get() changeCount])
- return HashSet<String>();
-
- HashSet<String> result;
- if (types) {
- unsigned count = [types count];
- unsigned i;
- for (i = 0; i < count; i++) {
- NSString *pbType = [types objectAtIndex:i];
- if ([pbType isEqualToString:@"NeXT plain ascii pasteboard type"])
- continue; // skip this ancient type that gets auto-supplied by some system conversion
-
- String str = MIMETypeFromCocoaType(pbType);
- if (!result.contains(str))
- result.add(str);
- }
- }
- return result;
-}
-
-// The rest of these getters don't really have any impact on security, so for now make no checks
-
-void ClipboardMac::setDragImage(CachedImage* img, const IntPoint &loc)
-{
- setDragImage(img, 0, loc);
-}
-
-void ClipboardMac::setDragImageElement(Node *node, const IntPoint &loc)
-{
- setDragImage(0, node, loc);
-}
-
-void ClipboardMac::setDragImage(CachedImage* image, Node *node, const IntPoint &loc)
-{
- if (policy() == ClipboardImageWritable || policy() == ClipboardWritable) {
- if (m_dragImage)
- m_dragImage->removeClient(this);
- m_dragImage = image;
- if (m_dragImage)
- m_dragImage->addClient(this);
-
- m_dragLoc = loc;
- m_dragImageElement = node;
-
- if (dragStarted() && m_changeCount == [m_pasteboard.get() changeCount]) {
- NSPoint cocoaLoc;
- NSImage* cocoaImage = dragNSImage(cocoaLoc);
- if (cocoaImage) {
- // Dashboard wants to be able to set the drag image during dragging, but Cocoa does not allow this.
- // Instead we must drop down to the CoreGraphics API.
- wkSetDragImage(cocoaImage, cocoaLoc);
-
- // Hack: We must post an event to wake up the NSDragManager, which is sitting in a nextEvent call
- // up the stack from us because the CoreFoundation drag manager does not use the run loop by itself.
- // This is the most innocuous event to use, per Kristen Forster.
- NSEvent* ev = [NSEvent mouseEventWithType:NSMouseMoved location:NSZeroPoint
- modifierFlags:0 timestamp:0 windowNumber:0 context:nil eventNumber:0 clickCount:0 pressure:0];
- [NSApp postEvent:ev atStart:YES];
- }
- }
- // Else either 1) we haven't started dragging yet, so we rely on the part to install this drag image
- // as part of getting the drag kicked off, or 2) Someone kept a ref to the clipboard and is trying to
- // set the image way too late.
- }
-}
-
-void ClipboardMac::writeRange(Range* range, Frame* frame)
-{
- ASSERT(range);
- ASSERT(frame);
- Pasteboard::writeSelection(m_pasteboard.get(), range, frame->editor()->smartInsertDeleteEnabled() && frame->selectionGranularity() == WordGranularity, frame);
-}
-
-void ClipboardMac::writeURL(const KURL& url, const String& title, Frame* frame)
-{
- ASSERT(frame);
- ASSERT(m_pasteboard);
- Pasteboard::writeURL(m_pasteboard.get(), nil, url, title, frame);
-}
-
-void ClipboardMac::declareAndWriteDragImage(Element* element, const KURL& url, const String& title, Frame* frame)
-{
- ASSERT(frame);
- if (Page* page = frame->page())
- page->dragController()->client()->declareAndWriteDragImage(m_pasteboard.get(), [DOMElement _wrapElement:element], url, title, frame);
-}
-
-DragImageRef ClipboardMac::createDragImage(IntPoint& loc) const
-{
- NSPoint nsloc = {loc.x(), loc.y()};
- DragImageRef result = dragNSImage(nsloc);
- loc = (IntPoint)nsloc;
- return result;
-}
-
-NSImage *ClipboardMac::dragNSImage(NSPoint& loc) const
-{
- NSImage *result = nil;
- if (m_dragImageElement) {
- if (m_frame) {
- NSRect imageRect;
- NSRect elementRect;
- result = m_frame->snapshotDragImage(m_dragImageElement.get(), &imageRect, &elementRect);
- // Client specifies point relative to element, not the whole image, which may include child
- // layers spread out all over the place.
- loc.x = elementRect.origin.x - imageRect.origin.x + m_dragLoc.x();
- loc.y = elementRect.origin.y - imageRect.origin.y + m_dragLoc.y();
- loc.y = imageRect.size.height - loc.y;
- }
- } else if (m_dragImage) {
- result = m_dragImage->image()->getNSImage();
-
- loc = m_dragLoc;
- loc.y = [result size].height - loc.y;
- }
- return result;
-}
-
-}