Title: [228360] branches/safari-605-branch
Revision
228360
Author
jmarc...@apple.com
Date
2018-02-09 21:43:58 -0800 (Fri, 09 Feb 2018)

Log Message

Cherry-pick r228340. rdar://problem/37408869

Modified Paths

Added Paths

Diff

Modified: branches/safari-605-branch/LayoutTests/ChangeLog (228359 => 228360)


--- branches/safari-605-branch/LayoutTests/ChangeLog	2018-02-10 05:43:52 UTC (rev 228359)
+++ branches/safari-605-branch/LayoutTests/ChangeLog	2018-02-10 05:43:58 UTC (rev 228360)
@@ -1,5 +1,33 @@
 2018-02-09  Jason Marcell  <jmarc...@apple.com>
 
+        Cherry-pick r228340. rdar://problem/37408869
+
+    2018-02-08  Wenson Hsieh  <wenson_hs...@apple.com>
+
+            Pasting from Excel no longer provides text/html data
+            https://bugs.webkit.org/show_bug.cgi?id=182636
+            <rdar://problem/37087060>
+
+            Reviewed by Ryosuke Niwa.
+
+            Rebaseline some existing layout tests. We now expose "text/html" alongside "Files" on DataTransfer.types() in
+            some circumstances. This also provides some test coverage for ensuring that the paste codepath iOS allows the
+            page to request HTML, even if there are files on the pasteboard. See the WebCore ChangeLog for more detail.
+
+            * editing/pasteboard/data-transfer-item-list-add-file-multiple-times-expected.txt:
+            * editing/pasteboard/data-transfer-item-list-add-file-on-copy-expected.txt:
+            * editing/pasteboard/data-transfer-item-list-add-file-on-drag-expected.txt:
+
+            Adjust test expectations for the additional "text/html" type.
+
+            * editing/pasteboard/paste-image-does-not-reveal-file-url-expected.txt:
+            * editing/pasteboard/paste-image-does-not-reveal-file-url.html:
+
+            Instead of checking that types is [ "Files" ], just check that types contains "Files". On iOS, copying a
+            selected image does not also copy HTML, but on macOS it does; this covers both cases.
+
+2018-02-09  Jason Marcell  <jmarc...@apple.com>
+
         Cherry-pick r228331. rdar://problem/37408871
 
     2018-02-09  Andy Estes  <aes...@apple.com>

Modified: branches/safari-605-branch/LayoutTests/editing/pasteboard/data-transfer-item-list-add-file-multiple-times-expected.txt (228359 => 228360)


