Changeset 47852 in webkit


Ignore:
Timestamp:
Aug 27, 2009 6:38:08 PM (15 years ago)
Author:
eric@webkit.org
Message:

2009-08-27 Noel Gordon <noel.gordon@gmail.com>

Reviewed by Eric Seidel.

dataTransfer.types() should include type "Files" when files are present in the clipboard.
https://bugs.webkit.org/show_bug.cgi?id=28780

Add dataTransfer type "Files" to the chromium port. Add eseidel's
patch for same for the mac port.

  • platform/chromium/ClipboardChromium.cpp:

2009-08-27 Noel Gordon <noel.gordon@gmail.com>

Reviewed by Eric Seidel.

dataTransfer.types() should include type "Files" when files are present in the clipboard.
https://bugs.webkit.org/show_bug.cgi?id=28780

Test dataTransfer.types "Files" access for all ports.

  • http/tests/security/clipboard/clipboard-file-access-expected.txt:
  • http/tests/security/clipboard/resources/clipboard-file-access.js:
Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r47850 r47852  
     12009-08-27  Noel Gordon  <noel.gordon@gmail.com>
     2
     3        Reviewed by Eric Seidel.
     4
     5        dataTransfer.types() should include type "Files" when files are present in the clipboard.
     6        https://bugs.webkit.org/show_bug.cgi?id=28780
     7
     8        Test dataTransfer.types "Files" access for all ports.
     9
     10        * http/tests/security/clipboard/clipboard-file-access-expected.txt:
     11        * http/tests/security/clipboard/resources/clipboard-file-access.js:
     12
    1132009-08-27  Oliver Hunt  <oliver@apple.com>
    214
  • trunk/LayoutTests/http/tests/security/clipboard/clipboard-file-access-expected.txt

    r47832 r47852  
    1 Tests access to event.dataTransfer.files
     1Tests access to event.dataTransfer.files and .types
    22
    33On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
     
    66Dragging no files should return an empty file list (arbitrary implementation detail):
    77On dragenter:
     8PASS event.dataTransfer.types contains Files.
    89PASS event.dataTransfer.files.length is 0
    910On dragover:
     11PASS event.dataTransfer.types contains Files.
    1012PASS event.dataTransfer.files.length is 0
    1113On drop:
     14PASS event.dataTransfer.types contains Files.
    1215PASS event.dataTransfer.files.length is 0
    1316Drag drop a single (non-existant) file onto an element:
    1417On dragenter:
     18PASS event.dataTransfer.types contains Files.
    1519PASS event.dataTransfer.files.length is 0
    1620On dragover:
     21PASS event.dataTransfer.types contains Files.
    1722PASS event.dataTransfer.files.length is 0
    1823On dragover:
     24PASS event.dataTransfer.types contains Files.
    1925PASS event.dataTransfer.files.length is 0
    2026On drop:
     27PASS event.dataTransfer.types contains Files.
    2128PASS event.dataTransfer.files.length is 1
    2229PASS event.dataTransfer.files[0].fileName is "DRTFakeFile"
     
    2532Drag files over an element, leave that element and release the mouse:
    2633On dragenter:
     34PASS event.dataTransfer.types contains Files.
    2735PASS event.dataTransfer.files.length is 0
    2836On dragover:
     37PASS event.dataTransfer.types contains Files.
    2938PASS event.dataTransfer.files.length is 0
    3039On dragleave:
     40PASS event.dataTransfer.types contains Files.
    3141PASS event.dataTransfer.files.length is 0
    3242Drag drop a real file onto an element:
    3343On dragenter:
     44PASS event.dataTransfer.types contains Files.
    3445PASS event.dataTransfer.files.length is 0
    3546On dragover:
     47PASS event.dataTransfer.types contains Files.
    3648PASS event.dataTransfer.files.length is 0
    3749On drop:
     50PASS event.dataTransfer.types contains Files.
    3851PASS event.dataTransfer.files.length is 1
    3952PASS event.dataTransfer.files[0].fileName is "apple.gif"
     
    4154Drag drop two files onto an element:
    4255On dragenter:
     56PASS event.dataTransfer.types contains Files.
    4357PASS event.dataTransfer.files.length is 0
    4458On dragover:
     59PASS event.dataTransfer.types contains Files.
    4560PASS event.dataTransfer.files.length is 0
    4661On dragover:
     62PASS event.dataTransfer.types contains Files.
    4763PASS event.dataTransfer.files.length is 0
    4864On drop:
     65PASS event.dataTransfer.types contains Files.
    4966PASS event.dataTransfer.files.length is 2
    5067PASS event.dataTransfer.files[0].fileName is "apple.gif"
     
    5471Drag drop two files in reverse alphabetical order onto an element:
    5572On dragenter:
     73PASS event.dataTransfer.types contains Files.
    5674PASS event.dataTransfer.files.length is 0
    5775On dragover:
     76PASS event.dataTransfer.types contains Files.
    5877PASS event.dataTransfer.files.length is 0
    5978On dragover:
     79PASS event.dataTransfer.types contains Files.
    6080PASS event.dataTransfer.files.length is 0
    6181On drop:
     82PASS event.dataTransfer.types contains Files.
    6283PASS event.dataTransfer.files.length is 2
    6384PASS event.dataTransfer.files[0].fileName is "mozilla.gif"
     
    6889Drag drop a directory onto an element:
    6990On dragenter:
     91PASS event.dataTransfer.types contains Files.
    7092PASS event.dataTransfer.files.length is 0
    7193On dragover:
     94PASS event.dataTransfer.types contains Files.
    7295PASS event.dataTransfer.files.length is 0
    7396On dragover:
     97PASS event.dataTransfer.types contains Files.
    7498PASS event.dataTransfer.files.length is 0
    7599On drop:
     100PASS event.dataTransfer.types contains Files.
    76101FAIL event.dataTransfer.files.length should be 0. Was 1.
    77102Drag drop a file and a directory onto an element:
    78103On dragenter:
     104PASS event.dataTransfer.types contains Files.
    79105PASS event.dataTransfer.files.length is 0
    80106On dragover:
     107PASS event.dataTransfer.types contains Files.
    81108PASS event.dataTransfer.files.length is 0
    82109On dragover:
     110PASS event.dataTransfer.types contains Files.
    83111PASS event.dataTransfer.files.length is 0
    84112On drop:
     113PASS event.dataTransfer.types contains Files.
    85114FAIL event.dataTransfer.files.length should be 0. Was 2.
    86115Drag drop a directory and a file onto an element:
    87116On dragenter:
     117PASS event.dataTransfer.types contains Files.
    88118PASS event.dataTransfer.files.length is 0
    89119On dragover:
     120PASS event.dataTransfer.types contains Files.
    90121PASS event.dataTransfer.files.length is 0
    91122On dragover:
     123PASS event.dataTransfer.types contains Files.
    92124PASS event.dataTransfer.files.length is 0
    93125On drop:
     126PASS event.dataTransfer.types contains Files.
    94127FAIL event.dataTransfer.files.length should be 0. Was 2.
    95128PASS successfullyParsed is true
  • trunk/LayoutTests/http/tests/security/clipboard/resources/clipboard-file-access.js

    r47832 r47852  
    1 description("Tests access to event.dataTransfer.files");
     1description("Tests access to event.dataTransfer.files and .types");
    22
    33var dragTarget = document.createElement("div");
     
    1212    debug("On dragenter:")
    1313    event.dataTransfer.dropEffect = "copy";
     14    eventShouldContainTransferType(event, "Files");
    1415    fileListShouldBe("event.dataTransfer.files", []);
    1516    event.preventDefault();
     
    1920    debug("On dragover:")
    2021    event.dataTransfer.dropEffect = "copy";
     22    eventShouldContainTransferType(event, "Files");
    2123    fileListShouldBe("event.dataTransfer.files", []);
    2224    event.preventDefault();
     
    2527dragTarget.addEventListener("dragleave", function() {
    2628    debug("On dragleave:")
     29    eventShouldContainTransferType(event, "Files");
    2730    fileListShouldBe("event.dataTransfer.files", []);
    2831}, false);
     
    3134dragTarget.addEventListener("drop", function() {
    3235    debug("On drop:")
     36    eventShouldContainTransferType(event, "Files");
    3337    fileListShouldBe("event.dataTransfer.files", expectedFilesOnDrop);
    3438    event.preventDefault();
     
    5155    moveMouseToCenterOfElement(dragTarget);
    5256    if (leave && leave === true)
    53       moveMouseToOutsideOfElement(dragTarget);
     57        moveMouseToOutsideOfElement(dragTarget);
    5458    eventSender.mouseUp();
     59}
     60
     61function eventShouldContainTransferType(event, typeString)
     62{
     63   if (event.dataTransfer.types.indexOf(typeString) == -1)
     64       testFailed("event.dataTransfer.types " + typeString + " expected.");
     65   else
     66       testPassed("event.dataTransfer.types contains " + typeString + ".");
    5567}
    5668
  • trunk/WebCore/ChangeLog

    r47851 r47852  
     12009-08-27  Noel Gordon  <noel.gordon@gmail.com>
     2
     3        Reviewed by Eric Seidel.
     4
     5        dataTransfer.types() should include type "Files" when files are present in the clipboard.
     6        https://bugs.webkit.org/show_bug.cgi?id=28780
     7
     8        Add dataTransfer type "Files" to the chromium port.  Add eseidel's
     9        patch for same for the mac port.
     10
     11        * platform/chromium/ClipboardChromium.cpp:
     12
    1132009-08-27  Chris Marrin  <cmarrin@apple.com>
    214
  • trunk/WebCore/platform/chromium/ClipboardChromium.cpp

    r47833 r47852  
    166166        return results;
    167167
     168    if (!m_dataObject->filenames.isEmpty())
     169        results.add("Files");
     170
    168171    if (m_dataObject->url.isValid()) {
    169172        results.add("URL");
  • trunk/WebCore/platform/mac/ClipboardMac.mm

    r47829 r47852  
    6464}
    6565   
    66 static NSString *cocoaTypeFromMIMEType(const String& type)
     66static NSString *cocoaTypeFromHTMLClipboardType(const String& type)
    6767{
    6868    String qType = type.stripWhiteSpace();
     
    9494}
    9595
    96 static String MIMETypeFromCocoaType(NSString *type)
    97 {
    98     // UTI may not do these right, so make sure we get the right, predictable result
    99     if ([type isEqualToString:NSStringPboardType])
    100         return "text/plain";
    101     if ([type isEqualToString:NSURLPboardType] || [type isEqualToString:NSFilenamesPboardType])
    102         return "text/uri-list";
    103    
    104     // Now try the general UTI mechanism
     96static String utiTypeFromCocoaType(NSString *type)
     97{
    10598    RetainPtr<CFStringRef> utiType(AdoptCF, UTTypeCreatePreferredIdentifierForTag(kUTTagClassNSPboardType, (CFStringRef)type, NULL));
    10699    if (utiType) {
     
    109102            return String(mimeType.get());
    110103    }
    111 
    112     // No mapping, just pass the whole string though
    113     return type;
     104    return String();
     105}
     106
     107static void addHTMLClipboardTypesForCocoaType(HashSet<String>& resultTypes, NSString *cocoaType)
     108{
     109    // UTI may not do these right, so make sure we get the right, predictable result
     110    if ([cocoaType isEqualToString:NSStringPboardType])
     111        resultTypes.add("text/plain");
     112    else if ([cocoaType isEqualToString:NSURLPboardType])
     113        resultTypes.add("text/uri-list");
     114    else if ([cocoaType isEqualToString:NSFilenamesPboardType]) {
     115        // It is unknown if NSFilenamesPboardType always implies NSURLPboardType in Cocoa,
     116        // but NSFilenamesPboardType should imply both 'text/uri-list' and 'Files'
     117        resultTypes.add("text/uri-list");
     118        resultTypes.add("Files");
     119    } else if (String utiType = utiTypeFromCocoaType(cocoaType))
     120        resultTypes.add(utiType);
     121    else {
     122        // No mapping, just pass the whole string though
     123        resultTypes.add(cocoaType);
     124    }
    114125}
    115126
     
    121132    // note NSPasteboard enforces changeCount itself on writing - can't write if not the owner
    122133
    123     NSString *cocoaType = cocoaTypeFromMIMEType(type);
     134    NSString *cocoaType = cocoaTypeFromHTMLClipboardType(type);
    124135    if (cocoaType)
    125136        [m_pasteboard.get() setString:@"" forType:cocoaType];
     
    188199        return String();
    189200
    190     NSString *cocoaType = cocoaTypeFromMIMEType(type);
     201    NSString *cocoaType = cocoaTypeFromHTMLClipboardType(type);
    191202    NSString *cocoaValue = nil;
    192203
    193204    // Grab the value off the pasteboard corresponding to the cocoaType
    194205    if ([cocoaType isEqualToString:NSURLPboardType]) {
    195         // "URL" and "text/url-list" both map to NSURLPboardType in cocoaTypeFromMIMEType(), "URL" only wants the first URL
     206        // "URL" and "text/url-list" both map to NSURLPboardType in cocoaTypeFromHTMLClipboardType(), "URL" only wants the first URL
    196207        bool onlyFirstURL = (type == "URL");
    197208        NSArray *absoluteURLs = absoluteURLsFromPasteboard(m_pasteboard.get(), onlyFirstURL);
     
    218229    // note NSPasteboard enforces changeCount itself on writing - can't write if not the owner
    219230
    220     NSString *cocoaType = cocoaTypeFromMIMEType(type);
     231    NSString *cocoaType = cocoaTypeFromHTMLClipboardType(type);
    221232    NSString *cocoaData = data;
    222233
     
    259270    HashSet<String> result;
    260271    NSUInteger count = [types count];
     272    // FIXME: This loop could be split into two stages. One which adds all the HTML5 specified types
     273    // and a second which adds all the extra types from the cocoa clipboard (which is Mac-only behavior).
    261274    for (NSUInteger i = 0; i < count; i++) {
    262275        NSString *pbType = [types objectAtIndex:i];
     
    264277            continue;   // skip this ancient type that gets auto-supplied by some system conversion
    265278
    266         String str = MIMETypeFromCocoaType(pbType);
    267         if (!result.contains(str))
    268             result.add(str);
    269     }
     279        addHTMLClipboardTypesForCocoaType(result, pbType);
     280    }
     281
    270282    return result;
    271283}
Note: See TracChangeset for help on using the changeset viewer.