Title: [213529] trunk/Tools
Revision
213529
Author
ander...@apple.com
Date
2017-03-07 11:27:51 -0800 (Tue, 07 Mar 2017)

Log Message

Rewrite the DRT Pasteboard implementation to use UTIs and WTF types
https://bugs.webkit.org/show_bug.cgi?id=169289

Reviewed by Tim Horton.

* DumpRenderTree/mac/DumpRenderTreePasteboard.mm:
(-[LocalPasteboard initWithName:]):
(-[LocalPasteboard name]):
(-[LocalPasteboard declareTypes:owner:]):
(isUTI):
(toUTI):
(-[LocalPasteboard addTypes:owner:]):
(-[LocalPasteboard changeCount]):
(-[LocalPasteboard types]):
(-[LocalPasteboard availableTypeFromArray:]):
(-[LocalPasteboard setData:forType:]):
(-[LocalPasteboard dataForType:]):
(-[LocalPasteboard writeObjects:]):
(-[LocalPasteboard dealloc]): Deleted.

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (213528 => 213529)


--- trunk/Tools/ChangeLog	2017-03-07 19:26:21 UTC (rev 213528)
+++ trunk/Tools/ChangeLog	2017-03-07 19:27:51 UTC (rev 213529)
@@ -1,3 +1,25 @@
+2017-03-07  Anders Carlsson  <ander...@apple.com>
+
+        Rewrite the DRT Pasteboard implementation to use UTIs and WTF types
+        https://bugs.webkit.org/show_bug.cgi?id=169289
+
+        Reviewed by Tim Horton.
+
+        * DumpRenderTree/mac/DumpRenderTreePasteboard.mm:
+        (-[LocalPasteboard initWithName:]):
+        (-[LocalPasteboard name]):
+        (-[LocalPasteboard declareTypes:owner:]):
+        (isUTI):
+        (toUTI):
+        (-[LocalPasteboard addTypes:owner:]):
+        (-[LocalPasteboard changeCount]):
+        (-[LocalPasteboard types]):
+        (-[LocalPasteboard availableTypeFromArray:]):
+        (-[LocalPasteboard setData:forType:]):
+        (-[LocalPasteboard dataForType:]):
+        (-[LocalPasteboard writeObjects:]):
+        (-[LocalPasteboard dealloc]): Deleted.
+
 2017-03-07  Myles C. Maxfield  <mmaxfi...@apple.com>
 
         Add David Jonathan Ross to contributors.json

Modified: trunk/Tools/DumpRenderTree/mac/DumpRenderTreePasteboard.mm (213528 => 213529)


--- trunk/Tools/DumpRenderTree/mac/DumpRenderTreePasteboard.mm	2017-03-07 19:26:21 UTC (rev 213528)
+++ trunk/Tools/DumpRenderTree/mac/DumpRenderTreePasteboard.mm	2017-03-07 19:27:51 UTC (rev 213529)
@@ -37,14 +37,16 @@
 
 #import <WebKit/WebTypesInternal.h>
 #import <wtf/Assertions.h>
+#import <wtf/HashMap.h>
+#import <wtf/ListHashSet.h>
 #import <wtf/RetainPtr.h>
 
 @interface LocalPasteboard : NSPasteboard {
-    NSMutableArray *typesArray;
-    NSMutableSet *typesSet;
-    NSMutableDictionary *dataByType;
-    NSInteger changeCount;
-    NSString *pasteboardName;
+    RetainPtr<NSString> _pasteboardName;
+    NSInteger _changeCount;
+
+    ListHashSet<RetainPtr<NSString>, WTF::RetainPtrObjectHash<NSString>> _types;
+    HashMap<RetainPtr<NSString>, RetainPtr<NSData>, WTF::RetainPtrObjectHash<NSString>, WTF::RetainPtrObjectHashTraits<NSString>> _data;
 }
 
 -(id)initWithName:(NSString *)name;
@@ -98,25 +100,15 @@
     self = [super init];
     if (!self)
         return nil;
-    typesArray = [[NSMutableArray alloc] init];
-    typesSet = [[NSMutableSet alloc] init];
-    dataByType = [[NSMutableDictionary alloc] init];
-    pasteboardName = [name copy];
+
+    _pasteboardName = adoptNS([name copy]);
+
     return self;
 }
 
-- (void)dealloc
-{
-    [typesArray release];
-    [typesSet release];
-    [dataByType release];
-    [pasteboardName release];
-    [super dealloc];
-}
-
 - (NSString *)name
 {
-    return pasteboardName;
+    return _pasteboardName.get();
 }
 
 - (void)releaseGlobally