--- branches/safari-605-branch/LayoutTests/editing/pasteboard/data-transfer-item-list-add-file-multiple-times-expected.txt	2018-02-10 05:43:52 UTC (rev 228359)
+++ branches/safari-605-branch/LayoutTests/editing/pasteboard/data-transfer-item-list-add-file-multiple-times-expected.txt	2018-02-10 05:43:58 UTC (rev 228360)
@@ -247,7 +247,8 @@
 6. After adding two files and some string data again
 {
     "data": {
-        "Files": ""
+        "Files": "",
+        "text/html": "<strong>some styled text</strong>"
     },
     "items": [
         {
@@ -296,7 +297,8 @@
 7. After removing at index 2
 {
     "data": {
-        "Files": ""
+        "Files": "",
+        "text/html": "<strong>some styled text</strong>"
     },
     "items": [
         {
@@ -341,7 +343,8 @@
 8. After removing at index 2
 {
     "data": {
-        "Files": ""
+        "Files": "",
+        "text/html": "<strong>some styled text</strong>"
     },
     "items": [
         {

Modified: branches/safari-605-branch/LayoutTests/editing/pasteboard/data-transfer-item-list-add-file-on-copy-expected.txt (228359 => 228360)


--- branches/safari-605-branch/LayoutTests/editing/pasteboard/data-transfer-item-list-add-file-on-copy-expected.txt	2018-02-10 05:43:52 UTC (rev 228359)
+++ branches/safari-605-branch/LayoutTests/editing/pasteboard/data-transfer-item-list-add-file-on-copy-expected.txt	2018-02-10 05:43:58 UTC (rev 228360)
@@ -129,7 +129,8 @@
 5. After adding an HTML string
 {
     "data": {
-        "Files": ""
+        "Files": "",
+        "text/html": "<a>goodbye world</a>"
     },
     "items": [
         {
@@ -164,7 +165,8 @@
 6. After adding another plain text file
 {
     "data": {
-        "Files": ""
+        "Files": "",
+        "text/html": "<a>goodbye world</a>"
     },
     "items": [
         {
@@ -213,7 +215,8 @@
 7. After removing the custom file
 {
     "data": {
-        "Files": ""
+        "Files": "",
+        "text/html": "<a>goodbye world</a>"
     },
     "items": [
         {

Modified: branches/safari-605-branch/LayoutTests/editing/pasteboard/data-transfer-item-list-add-file-on-drag-expected.txt (228359 => 228360)


--- branches/safari-605-branch/LayoutTests/editing/pasteboard/data-transfer-item-list-add-file-on-drag-expected.txt	2018-02-10 05:43:52 UTC (rev 228359)
+++ branches/safari-605-branch/LayoutTests/editing/pasteboard/data-transfer-item-list-add-file-on-drag-expected.txt	2018-02-10 05:43:58 UTC (rev 228360)
@@ -129,7 +129,8 @@
 5. After adding an HTML string
 {
     "data": {
-        "Files": ""
+        "Files": "",
+        "text/html": "<a>goodbye world</a>"
     },
     "items": [
         {
@@ -164,7 +165,8 @@
 6. After adding another plain text file
 {
     "data": {
-        "Files": ""
+        "Files": "",
+        "text/html": "<a>goodbye world</a>"
     },
     "items": [
         {
@@ -213,7 +215,8 @@
 7. After removing the custom file
 {
     "data": {
-        "Files": ""
+        "Files": "",
+        "text/html": "<a>goodbye world</a>"
     },
     "items": [
         {

Modified: branches/safari-605-branch/LayoutTests/editing/pasteboard/paste-image-does-not-reveal-file-url-expected.txt (228359 => 228360)


--- branches/safari-605-branch/LayoutTests/editing/pasteboard/paste-image-does-not-reveal-file-url-expected.txt	2018-02-10 05:43:52 UTC (rev 228359)
+++ branches/safari-605-branch/LayoutTests/editing/pasteboard/paste-image-does-not-reveal-file-url-expected.txt	2018-02-10 05:43:58 UTC (rev 228360)
@@ -3,7 +3,7 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS JSON.stringify(event.clipboardData.types) is "[\"Files\"]"
+PASS event.clipboardData.types.includes("Files") is true
 PASS event.clipboardData.getData("url") is ""
 PASS event.clipboardData.getData("text/plain") is ""
 PASS event.clipboardData.getData("text/uri-list") is ""

Modified: branches/safari-605-branch/LayoutTests/editing/pasteboard/paste-image-does-not-reveal-file-url.html (228359 => 228360)


--- branches/safari-605-branch/LayoutTests/editing/pasteboard/paste-image-does-not-reveal-file-url.html	2018-02-10 05:43:52 UTC (rev 228359)
+++ branches/safari-605-branch/LayoutTests/editing/pasteboard/paste-image-does-not-reveal-file-url.html	2018-02-10 05:43:58 UTC (rev 228360)
@@ -31,7 +31,7 @@
 
 function check(event)
 {
-    shouldBeEqualToString('JSON.stringify(event.clipboardData.types)', '["Files"]');
+    shouldBeTrue('event.clipboardData.types.includes("Files")');
     shouldBeEqualToString('event.clipboardData.getData("url")', '');
     shouldBeEqualToString('event.clipboardData.getData("text/plain")', '');
     shouldBeEqualToString('event.clipboardData.getData("text/uri-list")', '');

Modified: branches/safari-605-branch/Source/WebCore/ChangeLog (228359 => 228360)


--- branches/safari-605-branch/Source/WebCore/ChangeLog	2018-02-10 05:43:52 UTC (rev 228359)
+++ branches/safari-605-branch/Source/WebCore/ChangeLog	2018-02-10 05:43:58 UTC (rev 228360)
@@ -1,5 +1,94 @@
 2018-02-09  Jason Marcell  <jmarc...@apple.com>
 
+        Cherry-pick r228340. rdar://problem/37408869
+
+    2018-02-09  Wenson Hsieh  <wenson_hs...@apple.com>
+
+            Pasting from Excel no longer provides text/html data
+            https://bugs.webkit.org/show_bug.cgi?id=182636
+            <rdar://problem/37087060>
+
+            Reviewed by Ryosuke Niwa.
+
+            After r222656, we treat images on the pasteboard as files. However, we also have an existing policy which hides
+            text data ("text/uri-list", "text/html", "text/plain") from the page when files are present on the pasteboard.
+            When copying a table, Microsoft Excel writes a rendering of the table to the pasteboard as an image. This means
+            that we'll hide other data types (importantly, 'text/html') upon pasting, even though important clients (such as
+            Google Docs and Confluence) depend on the 'text/html' data in order to correctly handle the paste (rather than
+            paste as an image of a table).
+
+            To fix this, we add an exception to the DataTransfer.getData codepath when the pasteboard contains files.
+            Instead of always returning the empty string for text/html, we still allow pasteboard access, but only read
+            from a limited set of rich text types, i.e. web archive, RTF(D), and HTML markup. Importantly, this prevents
+            us from exposing any file paths that appear as plain text or URLs on the pasteboard. Just as in the regular
+            codepath for getData(), if the pasteboard data comes from the same origin, we allow unsanitized access;
+            otherwise, we use WebContentMarkupReader to extract markup from the pasteboard.
+
+            Tests:  PasteMixedContent.ImageFileAndPlainText
+                    PasteMixedContent.ImageFileAndWebArchive
+                    PasteMixedContent.ImageFileAndHTML
+                    PasteMixedContent.ImageFileAndRTF
+                    PasteMixedContent.ImageFileAndURL
+                    PasteMixedContent.ImageFileWithHTMLAndURL
+                    DataInteractionTests.DataTransferGetDataWhenDroppingImageAndMarkup
+
+            Also rebaselined some layout tests, which cover changes in behavior when dropping on macOS and pasting on iOS.
+
+            * dom/DataTransfer.cpp:
+            (WebCore::DataTransfer::getDataForItem const):
+
+            Augment the codepath handling the case where the pasteboard contains files, such that we allow reading
+            "text/html", but only from rich text types.
+
+            (WebCore::DataTransfer::readStringFromPasteboard const):
+
+            Factor out logic for reading from the pasteboard into a private helper. This is called in two places from
+            getDataForItem: in the normal (existing) path, and in the case where we allow 'text/html' to be read despite
+            files appearing in the pasteboard.
+
+            One important difference here is that this helper now takes a WebContentReadingPolicy, whose purpose is to
+            prevent reading from non-rich-text types when files appear in the pasteboard.
+
+            Another tweak here is that we now use `lowercaseType` instead of the original (unadjusted) `type` when reading
+            from the pasteboard. This doesn't seem to be intended in the first place.
+
+            (WebCore::DataTransfer::types const):
+
+            Tweak the implementation of DataTransfer.types() in the case where files exist on the pasteboard, such that we
+            also add "text/html" if it is present in the list of DOM-safe types.
+
+            * dom/DataTransfer.h:
+            * platform/Pasteboard.h:
+
+            Introduce WebContentReadingPolicy, which indicates whether or not we should limit web content reading from the
+            pasteboard to only rich text types upon paste or drop. Normally, we allow all types to be read as web content
+            (::AnyType), but when files appear on the pasteboard, we force OnlyRichTextTypes to ensure that no other types
+            can unintentionally be read back as web content.
+
+            * platform/StaticPasteboard.h:
+            * platform/gtk/PasteboardGtk.cpp:
+            (WebCore::Pasteboard::read):
+            * platform/ios/PasteboardIOS.mm:
+
+            Teach Pasteboard (on iOS) to respect WebContentReadingPolicy.
+
+            (WebCore::isTypeAllowedByReadingPolicy):
+            (WebCore::Pasteboard::read):
+            (WebCore::Pasteboard::readRespectingUTIFidelities):
+            * platform/mac/PasteboardMac.mm:
+
+            Teach Pasteboard (on macOS) to respect WebContentReadingPolicy.
+
+            (WebCore::Pasteboard::read):
+            * platform/win/PasteboardWin.cpp:
+            (WebCore::Pasteboard::read):
+            * platform/wpe/PasteboardWPE.cpp:
+            (WebCore::Pasteboard::read):
+
+            Adjust non-Cocoa Pasteboard implementations for an interface change.
+
+2018-02-09  Jason Marcell  <jmarc...@apple.com>
+
         Cherry-pick r228342. rdar://problem/37408891
 
     2018-02-09  Andy Estes  <aes...@apple.com>

Modified: branches/safari-605-branch/Source/WebCore/dom/DataTransfer.cpp (228359 => 228360)


--- branches/safari-605-branch/Source/WebCore/dom/DataTransfer.cpp	2018-02-10 05:43:52 UTC (rev 228359)
+++ branches/safari-605-branch/Source/WebCore/dom/DataTransfer.cpp	2018-02-10 05:43:58 UTC (rev 228360)
@@ -154,9 +154,23 @@
             if (Pasteboard::canExposeURLToDOMWhenPasteboardContainsFiles(urlString))
                 return urlString;
         }
+
+        if (lowercaseType == "text/html" && RuntimeEnabledFeatures::sharedFeatures().customPasteboardDataEnabled()) {
+            // If the pasteboard contains files and the page requests 'text/html', we only read from rich text types to prevent file
+            // paths from leaking (e.g. from plain text data on the pasteboard) since we sanitize cross-origin markup. However, if
+            // custom pasteboard data is disabled, then we can't ensure that the markup we deliver is sanitized, so we fall back to
+            // current behavior and return an empty string.
+            return readStringFromPasteboard(document, lowercaseType, WebContentReadingPolicy::OnlyRichTextTypes);
+        }
+
         return { };
     }
 
+    return readStringFromPasteboard(document, lowercaseType, WebContentReadingPolicy::AnyType);
+}
+
+String DataTransfer::readStringFromPasteboard(Document& document, const String& lowercaseType, WebContentReadingPolicy policy) const
+{
     if (!RuntimeEnabledFeatures::sharedFeatures().customPasteboardDataEnabled())
         return m_pasteboard->readString(lowercaseType);
 
@@ -170,15 +184,15 @@
     if (!Pasteboard::isSafeTypeForDOMToReadAndWrite(lowercaseType))
         return { };
 
-    if (!is<StaticPasteboard>(*m_pasteboard) && type == "text/html") {
+    if (!is<StaticPasteboard>(*m_pasteboard) && lowercaseType == "text/html") {
         if (!document.frame())
             return { };
         WebContentMarkupReader reader { *document.frame() };
-        m_pasteboard->read(reader);
+        m_pasteboard->read(reader, policy);
         return reader.markup;
     }
 
-    return m_pasteboard->readString(type);
+    return m_pasteboard->readString(lowercaseType);
 }
 
 String DataTransfer::getData(Document& document, const String& type) const
@@ -293,6 +307,8 @@
             types.append(ASCIILiteral("Files"));
         if (safeTypes.contains("text/uri-list"))
             types.append(ASCIILiteral("text/uri-list"));
+        if (safeTypes.contains("text/html") && RuntimeEnabledFeatures::sharedFeatures().customPasteboardDataEnabled())
+            types.append(ASCIILiteral("text/html"));
         return types;
     }
 

Modified: branches/safari-605-branch/Source/WebCore/dom/DataTransfer.h (228359 => 228360)


--- branches/safari-605-branch/Source/WebCore/dom/DataTransfer.h	2018-02-10 05:43:52 UTC (rev 228359)
+++ branches/safari-605-branch/Source/WebCore/dom/DataTransfer.h	2018-02-10 05:43:58 UTC (rev 228360)
@@ -39,6 +39,7 @@
 class FileList;
 class File;
 class Pasteboard;
+enum class WebContentReadingPolicy;
 
 class DataTransfer : public RefCounted<DataTransfer> {
 public:
@@ -121,6 +122,7 @@
     bool forFileDrag() const { return false; }
 #endif
 
+    String readStringFromPasteboard(Document&, const String& lowercaseType, WebContentReadingPolicy) const;
     bool shouldSuppressGetAndSetDataToAvoidExposingFilePaths() const;
 
     enum class AddFilesType { No, Yes };

Modified: branches/safari-605-branch/Source/WebCore/platform/Pasteboard.h (228359 => 228360)


--- branches/safari-605-branch/Source/WebCore/platform/Pasteboard.h	2018-02-10 05:43:52 UTC (rev 228359)
+++ branches/safari-605-branch/Source/WebCore/platform/Pasteboard.h	2018-02-10 05:43:58 UTC (rev 228360)
@@ -64,6 +64,7 @@
 class SelectionData;
 class SharedBuffer;
 
+enum class WebContentReadingPolicy { AnyType, OnlyRichTextTypes };
 enum ShouldSerializeSelectedTextForDataTransfer { DefaultSelectedTextType, IncludeImageAltTextForDataTransfer };
 
 // For writing to the pasteboard. Generally sorted with the richest formats on top.
@@ -209,7 +210,7 @@
     virtual void clear(const String& type);
 
     virtual void read(PasteboardPlainText&);
-    virtual void read(PasteboardWebContentReader&);
+    virtual void read(PasteboardWebContentReader&, WebContentReadingPolicy = WebContentReadingPolicy::AnyType);
     virtual void read(PasteboardFileReader&);
 
     virtual void write(const PasteboardURL&);
@@ -273,7 +274,7 @@
 private:
 #if PLATFORM(IOS)
     bool respectsUTIFidelities() const;
-    void readRespectingUTIFidelities(PasteboardWebContentReader&);
+    void readRespectingUTIFidelities(PasteboardWebContentReader&, WebContentReadingPolicy);
 
     enum class ReaderResult {
         ReadType,

Modified: branches/safari-605-branch/Source/WebCore/platform/StaticPasteboard.h (228359 => 228360)


--- branches/safari-605-branch/Source/WebCore/platform/StaticPasteboard.h	2018-02-10 05:43:52 UTC (rev 228359)
+++ branches/safari-605-branch/Source/WebCore/platform/StaticPasteboard.h	2018-02-10 05:43:58 UTC (rev 228360)
@@ -53,7 +53,7 @@
     void clear(const String& type) final;
 
     void read(PasteboardPlainText&) final { }
-    void read(PasteboardWebContentReader&) final { }
+    void read(PasteboardWebContentReader&, WebContentReadingPolicy) final { }
 
     void write(const PasteboardURL&) final { }
     void write(const PasteboardImage&) final { }

Modified: branches/safari-605-branch/Source/WebCore/platform/gtk/PasteboardGtk.cpp (228359 => 228360)


--- branches/safari-605-branch/Source/WebCore/platform/gtk/PasteboardGtk.cpp	2018-02-10 05:43:52 UTC (rev 228359)
+++ branches/safari-605-branch/Source/WebCore/platform/gtk/PasteboardGtk.cpp	2018-02-10 05:43:58 UTC (rev 228360)
@@ -236,7 +236,7 @@
     text.text = m_selectionData->text();
 }
 
-void Pasteboard::read(PasteboardWebContentReader&)
+void Pasteboard::read(PasteboardWebContentReader&, WebContentReadingPolicy)
 {
 }
 

Modified: branches/safari-605-branch/Source/WebCore/platform/ios/PasteboardIOS.mm (228359 => 228360)


--- branches/safari-605-branch/Source/WebCore/platform/ios/PasteboardIOS.mm	2018-02-10 05:43:52 UTC (rev 228359)
+++ branches/safari-605-branch/Source/WebCore/platform/ios/PasteboardIOS.mm	2018-02-10 05:43:58 UTC (rev 228360)
@@ -163,6 +163,15 @@
     return @[(id)kUTTypePNG, (id)kUTTypeTIFF, (id)kUTTypeJPEG, (id)kUTTypeGIF];
 }
 
+static bool isTypeAllowedByReadingPolicy(NSString *type, WebContentReadingPolicy policy)
+{
+    return policy == WebContentReadingPolicy::AnyType
+        || [type isEqualToString:WebArchivePboardType]
+        || [type isEqualToString:(NSString *)kUTTypeHTML]
+        || [type isEqualToString:(NSString *)kUTTypeRTF]
+        || [type isEqualToString:(NSString *)kUTTypeFlatRTFD];
+}
+
 Pasteboard::ReaderResult Pasteboard::readPasteboardWebContentDataForType(PasteboardWebContentReader& reader, PasteboardStrategy& strategy, NSString *type, int itemIndex)
 {
     if ([type isEqualToString:WebArchivePboardType]) {
@@ -225,11 +234,11 @@
     return ReaderResult::DidNotReadType;
 }
 
-void Pasteboard::read(PasteboardWebContentReader& reader)
+void Pasteboard::read(PasteboardWebContentReader& reader, WebContentReadingPolicy policy)
 {
     reader.contentOrigin = readOrigin();
     if (respectsUTIFidelities()) {
-        readRespectingUTIFidelities(reader);
+        readRespectingUTIFidelities(reader, policy);
         return;
     }
 
@@ -245,9 +254,14 @@
 
     for (int i = 0; i < numberOfItems; i++) {
         for (int typeIndex = 0; typeIndex < numberOfTypes; typeIndex++) {
-            auto itemResult = readPasteboardWebContentDataForType(reader, strategy, [types objectAtIndex:typeIndex], i);
+            NSString *type = [types objectAtIndex:typeIndex];
+            if (!isTypeAllowedByReadingPolicy(type, policy))
+                continue;
+
+            auto itemResult = readPasteboardWebContentDataForType(reader, strategy, type, i);
             if (itemResult == ReaderResult::PasteboardWasChangedExternally)
                 return;
+
             if (itemResult == ReaderResult::ReadType)
                 break;
         }
@@ -262,7 +276,7 @@
     return m_pasteboardName == "data interaction pasteboard";
 }
 
-void Pasteboard::readRespectingUTIFidelities(PasteboardWebContentReader& reader)
+void Pasteboard::readRespectingUTIFidelities(PasteboardWebContentReader& reader, WebContentReadingPolicy policy)
 {
     ASSERT(respectsUTIFidelities());
     auto& strategy = *platformStrategies()->pasteboardStrategy();
@@ -269,7 +283,7 @@
     for (NSUInteger index = 0, numberOfItems = strategy.getPasteboardItemsCount(m_pasteboardName); index < numberOfItems; ++index) {
 #if ENABLE(ATTACHMENT_ELEMENT)
         auto info = strategy.informationForItemAtIndex(index, m_pasteboardName);
-        bool canReadAttachment = RuntimeEnabledFeatures::sharedFeatures().attachmentElementEnabled() && !info.pathForFileUpload.isEmpty();
+        bool canReadAttachment = policy == WebContentReadingPolicy::AnyType && RuntimeEnabledFeatures::sharedFeatures().attachmentElementEnabled() && !info.pathForFileUpload.isEmpty();
         if (canReadAttachment && info.preferredPresentationStyle == PasteboardItemPresentationStyle::Attachment) {
             reader.readFilePaths({ info.pathForFileUpload });
             continue;
@@ -281,6 +295,9 @@
         strategy.getTypesByFidelityForItemAtIndex(typesForItemInOrderOfFidelity, index, m_pasteboardName);
         ReaderResult result = ReaderResult::DidNotReadType;
         for (auto& type : typesForItemInOrderOfFidelity) {
+            if (!isTypeAllowedByReadingPolicy(type, policy))
+                continue;
+
             result = readPasteboardWebContentDataForType(reader, strategy, type, index);
             if (result == ReaderResult::PasteboardWasChangedExternally)
                 return;

Modified: branches/safari-605-branch/Source/WebCore/platform/mac/PasteboardMac.mm (228359 => 228360)


--- branches/safari-605-branch/Source/WebCore/platform/mac/PasteboardMac.mm	2018-02-10 05:43:52 UTC (rev 228359)
+++ branches/safari-605-branch/Source/WebCore/platform/mac/PasteboardMac.mm	2018-02-10 05:43:58 UTC (rev 228360)
@@ -331,7 +331,7 @@
     text.isURL = !text.text.isNull();
 }
 
-void Pasteboard::read(PasteboardWebContentReader& reader)
+void Pasteboard::read(PasteboardWebContentReader& reader, WebContentReadingPolicy policy)
 {
     PasteboardStrategy& strategy = *platformStrategies()->pasteboardStrategy();
 
@@ -347,7 +347,7 @@
         }
     }
 
-    if (types.contains(String(legacyFilenamesPasteboardType()))) {
+    if (policy == WebContentReadingPolicy::AnyType && types.contains(String(legacyFilenamesPasteboardType()))) {
         Vector<String> paths;
         strategy.getPathnamesForType(paths, legacyFilenamesPasteboardType(), m_pasteboardName);
         if (m_changeCount != changeCount() || reader.readFilePaths(paths))
@@ -374,6 +374,9 @@
         }
     }
 
+    if (policy == WebContentReadingPolicy::OnlyRichTextTypes)
+        return;
+
     if (types.contains(String(legacyTIFFPasteboardType()))) {
         if (RefPtr<SharedBuffer> buffer = strategy.bufferForType(legacyTIFFPasteboardType(), m_pasteboardName)) {
             if (m_changeCount != changeCount() || reader.readImage(buffer.releaseNonNull(), ASCIILiteral("image/tiff")))

Modified: branches/safari-605-branch/Source/WebCore/platform/win/PasteboardWin.cpp (228359 => 228360)


--- branches/safari-605-branch/Source/WebCore/platform/win/PasteboardWin.cpp	2018-02-10 05:43:52 UTC (rev 228359)
+++ branches/safari-605-branch/Source/WebCore/platform/win/PasteboardWin.cpp	2018-02-10 05:43:58 UTC (rev 228360)
@@ -1073,7 +1073,7 @@
 {
 }
 
-void Pasteboard::read(PasteboardWebContentReader&)
+void Pasteboard::read(PasteboardWebContentReader&, WebContentReadingPolicy)
 {
 }
 

Modified: branches/safari-605-branch/Source/WebCore/platform/wpe/PasteboardWPE.cpp (228359 => 228360)


--- branches/safari-605-branch/Source/WebCore/platform/wpe/PasteboardWPE.cpp	2018-02-10 05:43:52 UTC (rev 228359)
+++ branches/safari-605-branch/Source/WebCore/platform/wpe/PasteboardWPE.cpp	2018-02-10 05:43:58 UTC (rev 228360)
@@ -97,7 +97,7 @@
     text.text = platformStrategies()->pasteboardStrategy()->readStringFromPasteboard(0, "text/plain;charset=utf-8");
 }
 
-void Pasteboard::read(PasteboardWebContentReader&)
+void Pasteboard::read(PasteboardWebContentReader&, WebContentReadingPolicy)
 {
     notImplemented();
 }

Modified: branches/safari-605-branch/Tools/ChangeLog (228359 => 228360)


--- branches/safari-605-branch/Tools/ChangeLog	2018-02-10 05:43:52 UTC (rev 228359)
+++ branches/safari-605-branch/Tools/ChangeLog	2018-02-10 05:43:58 UTC (rev 228360)
@@ -1,5 +1,50 @@
 2018-02-09  Jason Marcell  <jmarc...@apple.com>
 
+        Cherry-pick r228340. rdar://problem/37408869
+
+    2018-02-08  Wenson Hsieh  <wenson_hs...@apple.com>
+
+            Pasting from Excel no longer provides text/html data
+            https://bugs.webkit.org/show_bug.cgi?id=182636
+            <rdar://problem/37087060>
+
+            Reviewed by Ryosuke Niwa.
+
+            Add new API tests to exercise pasting images with various other content types on macOS, and when dropping images
+            and HTML markup on iOS. See the WebCore ChangeLog for more detail.
+
+            * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+            * TestWebKitAPI/Tests/WebKitCocoa/DataTransfer.html: Added.
+
+            Add a new API test harness that dumps various bits of information about a DataTransfer upon paste and drop.
+            While somewhat similar to some existing harnesses, this makes a distinction between the raw HTML data on the
+            pasteboard and the actual result of inserting said HTML into the DOM. This allows us to check that the HTML has
+            been sanitized, while making checks for the actual content of the HTML robust against inline style changes.
+
+            * TestWebKitAPI/Tests/WebKitCocoa/PasteImage.mm:
+            * TestWebKitAPI/Tests/WebKitCocoa/PasteMixedContent.mm: Added.
+
+            Add a new test suite to exercise pasting mixed content types. In these test cases, the pasteboard contains a
+            file, with some combination of plain text, rich text, and URLs.
+
+            (imagePath):
+            (writeTypesAndDataToPasteboard):
+
+            Add a helper to write a var-arg list of content types and data to the general NSPasteboard.
+
+            (setUpWebView):
+            (markupString):
+            (TestWebKitAPI::TEST):
+            * TestWebKitAPI/Tests/ios/DataInteractionTests.mm:
+            (TestWebKitAPI::testIconImageData):
+            (TestWebKitAPI::TEST):
+            * TestWebKitAPI/cocoa/TestWKWebView.h:
+
+            Move a private declaration of -[WKWebView paste:] out to TestWKWebView.h, so that it can be shared across
+            multiple tests. Currently, it only resides in PasteImage.mm, but I need it in PasteMixedContent.mm as well.
+
+2018-02-09  Jason Marcell  <jmarc...@apple.com>
+
         Cherry-pick r228253. rdar://problem/37408874
 
     2018-02-07  Tim Horton  <timothy_hor...@apple.com>

Modified: branches/safari-605-branch/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (228359 => 228360)


--- branches/safari-605-branch/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2018-02-10 05:43:52 UTC (rev 228359)
+++ branches/safari-605-branch/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2018-02-10 05:43:58 UTC (rev 228360)
@@ -734,6 +734,8 @@
 		F44D064A1F3962F2001A0E29 /* EditingTestHarness.mm in Sources */ = {isa = PBXBuildFile; fileRef = F44D06491F3962E3001A0E29 /* EditingTestHarness.mm */; };
 		F4512E131F60C44600BB369E /* DataTransferItem-getAsEntry.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F4512E121F60C43400BB369E /* DataTransferItem-getAsEntry.html */; };
 		F4538EF71E8473E600B5C953 /* large-red-square.png in Copy Resources */ = {isa = PBXBuildFile; fileRef = F4538EF01E846B4100B5C953 /* large-red-square.png */; };
+		F457A9B8202D5CDC00F7E9D5 /* PasteMixedContent.mm in Sources */ = {isa = PBXBuildFile; fileRef = F457A9B6202D5CDC00F7E9D5 /* PasteMixedContent.mm */; };
+		F457A9D6202D68AF00F7E9D5 /* DataTransfer.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F457A9B3202D535300F7E9D5 /* DataTransfer.html */; };
 		F45B63FB1F197F4A009D38B9 /* image-map.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F45B63FA1F197F33009D38B9 /* image-map.html */; };
 		F45B63FE1F19D410009D38B9 /* ActionSheetTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = F45B63FC1F19D410009D38B9 /* ActionSheetTests.mm */; };
 		F46849BE1EEF58E400B937FE /* UIPasteboardTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = F46849BD1EEF58E400B937FE /* UIPasteboardTests.mm */; };
@@ -887,6 +889,7 @@
 				F4AB578A1F65165400DB0DA1 /* custom-draggable-div.html in Copy Resources */,
 				290F4275172A221C00939FF0 /* custom-protocol-sync-xhr.html in Copy Resources */,
 				F486B1D01F67952300F34BDD /* DataTransfer-setDragImage.html in Copy Resources */,
+				F457A9D6202D68AF00F7E9D5 /* DataTransfer.html in Copy Resources */,
 				F4512E131F60C44600BB369E /* DataTransferItem-getAsEntry.html in Copy Resources */,
 				C07E6CB213FD73930038B22B /* devicePixelRatio.html in Copy Resources */,
 				0799C34B1EBA3301003B7532 /* disableGetUserMedia.html in Copy Resources */,
@@ -1847,6 +1850,8 @@
 		F44D06491F3962E3001A0E29 /* EditingTestHarness.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = EditingTestHarness.mm; sourceTree = "<group>"; };
 		F4512E121F60C43400BB369E /* DataTransferItem-getAsEntry.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "DataTransferItem-getAsEntry.html"; sourceTree = "<group>"; };
 		F4538EF01E846B4100B5C953 /* large-red-square.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "large-red-square.png"; sourceTree = "<group>"; };
+		F457A9B3202D535300F7E9D5 /* DataTransfer.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = DataTransfer.html; sourceTree = "<group>"; };
+		F457A9B6202D5CDC00F7E9D5 /* PasteMixedContent.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = PasteMixedContent.mm; sourceTree = "<group>"; };
 		F45B63FA1F197F33009D38B9 /* image-map.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = "image-map.html"; sourceTree = "<group>"; };
 		F45B63FC1F19D410009D38B9 /* ActionSheetTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ActionSheetTests.mm; sourceTree = "<group>"; };
 		F46849BD1EEF58E400B937FE /* UIPasteboardTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = UIPasteboardTests.mm; sourceTree = "<group>"; };
@@ -2115,6 +2120,7 @@
 				CEBCA12E1E3A660100C73293 /* OverrideContentSecurityPolicy.mm */,
 				9BCB7C2620130600003E7C0C /* PasteHTML.mm */,
 				9BDCCD851F7D0B0700009A18 /* PasteImage.mm */,
+				F457A9B6202D5CDC00F7E9D5 /* PasteMixedContent.mm */,
 				9BDD95561F83683600D20C60 /* PasteRTFD.mm */,
 				9B2346411F943A2400DB1D23 /* PasteWebArchive.mm */,
 				3FCC4FE41EC4E8520076E37C /* PictureInPictureDelegate.mm */,
@@ -2346,6 +2352,7 @@
 				9B62630B1F8C2510007EE29B /* copy-url.html */,
 				F4AB57891F65164B00DB0DA1 /* custom-draggable-div.html */,
 				F486B1CF1F6794FF00F34BDD /* DataTransfer-setDragImage.html */,
+				F457A9B3202D535300F7E9D5 /* DataTransfer.html */,
 				F4512E121F60C43400BB369E /* DataTransferItem-getAsEntry.html */,
 				0799C34A1EBA32F4003B7532 /* disableGetUserMedia.html */,
 				63A61B8A1FAD204D00F06885 /* display-mode.html */,
@@ -3529,6 +3536,7 @@
 				7CCE7F0A1A411AE600447C4C /* PasteboardNotifications.mm in Sources */,
 				9BCB7C2820130600003E7C0C /* PasteHTML.mm in Sources */,
 				9BDCCD871F7D0B0700009A18 /* PasteImage.mm in Sources */,
+				F457A9B8202D5CDC00F7E9D5 /* PasteMixedContent.mm in Sources */,
 				9BDD95581F83683600D20C60 /* PasteRTFD.mm in Sources */,
 				9B2346421F943E2700DB1D23 /* PasteWebArchive.mm in Sources */,
 				7C83E0531D0A643A00FEBCF3 /* PendingAPIRequestURL.cpp in Sources */,

Added: branches/safari-605-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/DataTransfer.html (0 => 228360)


--- branches/safari-605-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/DataTransfer.html	                        (rev 0)
+++ branches/safari-605-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/DataTransfer.html	2018-02-10 05:43:58 UTC (rev 228360)
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<html>
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<head>
+    <style>
+        body, html {
+            width: 100%;
+            height: 100%;
+            font-family: monospace;
+        }
+
+        .heading {
+            display: block;
+            width: 100%;
+            border-top: 2px gray dashed;
+            margin-top: 20px;
+            box-sizing: border-box;
+        }
+    </style>
+    <script>
+        function setup()
+        {
+            document.body.addEventListener("paste", event => {
+                dumpAsOutput(event.clipboardData);
+                event.preventDefault();
+            });
+            document.body.addEventListener("drop", event => {
+                dumpAsOutput(event.dataTransfer);
+                event.preventDefault();
+            });
+            document.body.addEventListener("beforeinput", event => event.preventDefault());
+            document.body.focus();
+        }
+
+        function dumpAsOutput(dataTransfer)
+        {
+            document.body.contentEditable = false;
+            types.textContent = dataTransfer.types.join(", ");
+            items.textContent = Array.from(dataTransfer.items).map(item => `(${item.kind.toUpperCase()}, ${item.type})`).join(", ");
+            files.textContent = Array.from(dataTransfer.files).map(file => `('${file.name}', ${file.type})`).join(", ");
+            urlData.textContent = dataTransfer.getData("text/uri-list");
+            textData.textContent = dataTransfer.getData("text/plain");
+            let markup = dataTransfer.getData("text/html");
+            htmlData.insertAdjacentHTML("beforeend", markup);
+            rawHTMLData.textContent = markup;
+        }
+
+        function reset()
+        {
+            Array.from(document.getElementsByClassName("output")).map(element => {
+                element.innerHTML = "";
+            });
+            document.body.contentEditable = true;
+        }
+    </script>
+</head>
+<body contenteditable _onload_=setup()>
+    <h3 class="heading">Types</h3>
+    <div class="output" id="types"></div>
+
+    <h3 class="heading">Items</h3>
+    <div class="output" id="items"></div>
+
+    <h3 class="heading">Files</h3>
+    <div class="output" id="files"></div>
+
+    <h3 class="heading">text/plain</h3>
+    <div class="output" id="textData"></div>
+
+    <h3 class="heading">text/uri-list</h3>
+    <div class="output" id="urlData"></div>
+
+    <h3 class="heading">text/html</h3>
+    <div class="output" id="htmlData"></div>
+    <div class="output" id="rawHTMLData"></div>
+</body>
+</html>

Modified: branches/safari-605-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/PasteImage.mm (228359 => 228360)


--- branches/safari-605-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/PasteImage.mm	2018-02-10 05:43:52 UTC (rev 228359)
+++ branches/safari-605-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/PasteImage.mm	2018-02-10 05:43:58 UTC (rev 228360)
@@ -36,10 +36,6 @@
 #include <MobileCoreServices/MobileCoreServices.h>
 #endif
 
-@interface WKWebView ()
-- (void)paste:(id)sender;
-@end
-
 #if PLATFORM(MAC)
 void writeImageDataToPasteboard(NSString *type, NSData *data)
 {

Added: branches/safari-605-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/PasteMixedContent.mm (0 => 228360)


--- branches/safari-605-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/PasteMixedContent.mm	                        (rev 0)
+++ branches/safari-605-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/PasteMixedContent.mm	2018-02-10 05:43:58 UTC (rev 228360)
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2018 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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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.
+ */
+
+#include "config.h"
+
+#if PLATFORM(MAC) && WK_API_ENABLED
+
+#import "PlatformUtilities.h"
+#import "TestWKWebView.h"
+#import <WebKit/WKPreferencesRef.h>
+#import <WebKit/WKPreferencesRefPrivate.h>
+#import <wtf/RetainPtr.h>
+#import <wtf/text/WTFString.h>
+
+static NSString *imagePath()
+{
+    return [[NSBundle mainBundle] pathForResource:@"icon" ofType:@"png" inDirectory:@"TestWebKitAPI.resources"];
+}
+
+void writeTypesAndDataToPasteboard(id type, ...)
+{
+    NSMutableArray<NSString *> *types = [NSMutableArray array];
+    NSMutableArray *data = "" array];
+    va_list argumentList;
+    if (type) {
+        ASSERT([type isKindOfClass:[NSString class]]);
+        [types addObject:type];
+        va_start(argumentList, type);
+        NSUInteger index = 1;
+        id object = va_arg(argumentList, id);
+        while (object) {
+            if (index % 2)
+                [data addObject:object];
+            else {
+                ASSERT([object isKindOfClass:[NSString class]]);
+                [types addObject:object];
+            }
+            ++index;
+            object = va_arg(argumentList, id);
+        }
+        va_end(argumentList);
+    }
+
+    if (types.count != data.count) {
+        NSLog(@"Expected number of types: %tu to match number of data items: %tu", types.count, data.count);
+        ASSERT_NOT_REACHED();
+        return;
+    }
+
+    [[NSPasteboard generalPasteboard] declareTypes:types owner:nil];
+    [types enumerateObjectsUsingBlock:[&] (NSString *type, NSUInteger index, BOOL *) {
+        id dataToWrite = data[index];
+        if ([dataToWrite isKindOfClass:[NSData class]])
+            [[NSPasteboard generalPasteboard] setData:dataToWrite forType:type];
+        else if ([dataToWrite isKindOfClass:[NSString class]])
+            [[NSPasteboard generalPasteboard] setString:dataToWrite forType:type];
+        else
+            [[NSPasteboard generalPasteboard] setPropertyList:dataToWrite forType:type];
+    }];
+}
+
+static RetainPtr<TestWKWebView> setUpWebView()
+{
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 400, 400)]);
+    WKPreferencesSetCustomPasteboardDataEnabled((WKPreferencesRef)[webView configuration].preferences, true);
+    [webView synchronouslyLoadTestPageNamed:@"DataTransfer"];
+    return webView;
+}
+
+static NSString *markupString()
+{
+    // The script tag and mouseover listener attribute in the markup string below should be omitted during
+    // sanitization while pasting.
+    return @"<script>foo()</script><strong _onmouseover_='_javascript_:void(0)'>HELLO WORLD</strong>";
+}
+
+namespace TestWebKitAPI {
+
+TEST(PasteMixedContent, ImageFileAndPlainText)
+{
+    auto webView = setUpWebView();
+    writeTypesAndDataToPasteboard(NSFilenamesPboardType, @[ imagePath() ], NSPasteboardTypeString, imagePath(), nil);
+    [webView paste:nil];
+
+    EXPECT_WK_STREQ("Files", [webView stringByEvaluatingJavaScript:@"types.textContent"]);
+    EXPECT_WK_STREQ("(FILE, image/png)", [webView stringByEvaluatingJavaScript:@"items.textContent"]);
+    EXPECT_WK_STREQ("('icon.png', image/png)", [webView stringByEvaluatingJavaScript:@"files.textContent"]);
+    EXPECT_WK_STREQ("", [webView stringByEvaluatingJavaScript:@"urlData.textContent"]);
+    EXPECT_WK_STREQ("", [webView stringByEvaluatingJavaScript:@"textData.textContent"]);
+    EXPECT_WK_STREQ("", [webView stringByEvaluatingJavaScript:@"htmlData.textContent"]);
+    EXPECT_WK_STREQ("", [webView stringByEvaluatingJavaScript:@"rawHTMLData.textContent"]);
+}
+
+TEST(PasteMixedContent, ImageFileAndWebArchive)
+{
+    auto webView = setUpWebView();
+    NSURL *mainResourceURL = [NSURL fileURLWithPath:@"/some/nonexistent/file.html"];
+    auto mainResource = adoptNS([[WebResource alloc] initWithData:[markupString() dataUsingEncoding:NSUTF8StringEncoding] URL:mainResourceURL MIMEType:@"text/html" textEncodingName:@"utf-8" frameName:nil]);
+    auto archive = adoptNS([[WebArchive alloc] initWithMainResource:mainResource.get() subresources:nil subframeArchives:nil]);
+    writeTypesAndDataToPasteboard(NSFilenamesPboardType, @[ imagePath() ], WebArchivePboardType, [archive data], nil);
+    [webView paste:nil];
+
+    EXPECT_WK_STREQ("Files, text/html", [webView stringByEvaluatingJavaScript:@"types.textContent"]);
+    EXPECT_WK_STREQ("(STRING, text/html), (FILE, image/png)", [webView stringByEvaluatingJavaScript:@"items.textContent"]);
+    EXPECT_WK_STREQ("('icon.png', image/png)", [webView stringByEvaluatingJavaScript:@"files.textContent"]);
+    EXPECT_WK_STREQ("", [webView stringByEvaluatingJavaScript:@"urlData.textContent"]);
+    EXPECT_WK_STREQ("", [webView stringByEvaluatingJavaScript:@"textData.textContent"]);
+    EXPECT_WK_STREQ("HELLO WORLD", [webView stringByEvaluatingJavaScript:@"htmlData.textContent"]);
+    EXPECT_FALSE([[webView stringByEvaluatingJavaScript:@"rawHTMLData.textContent"] containsString:@"script"]);
+}
+
+TEST(PasteMixedContent, ImageFileAndHTML)
+{
+    auto webView = setUpWebView();
+    writeTypesAndDataToPasteboard(NSFilenamesPboardType, @[ imagePath() ], NSPasteboardTypeHTML, markupString(), nil);
+    [webView paste:nil];
+
+    EXPECT_WK_STREQ("Files, text/html", [webView stringByEvaluatingJavaScript:@"types.textContent"]);
+    EXPECT_WK_STREQ("(STRING, text/html), (FILE, image/png)", [webView stringByEvaluatingJavaScript:@"items.textContent"]);
+    EXPECT_WK_STREQ("('icon.png', image/png)", [webView stringByEvaluatingJavaScript:@"files.textContent"]);
+    EXPECT_WK_STREQ("", [webView stringByEvaluatingJavaScript:@"urlData.textContent"]);
+    EXPECT_WK_STREQ("", [webView stringByEvaluatingJavaScript:@"textData.textContent"]);
+    EXPECT_WK_STREQ("HELLO WORLD", [webView stringByEvaluatingJavaScript:@"htmlData.textContent"]);
+    EXPECT_FALSE([[webView stringByEvaluatingJavaScript:@"rawHTMLData.textContent"] containsString:@"script"]);
+}
+
+TEST(PasteMixedContent, ImageFileAndRTF)
+{
+    auto webView = setUpWebView();
+    auto text = adoptNS([[NSMutableAttributedString alloc] init]);
+    [text appendAttributedString:[[NSAttributedString alloc] initWithString:@"link to "]];
+    [text appendAttributedString:[[NSAttributedString alloc] initWithString:@"apple" attributes:@{ NSLinkAttributeName: [NSURL URLWithString:@"https://www.apple.com/"] }]];
+    NSData *rtfData = [text RTFFromRange:NSMakeRange(0, [text length]) documentAttributes:@{ }];
+    writeTypesAndDataToPasteboard(NSFilenamesPboardType, @[ imagePath() ], NSPasteboardTypeRTF, rtfData, nil);
+    [webView paste:nil];
+
+    EXPECT_WK_STREQ("Files, text/html", [webView stringByEvaluatingJavaScript:@"types.textContent"]);
+    EXPECT_WK_STREQ("(STRING, text/html), (FILE, image/png)", [webView stringByEvaluatingJavaScript:@"items.textContent"]);
+    EXPECT_WK_STREQ("('icon.png', image/png)", [webView stringByEvaluatingJavaScript:@"files.textContent"]);
+    EXPECT_WK_STREQ("", [webView stringByEvaluatingJavaScript:@"urlData.textContent"]);
+    EXPECT_WK_STREQ("", [webView stringByEvaluatingJavaScript:@"textData.textContent"]);
+    EXPECT_WK_STREQ("link to apple", [webView stringByEvaluatingJavaScript:@"htmlData.textContent"]);
+    EXPECT_WK_STREQ("https://www.apple.com/", [webView stringByEvaluatingJavaScript:@"htmlData.querySelector('a').href"]);
+}
+
+TEST(PasteMixedContent, ImageFileAndURL)
+{
+    auto webView = setUpWebView();
+    writeTypesAndDataToPasteboard(NSURLPboardType, @"https://www.webkit.org/", NSFilenamesPboardType, @[ imagePath() ], nil);
+    [webView paste:nil];
+
+    EXPECT_WK_STREQ("Files, text/uri-list", [webView stringByEvaluatingJavaScript:@"types.textContent"]);
+    EXPECT_WK_STREQ("(STRING, text/uri-list), (FILE, image/png)", [webView stringByEvaluatingJavaScript:@"items.textContent"]);
+    EXPECT_WK_STREQ("('icon.png', image/png)", [webView stringByEvaluatingJavaScript:@"files.textContent"]);
+    EXPECT_WK_STREQ("https://www.webkit.org/", [webView stringByEvaluatingJavaScript:@"urlData.textContent"]);
+    EXPECT_WK_STREQ("", [webView stringByEvaluatingJavaScript:@"textData.textContent"]);
+    EXPECT_WK_STREQ("", [webView stringByEvaluatingJavaScript:@"htmlData.textContent"]);
+}
+
+TEST(PasteMixedContent, ImageFileWithHTMLAndURL)
+{
+    auto webView = setUpWebView();
+    writeTypesAndDataToPasteboard(NSURLPboardType, @"https://www.webkit.org/", NSPasteboardTypeHTML, markupString(), NSFilenamesPboardType, @[ imagePath() ], nil);
+    [webView paste:nil];
+
+    EXPECT_WK_STREQ("Files, text/uri-list, text/html", [webView stringByEvaluatingJavaScript:@"types.textContent"]);
+    EXPECT_WK_STREQ("(STRING, text/uri-list), (STRING, text/html), (FILE, image/png)", [webView stringByEvaluatingJavaScript:@"items.textContent"]);
+    EXPECT_WK_STREQ("('icon.png', image/png)", [webView stringByEvaluatingJavaScript:@"files.textContent"]);
+    EXPECT_WK_STREQ("https://www.webkit.org/", [webView stringByEvaluatingJavaScript:@"urlData.textContent"]);
+    EXPECT_WK_STREQ("", [webView stringByEvaluatingJavaScript:@"textData.textContent"]);
+    EXPECT_WK_STREQ("HELLO WORLD", [webView stringByEvaluatingJavaScript:@"htmlData.textContent"]);
+    EXPECT_FALSE([[webView stringByEvaluatingJavaScript:@"rawHTMLData.textContent"] containsString:@"script"]);
+}
+
+} // namespace TestWebKitAPI
+
+#endif // PLATFORM(MAC) && WK_API_ENABLED

Modified: branches/safari-605-branch/Tools/TestWebKitAPI/Tests/ios/DataInteractionTests.mm (228359 => 228360)


--- branches/safari-605-branch/Tools/TestWebKitAPI/Tests/ios/DataInteractionTests.mm	2018-02-10 05:43:52 UTC (rev 228359)
+++ branches/safari-605-branch/Tools/TestWebKitAPI/Tests/ios/DataInteractionTests.mm	2018-02-10 05:43:58 UTC (rev 228360)
@@ -1494,6 +1494,35 @@
 
 #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 110300
 
+static NSData *testIconImageData()
+{
+    return [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"icon" ofType:@"png" inDirectory:@"TestWebKitAPI.resources"]];
+}
+
+TEST(DataInteractionTests, DataTransferGetDataWhenDroppingImageAndMarkup)
+{
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);
+    WKPreferencesSetCustomPasteboardDataEnabled((WKPreferencesRef)[webView configuration].preferences, true);
+    [webView synchronouslyLoadTestPageNamed:@"DataTransfer"];
+
+    auto simulator = adoptNS([[DataInteractionSimulator alloc] initWithWebView:webView.get()]);
+    auto itemProvider = adoptNS([[UIItemProvider alloc] init]);
+    [itemProvider registerDataRepresentationForTypeIdentifier:(NSString *)kUTTypePNG withData:testIconImageData()];
+    NSString *markupString = @"<script>bar()</script><strong _onmousedown_=_javascript_:void(0)>HELLO WORLD</strong>";
+    [itemProvider registerDataRepresentationForTypeIdentifier:(NSString *)kUTTypeHTML withData:[markupString dataUsingEncoding:NSUTF8StringEncoding]];
+    [itemProvider setSuggestedName:@"icon"];
+    [simulator setExternalItemProviders:@[ itemProvider.get() ]];
+    [simulator runFrom:CGPointZero to:CGPointMake(50, 100)];
+
+    EXPECT_WK_STREQ("Files, text/html", [webView stringByEvaluatingJavaScript:@"types.textContent"]);
+    EXPECT_WK_STREQ("(STRING, text/html), (FILE, image/png)", [webView stringByEvaluatingJavaScript:@"items.textContent"]);
+    EXPECT_WK_STREQ("('icon.png', image/png)", [webView stringByEvaluatingJavaScript:@"files.textContent"]);
+    EXPECT_WK_STREQ("", [webView stringByEvaluatingJavaScript:@"urlData.textContent"]);
+    EXPECT_WK_STREQ("", [webView stringByEvaluatingJavaScript:@"textData.textContent"]);
+    EXPECT_WK_STREQ("HELLO WORLD", [webView stringByEvaluatingJavaScript:@"htmlData.textContent"]);
+    EXPECT_FALSE([[webView stringByEvaluatingJavaScript:@"rawHTMLData.textContent"] containsString:@"script"]);
+}
+
 TEST(DataInteractionTests, DataTransferGetDataWhenDroppingPlainText)
 {
     auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);

Modified: branches/safari-605-branch/Tools/TestWebKitAPI/cocoa/TestWKWebView.h (228359 => 228360)


--- branches/safari-605-branch/Tools/TestWebKitAPI/cocoa/TestWKWebView.h	2018-02-10 05:43:52 UTC (rev 228359)
+++ branches/safari-605-branch/Tools/TestWebKitAPI/cocoa/TestWKWebView.h	2018-02-10 05:43:58 UTC (rev 228360)
@@ -34,6 +34,12 @@
 @class _WKActivatedElementInfo;
 #endif
 
+@interface WKWebView (AdditionalDeclarations)
+#if PLATFORM(MAC)
+- (void)paste:(id)sender;
+#endif
+@end
+
 @interface TestMessageHandler : NSObject <WKScriptMessageHandler>
 - (void)addMessage:(NSString *)message withHandler:(dispatch_block_t)handler;
 @end
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to