[iOS WK2] DataTransfer DataInteractionTests debug assert under -_preLoadedDataConform...
authorwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 28 Sep 2017 14:47:59 +0000 (14:47 +0000)
committerwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 28 Sep 2017 14:47:59 +0000 (14:47 +0000)
https://bugs.webkit.org/show_bug.cgi?id=177594

Reviewed by Tim Horton.

Currently, some API tests added in r222595 currently hit debug assertions under -preloadedDataConformingToType:
forItemProviderAtIndex:. This is because the page may call DataTransfer.types, which now calls into
PlatformPasteboard::typesSafeForDOMToReadAndWrite(). This calls on the AbstractPasteboard (either the
UIPasteboard or WebItemProviderPasteboard, in the case of drag and drop) to fetch the custom WebKit pasteboard
data blob, if it exists. For WebItemProviderPasteboard, this ends up calling into -[WebItemProviderPasteboard
_preLoadedDataConformingToType:forItemProviderAtIndex:], which was previously only called after loading data off
of the item providers. There's an existing sanity check in this preloaded data helper to make sure that the
number of load results is equal to the number of item providers loaded from, but this sanity check only makes
sense *after* the drop has happened, not before, since we should only attempt to read dropped data after any
data at all has been dropped.

We need to check whether or not this custom data blob exists in PlatformPasteboard::typesSafeForDOMToReadAndWrite
to fetch the list of DOM-exposed types to propagate back to the page. So to fix this, we make the helper methods
for fetching dropped data (-dataForPasteboardType:inItemSet: and -valuesForPasteboardType:inItemSet:) fail
gracefully when invoked prior to drop, when PlatformPasteboard::typesSafeForDOMToReadAndWrite is invoked.

No new tests; fixes iOS drag and drop API tests that currently hit this debug assertion.

* platform/ios/WebItemProviderPasteboard.mm:
(-[WebItemProviderPasteboard dataForPasteboardType:inItemSet:]):
(-[WebItemProviderPasteboard valuesForPasteboardType:inItemSet:]):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@222608 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/ios/WebItemProviderPasteboard.mm

index 2c514af2cca9acd59ca5337952e74673719b95b9..4711eba769406f93a3dd48a079beba9d71a5a373 100644 (file)
@@ -1,3 +1,32 @@
+2017-09-28  Wenson Hsieh  <wenson_hsieh@apple.com>
+
+        [iOS WK2] DataTransfer DataInteractionTests debug assert under -_preLoadedDataConformingToType:forItemProviderAtIndex:
+        https://bugs.webkit.org/show_bug.cgi?id=177594
+
+        Reviewed by Tim Horton.
+
+        Currently, some API tests added in r222595 currently hit debug assertions under -preloadedDataConformingToType:
+        forItemProviderAtIndex:. This is because the page may call DataTransfer.types, which now calls into
+        PlatformPasteboard::typesSafeForDOMToReadAndWrite(). This calls on the AbstractPasteboard (either the
+        UIPasteboard or WebItemProviderPasteboard, in the case of drag and drop) to fetch the custom WebKit pasteboard
+        data blob, if it exists. For WebItemProviderPasteboard, this ends up calling into -[WebItemProviderPasteboard
+        _preLoadedDataConformingToType:forItemProviderAtIndex:], which was previously only called after loading data off
+        of the item providers. There's an existing sanity check in this preloaded data helper to make sure that the
+        number of load results is equal to the number of item providers loaded from, but this sanity check only makes
+        sense *after* the drop has happened, not before, since we should only attempt to read dropped data after any
+        data at all has been dropped.
+
+        We need to check whether or not this custom data blob exists in PlatformPasteboard::typesSafeForDOMToReadAndWrite
+        to fetch the list of DOM-exposed types to propagate back to the page. So to fix this, we make the helper methods
+        for fetching dropped data (-dataForPasteboardType:inItemSet: and -valuesForPasteboardType:inItemSet:) fail
+        gracefully when invoked prior to drop, when PlatformPasteboard::typesSafeForDOMToReadAndWrite is invoked.
+
+        No new tests; fixes iOS drag and drop API tests that currently hit this debug assertion.
+
+        * platform/ios/WebItemProviderPasteboard.mm:
+        (-[WebItemProviderPasteboard dataForPasteboardType:inItemSet:]):
+        (-[WebItemProviderPasteboard valuesForPasteboardType:inItemSet:]):
+
 2017-09-28  Ryosuke Niwa  <rniwa@webkit.org>
 
         REGRESSION(r222595): Assertion failure in _preLoadedDataConformingToType
index 9ff1dacdef385ed7f3dbcf71cb424207feceeac8..b8796c6b2559cdc70eb50b24506ce9be0f95abf1 100644 (file)
@@ -393,6 +393,9 @@ static UIPreferredPresentationStyle uiPreferredPresentationStyle(WebPreferredPre
 
 - (NSArray *)dataForPasteboardType:(NSString *)pasteboardType inItemSet:(NSIndexSet *)itemSet
 {
+    if (_loadResults.isEmpty())
+        return @[ ];
+
     auto values = adoptNS([[NSMutableArray alloc] init]);
     RetainPtr<WebItemProviderPasteboard> retainedSelf = self;
     [itemSet enumerateIndexesUsingBlock:[retainedSelf, pasteboardType, values] (NSUInteger index, BOOL *) {
@@ -434,6 +437,9 @@ static Class classForTypeIdentifier(NSString *typeIdentifier, NSString *&outType
 
 - (NSArray *)valuesForPasteboardType:(NSString *)pasteboardType inItemSet:(NSIndexSet *)itemSet
 {
+    if (_loadResults.isEmpty())
+        return @[ ];
+
     auto values = adoptNS([[NSMutableArray alloc] init]);
     RetainPtr<WebItemProviderPasteboard> retainedSelf = self;
     [itemSet enumerateIndexesUsingBlock:[retainedSelf, pasteboardType, values] (NSUInteger index, BOOL *) {