@@ -125,68 +117,84 @@
 
 - (NSInteger)declareTypes:(NSArray *)newTypes owner:(id)newOwner
 {
-    [typesArray removeAllObjects];
-    [typesSet removeAllObjects];
-    [dataByType removeAllObjects];
+    _types.clear();
+    _data.clear();
+
     return [self addTypes:newTypes owner:newOwner];
 }
 
+static bool isUTI(NSString *type)
+{
+    return UTTypeIsDynamic((__bridge CFStringRef)type) || UTTypeIsDeclared((__bridge CFStringRef)type);
+}
+
+static RetainPtr<NSString> toUTI(NSString *type)
+{
+    if (isUTI(type)) {
+        // This is already an UTI.
+        return adoptNS([type copy]);
+    }
+
+    return adoptNS((__bridge NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassNSPboardType, (__bridge CFStringRef)type, nullptr));
+}
+
 - (NSInteger)addTypes:(NSArray *)newTypes owner:(id)newOwner
 {
-    unsigned count = [newTypes count];
-    unsigned i;
-    for (i = 0; i < count; ++i) {
-        NSString *type = [newTypes objectAtIndex:i];
-        NSString *setType = [typesSet member:type];
-        if (!setType) {
-            setType = [type copy];
-            [typesArray addObject:setType];
-            [typesSet addObject:setType];
-            [setType release];
-        }
+    for (NSString *type in newTypes) {
+        _types.add(toUTI(type));
+
         if (newOwner && [newOwner respondsToSelector:@selector(pasteboard:provideDataForType:)])
-            [newOwner pasteboard:self provideDataForType:setType];
+            [newOwner pasteboard:self provideDataForType:type];
     }
-    return ++changeCount;
+
+    return ++_changeCount;
 }
 
 - (NSInteger)changeCount
 {
-    return changeCount;
+    return _changeCount;
 }
 
 - (NSArray *)types
 {
-    return typesArray;
+    auto types = adoptNS([[NSMutableArray alloc] init]);
+
+    for (const auto& type : _types) {
+        [types addObject:type.get()];
+
+        // Include the pasteboard type as well.
+        if (auto pasteboardType = adoptNS((__bridge NSString *)UTTypeCopyPreferredTagWithClass((CFStringRef)type.get(), kUTTagClassNSPboardType)))
+            [types addObject:pasteboardType.get()];
+    }
+
+    return types.autorelease();
 }
 
 - (NSString *)availableTypeFromArray:(NSArray *)types
 {
-    unsigned count = [types count];
-    unsigned i;
-    for (i = 0; i < count; ++i) {
-        NSString *type = [types objectAtIndex:i];
-        NSString *setType = [typesSet member:type];
-        if (setType)
-            return setType;
+    for (NSString *type in types) {
+        if (_types.contains(type))
+            return type;
     }
+
     return nil;
 }
 
 - (BOOL)setData:(NSData *)data forType:(NSString *)dataType
 {
-    if (data == nil)
-        data = "" data];
-    if (![typesSet containsObject:dataType])
+    auto uti = toUTI(dataType);
+
+    if (!_types.contains(uti))
         return NO;
-    [dataByType setObject:data forKey:dataType];
-    ++changeCount;
+
+    _data.set(WTFMove(uti), data ? data : [NSData data]);
+    ++_changeCount;
     return YES;
 }
 
 - (NSData *)dataForType:(NSString *)dataType
 {
-    return [dataByType objectForKey:dataType];
+    return _data.get(toUTI(dataType)).get();
 }
 
 - (BOOL)setPropertyList:(id)propertyList forType:(NSString *)dataType
@@ -219,18 +227,13 @@
 {
     for (id <NSPasteboardWriting> object in objects) {
         for (NSString *type in [object writableTypesForPasteboard:self]) {
-            auto pasteboardType = ^{
-                if (UTTypeIsDynamic((__bridge CFStringRef)type))
-                    return adoptNS((__bridge NSString *)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)type, kUTTagClassNSPboardType));
+            ASSERT(UTTypeIsDeclared((__bridge CFStringRef)type) || UTTypeIsDynamic((__bridge CFStringRef)type));
 
-                return retainPtr(type);
-            }();
+            [self addTypes:@[ type ] owner:self];
 
-            [self addTypes:@[ pasteboardType.get() ] owner:self];
-
             id propertyList = [object pasteboardPropertyListForType:type];
             if ([propertyList isKindOfClass:NSData.class])
-                [self setData:propertyList forType:pasteboardType.get()];
+                [self setData:propertyList forType:type];
             else
                 ASSERT_NOT_REACHED();
         }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to