https://bugs.webkit.org/show_bug.cgi?id=175596
Reviewed by Wenson Hsieh.
Source/JavaScriptCore:
Added DataTransferItem as a common identifier since it's a runtime enabled feature.
* runtime/CommonIdentifiers.h:
Source/WebCore:
Added the basic machinery to get the list of plain text items to DataTransferItemList and DataTransferItem.
Each DataTransferItem now depends on DataTransfer so it does ref-forwarding like DataTransferItemList to make
DataTransfer alive as long as any DataTransferItem is alive.
Specifications: https://html.spec.whatwg.org/multipage/dnd.html#the-datatransferitem-interface
https://html.spec.whatwg.org/multipage/dnd.html#the-datatransferitemlist-interface
Tests: editing/pasteboard/datatransfer-items-drop-plaintext-file.html
editing/pasteboard/datatransfer-items-paste-plaintext.html
* dom/DataTransferItem.cpp:
(WebCore::DataTransferItem::DataTransferItem): Added two variants one for plain text and another one for a file.
(WebCore::DataTransferItem::kind const): Rewritten.
(WebCore::DataTransferItem::getAsString const): Implemented.
(WebCore::DataTransferItem::getAsFile const): Implemented.
* dom/DataTransferItem.h:
(WebCore::DataTransferItem::ref): Added.
(WebCore::DataTransferItem::deref): Added.
(WebCore::DataTransferItem::type const): Returns String instead of AtomicString.
(WebCore::DataTransferItem::kind const): Moved to cpp.
* dom/DataTransferItem.idl: Removed NoInterfaceObject since the interface object should exist on DOMWindow.
* dom/DataTransferItemList.cpp:
(WebCore::DataTransferItemList::length): Implemented.
(WebCore::DataTransferItemList::item): Ditto.
(WebCore::isSupportedType): Added. For now, we only support text/plain.
(WebCore::DataTransferItemList::ensureItems): Added. Constructs the list of DataTransferItems.
* dom/DataTransferItemList.h:
(DataTransferItemList): Added m_items. The list is filled lazily by ensureItems.
* dom/DataTransferItemList.idl: Removed NoInterfaceObject since the interface object should exist on DOMWindow.
LayoutTests:
Rebaselined the tests and added two regression tests for pasting plain text and dropping a plain text file.
Unfortunately, dropping a file is only supported by DumpRenderTree on Mac :( so it's disabled elsewhere.
* editing/pasteboard/datatransfer-idl-expected.txt: Rebaselined now that NoInterfaceObject has been dropped from
DataTransferItem.idl and DataTransferItemList.idl as expected.
* editing/pasteboard/datatransfer-idl.html: Fixed the bug that it wasn't testing IDL for DataTransferItem.
* editing/pasteboard/datatransfer-items-drop-plaintext-file-expected.txt: Added.
* editing/pasteboard/datatransfer-items-drop-plaintext-file.html: Added.
* editing/pasteboard/datatransfer-items-paste-plaintext-expected.txt: Added.
* editing/pasteboard/datatransfer-items-paste-plaintext.html: Added.
* editing/resources/text-pasteboard-data.txt: Added.
* platform/gtk/js/dom/global-constructors-attributes-expected.txt:
* platform/ios/TestExpectations:
* platform/mac-elcapitan-wk2/js/dom/global-constructors-attributes-expected.txt:
* platform/mac-elcapitan/js/dom/global-constructors-attributes-expected.txt:
* platform/mac-highsierra-wk1/js/dom/global-constructors-attributes-expected.txt:
* platform/mac-highsierra/js/dom/global-constructors-attributes-expected.txt:
* platform/mac/js/dom/global-constructors-attributes-expected.txt:
* platform/win/TestExpectations:
* platform/wk2/TestExpectations:
* platform/wpe/js/dom/global-constructors-attributes-expected.txt:
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@220782
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2017-08-15 Ryosuke Niwa <rniwa@webkit.org>
+
+ Make DataTransferItemList work with plain text entries
+ https://bugs.webkit.org/show_bug.cgi?id=175596
+
+ Reviewed by Wenson Hsieh.
+
+ Rebaselined the tests and added two regression tests for pasting plain text and dropping a plain text file.
+
+ Unfortunately, dropping a file is only supported by DumpRenderTree on Mac :( so it's disabled elsewhere.
+
+ * editing/pasteboard/datatransfer-idl-expected.txt: Rebaselined now that NoInterfaceObject has been dropped from
+ DataTransferItem.idl and DataTransferItemList.idl as expected.
+ * editing/pasteboard/datatransfer-idl.html: Fixed the bug that it wasn't testing IDL for DataTransferItem.
+ * editing/pasteboard/datatransfer-items-drop-plaintext-file-expected.txt: Added.
+ * editing/pasteboard/datatransfer-items-drop-plaintext-file.html: Added.
+ * editing/pasteboard/datatransfer-items-paste-plaintext-expected.txt: Added.
+ * editing/pasteboard/datatransfer-items-paste-plaintext.html: Added.
+ * editing/resources/text-pasteboard-data.txt: Added.
+ * platform/gtk/js/dom/global-constructors-attributes-expected.txt:
+ * platform/ios/TestExpectations:
+ * platform/mac-elcapitan-wk2/js/dom/global-constructors-attributes-expected.txt:
+ * platform/mac-elcapitan/js/dom/global-constructors-attributes-expected.txt:
+ * platform/mac-highsierra-wk1/js/dom/global-constructors-attributes-expected.txt:
+ * platform/mac-highsierra/js/dom/global-constructors-attributes-expected.txt:
+ * platform/mac/js/dom/global-constructors-attributes-expected.txt:
+ * platform/win/TestExpectations:
+ * platform/wk2/TestExpectations:
+ * platform/wpe/js/dom/global-constructors-attributes-expected.txt:
+
2017-08-15 Chris Dumez <cdumez@apple.com>
Fetch / Beacon: Use "application/octet-stream" Content-Type for payloads of type ArrayBuffer / ArrayBufferView
+CONSOLE MESSAGE: line 251: callback not yet supported
PASS DataTransfer interface: existence and properties of interface object
PASS DataTransfer interface object length
PASS DataTransfer interface: operation setData(DOMString,DOMString)
PASS DataTransfer interface: operation clearData(DOMString)
PASS DataTransfer interface: attribute files
-FAIL DataTransferItemList interface: existence and properties of interface object assert_own_property: self does not have own property "DataTransferItemList" expected property "DataTransferItemList" missing
-FAIL DataTransferItemList interface object length assert_own_property: self does not have own property "DataTransferItemList" expected property "DataTransferItemList" missing
-FAIL DataTransferItemList interface object name assert_own_property: self does not have own property "DataTransferItemList" expected property "DataTransferItemList" missing
-FAIL DataTransferItemList interface: existence and properties of interface prototype object assert_own_property: self does not have own property "DataTransferItemList" expected property "DataTransferItemList" missing
-FAIL DataTransferItemList interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "DataTransferItemList" expected property "DataTransferItemList" missing
-FAIL DataTransferItemList interface: attribute length assert_own_property: self does not have own property "DataTransferItemList" expected property "DataTransferItemList" missing
-FAIL DataTransferItemList interface: operation add(DOMString,DOMString) assert_own_property: self does not have own property "DataTransferItemList" expected property "DataTransferItemList" missing
-FAIL DataTransferItemList interface: operation add(File) assert_own_property: self does not have own property "DataTransferItemList" expected property "DataTransferItemList" missing
-FAIL DataTransferItemList interface: operation remove(unsigned long) assert_own_property: self does not have own property "DataTransferItemList" expected property "DataTransferItemList" missing
-FAIL DataTransferItemList interface: operation clear() assert_own_property: self does not have own property "DataTransferItemList" expected property "DataTransferItemList" missing
+PASS DataTransferItemList interface: existence and properties of interface object
+PASS DataTransferItemList interface object length
+PASS DataTransferItemList interface object name
+PASS DataTransferItemList interface: existence and properties of interface prototype object
+PASS DataTransferItemList interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransferItemList interface: attribute length
+FAIL DataTransferItemList interface: operation add(DOMString,DOMString) assert_equals: property has wrong .length expected 1 but got 0
+FAIL DataTransferItemList interface: operation add(File) assert_equals: property has wrong .length expected 1 but got 0
+PASS DataTransferItemList interface: operation remove(unsigned long)
+PASS DataTransferItemList interface: operation clear()
+PASS DataTransferItem interface: existence and properties of interface object
+PASS DataTransferItem interface object length
+PASS DataTransferItem interface object name
+PASS DataTransferItem interface: existence and properties of interface prototype object
+PASS DataTransferItem interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransferItem interface: attribute kind
+PASS DataTransferItem interface: attribute type
+PASS DataTransferItem interface: operation getAsString(FunctionStringCallback)
+PASS DataTransferItem interface: operation getAsFile()
interface DataTransferItem {
readonly attribute DOMString kind;
readonly attribute DOMString type;
- void getAsString(FunctionStringCallback? _callback);
+ void getAsString(FunctionStringCallback? callback);
File? getAsFile();
};
<script>
var idlsArray = new IdlArray();
var idl = document.getElementById("datatransfer-idl").textContent
- + document.getElementById("datatransferitemlist-idl").textContent;
+ + document.getElementById("datatransferitemlist-idl").textContent
+ document.getElementById("datatransferitem-idl").textContent;
idlsArray.add_idls(idl);
idlsArray.add_untested_idls("interface Element {};");
-//idlsArray.add_untested_idls("interface ReadableStream {};");
-//idlsArray.add_objects({ Response: ['new Response()'] });
idlsArray.test();
</script>
</body>
--- /dev/null
+This tests accessing DataTransferItemList when dropping a file. To manually test, drag and drop LayoutTests/editing/resources/text-pasteboard-data.txt from another app (e.g. Finder) to the box below.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS dataTransfer.items.length is 1
+PASS dataTransfer.items[0].kind is "file"
+PASS dataTransfer.items[0].type is "text/plain"
+PASS file = dataTransfer.items[0].getAsFile(); file is not null
+PASS file.name is "text-pasteboard-data.txt"
+PASS reader = new FileReader(); reader.onload = () => checkFileContent(reader.result); reader.readAsText(file); did not throw exception.
+PASS "hello, world." is "hello, world."
+PASS dataTransfer.items[0].getAsFile() is null
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
--- /dev/null
+<!DOCTYPE html>
+<html>
+<body onload="runTest()">
+<script src="../../resources/js-test-pre.js"></script>
+<script>
+
+description('This tests accessing DataTransferItemList when dropping a file.'
+ + ' To manually test, drag and drop <a href="../resources/text-pasteboard-data.txt">LayoutTests/editing/resources/text-pasteboard-data.txt</a> from another app (e.g. Finder) to the box below.');
+
+function runTest()
+{
+ if (!window.testRunner)
+ return;
+ if (!window.eventSender || !eventSender.beginDragWithFiles) {
+ testFailed('This test requires eventSender.beginDragWithFiles');
+ finishJSTest();
+ return;
+ }
+
+ eventSender.beginDragWithFiles(["../resources/text-pasteboard-data.txt"]);
+ const target = document.getElementById('target');
+ eventSender.mouseMoveTo(target.offsetLeft + 5, target.offsetTop + 5);
+ eventSender.mouseUp();
+}
+
+function drop(event)
+{
+ event.preventDefault();
+ dataTransfer = event.dataTransfer;
+ shouldBe('dataTransfer.items.length', '1');
+ shouldBeEqualToString('dataTransfer.items[0].kind', 'file');
+ shouldBeEqualToString('dataTransfer.items[0].type', 'text/plain');
+ shouldNotBe('file = dataTransfer.items[0].getAsFile(); file', 'null');
+ shouldBeEqualToString('file.name', 'text-pasteboard-data.txt');
+ shouldNotThrow('reader = new FileReader(); reader.onload = () => checkFileContent(reader.result); reader.readAsText(file);');
+}
+
+function checkFileContent(content)
+{
+ shouldBeEqualToString('"' + content + '"', 'hello, world.');
+ shouldBe('dataTransfer.items[0].getAsFile()', 'null');
+ finishJSTest();
+}
+
+jsTestIsAsync = true;
+successfullyParsed = true;
+
+</script>
+<script src="../../resources/js-test-post.js"></script>
+<div id="target" contenteditable="true" ondrop="drop(event)" style="width: 100px; height: 100px; border: solid 1px black;"></div>
+</body>
+</html>
--- /dev/null
+This tests dataTransfer.items. To manually test, click on "Copy text" and paste (Command+V on Mac Control+V elsewhere).
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS clipboardData.items.length is 1
+PASS clipboardData.items[0].kind is "string"
+PASS clipboardData.items[0].type is "text/plain"
+PASS clipboardData.items[0].getAsFile() is null
+PASS clipboardData.items[0].getAsString(checkContent) is undefined
+PASS "hello, world" is "hello, world"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
--- /dev/null
+<!DOCTYPE html>
+<html>
+<body>
+<script src="../../resources/js-test-pre.js"></script>
+<script>
+
+description('This tests dataTransfer.items. To manually test, click on "Copy text" and paste (Command+V on Mac Control+V elsewhere).');
+
+function copyText()
+{
+ document.getElementById('source').style.display = null;
+ document.getElementById('source').focus();
+ document.execCommand('SelectAll', false, null);
+ document.execCommand('Copy', false, null);
+ document.getElementById('source').style.display = 'none';
+ document.getElementById('target').focus();
+ if (window.testRunner)
+ testRunner.execCommand('Paste', null);
+}
+
+function paste(event)
+{
+ clipboardData = event.clipboardData;
+ shouldBe('clipboardData.items.length', '1');
+ shouldBeEqualToString('clipboardData.items[0].kind', 'string');
+ shouldBeEqualToString('clipboardData.items[0].type', 'text/plain');
+ shouldBe('clipboardData.items[0].getAsFile()', 'null');
+ shouldBe('clipboardData.items[0].getAsString(checkContent)', 'undefined');
+}
+
+function checkContent(content)
+{
+ shouldBeEqualToString('"' + content + '"', 'hello, world');
+ document.getElementById('container').style.display = 'none';
+ finishJSTest();
+}
+
+if (window.testRunner)
+ window.onload = copyText;
+jsTestIsAsync = true;
+successfullyParsed = true;
+
+</script>
+<div id="container">
+ <button onclick="copyText();">Copy text</button>
+ <div id="source" contenteditable="true" style="display: none">hello, world</div>
+ <div id="target" contenteditable="true" onpaste="paste(event)"></div>
+</div>
+<script src="../../resources/js-test-post.js"></script>
+</body>
+</html>
--- /dev/null
+hello, world.
\ No newline at end of file
PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').hasOwnProperty('set') is false
PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').enumerable is false
PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').value is DataTransferItem
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').value is DataTransferItemList
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').configurable is true
PASS Object.getOwnPropertyDescriptor(global, 'DataView').value is DataView
PASS Object.getOwnPropertyDescriptor(global, 'DataView').hasOwnProperty('get') is false
PASS Object.getOwnPropertyDescriptor(global, 'DataView').hasOwnProperty('set') is false
fast/canvas/canvas-toDataURL-webp.html
# Drag-and-drop is not supported:
+editing/pasteboard/datatransfer-items-drop-plaintext-file.html
+editing/pasteboard/datatransfer-items-paste-plaintext.html
editing/pasteboard/drag-link-with-data-transfer-adds-trusted-link-to-pasteboard.html
fast/events/bogus-dropEffect-effectAllowed.html
fast/events/clear-drag-state.html
PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').hasOwnProperty('set') is false
PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').enumerable is false
PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').value is DataTransferItem
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').value is DataTransferItemList
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').configurable is true
PASS Object.getOwnPropertyDescriptor(global, 'DataView').value is DataView
PASS Object.getOwnPropertyDescriptor(global, 'DataView').hasOwnProperty('get') is false
PASS Object.getOwnPropertyDescriptor(global, 'DataView').hasOwnProperty('set') is false
PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').hasOwnProperty('set') is false
PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').enumerable is false
PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').value is DataTransferItem
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').value is DataTransferItemList
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').configurable is true
PASS Object.getOwnPropertyDescriptor(global, 'DataView').value is DataView
PASS Object.getOwnPropertyDescriptor(global, 'DataView').hasOwnProperty('get') is false
PASS Object.getOwnPropertyDescriptor(global, 'DataView').hasOwnProperty('set') is false
PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').hasOwnProperty('set') is false
PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').enumerable is false
PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').value is DataTransferItem
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').value is DataTransferItemList
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').configurable is true
PASS Object.getOwnPropertyDescriptor(global, 'DataView').value is DataView
PASS Object.getOwnPropertyDescriptor(global, 'DataView').hasOwnProperty('get') is false
PASS Object.getOwnPropertyDescriptor(global, 'DataView').hasOwnProperty('set') is false
PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').hasOwnProperty('set') is false
PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').enumerable is false
PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').value is DataTransferItem
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').value is DataTransferItemList
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').configurable is true
PASS Object.getOwnPropertyDescriptor(global, 'DataView').value is DataView
PASS Object.getOwnPropertyDescriptor(global, 'DataView').hasOwnProperty('get') is false
PASS Object.getOwnPropertyDescriptor(global, 'DataView').hasOwnProperty('set') is false
PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').hasOwnProperty('set') is false
PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').enumerable is false
PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').value is DataTransferItem
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').value is DataTransferItemList
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').configurable is true
PASS Object.getOwnPropertyDescriptor(global, 'DataView').value is DataView
PASS Object.getOwnPropertyDescriptor(global, 'DataView').hasOwnProperty('get') is false
PASS Object.getOwnPropertyDescriptor(global, 'DataView').hasOwnProperty('set') is false
fast/repaint/overflow-scroll-touch-repaint.html [ Skip ]
# TODO Drag & Drop doesn't work correctly in DRT <rdar://5621244>
+editing/pasteboard/datatransfer-items-drop-plaintext-file.html
fast/events/drop-handler-should-not-stop-navigate.html [ Skip ]
fast/events/drag-in-frames.html [ Skip ]
fast/events/drag-to-navigate.html [ Skip ]
# WebKitTestRunner needs an implementation of eventSender.beginDragWithFiles
# https://bugs.webkit.org/show_bug.cgi?id=64285
+editing/pasteboard/datatransfer-items-drop-plaintext-file.html
editing/pasteboard/file-drag-to-editable.html [ Skip ]
editing/pasteboard/file-input-files-access.html
fast/dom/FileList-iterator.html
PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').hasOwnProperty('set') is false
PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').enumerable is false
PASS Object.getOwnPropertyDescriptor(global, 'DataTransfer').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').value is DataTransferItem
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItem').configurable is true
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').value is DataTransferItemList
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').hasOwnProperty('get') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').hasOwnProperty('set') is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').enumerable is false
+PASS Object.getOwnPropertyDescriptor(global, 'DataTransferItemList').configurable is true
PASS Object.getOwnPropertyDescriptor(global, 'DataView').value is DataView
PASS Object.getOwnPropertyDescriptor(global, 'DataView').hasOwnProperty('get') is false
PASS Object.getOwnPropertyDescriptor(global, 'DataView').hasOwnProperty('set') is false
+2017-08-15 Ryosuke Niwa <rniwa@webkit.org>
+
+ Make DataTransferItemList work with plain text entries
+ https://bugs.webkit.org/show_bug.cgi?id=175596
+
+ Reviewed by Wenson Hsieh.
+
+ Added DataTransferItem as a common identifier since it's a runtime enabled feature.
+
+ * runtime/CommonIdentifiers.h:
+
2017-08-15 Robin Morisset <rmorisset@apple.com>
Support the 'with' keyword in FTL
macro(CustomElementRegistry) \
macro(Date) \
macro(DateTimeFormat) \
+ macro(DataTransferItem) \
macro(DataTransferItemList) \
macro(DocumentTimeline) \
macro(Error) \
+2017-08-15 Ryosuke Niwa <rniwa@webkit.org>
+
+ Make DataTransferItemList work with plain text entries
+ https://bugs.webkit.org/show_bug.cgi?id=175596
+
+ Reviewed by Wenson Hsieh.
+
+ Added the basic machinery to get the list of plain text items to DataTransferItemList and DataTransferItem.
+
+ Each DataTransferItem now depends on DataTransfer so it does ref-forwarding like DataTransferItemList to make
+ DataTransfer alive as long as any DataTransferItem is alive.
+
+ Specifications: https://html.spec.whatwg.org/multipage/dnd.html#the-datatransferitem-interface
+ https://html.spec.whatwg.org/multipage/dnd.html#the-datatransferitemlist-interface
+
+ Tests: editing/pasteboard/datatransfer-items-drop-plaintext-file.html
+ editing/pasteboard/datatransfer-items-paste-plaintext.html
+
+ * dom/DataTransferItem.cpp:
+ (WebCore::DataTransferItem::DataTransferItem): Added two variants one for plain text and another one for a file.
+ (WebCore::DataTransferItem::kind const): Rewritten.
+ (WebCore::DataTransferItem::getAsString const): Implemented.
+ (WebCore::DataTransferItem::getAsFile const): Implemented.
+ * dom/DataTransferItem.h:
+ (WebCore::DataTransferItem::ref): Added.
+ (WebCore::DataTransferItem::deref): Added.
+ (WebCore::DataTransferItem::type const): Returns String instead of AtomicString.
+ (WebCore::DataTransferItem::kind const): Moved to cpp.
+ * dom/DataTransferItem.idl: Removed NoInterfaceObject since the interface object should exist on DOMWindow.
+ * dom/DataTransferItemList.cpp:
+ (WebCore::DataTransferItemList::length): Implemented.
+ (WebCore::DataTransferItemList::item): Ditto.
+ (WebCore::isSupportedType): Added. For now, we only support text/plain.
+ (WebCore::DataTransferItemList::ensureItems): Added. Constructs the list of DataTransferItems.
+ * dom/DataTransferItemList.h:
+ (DataTransferItemList): Added m_items. The list is filled lazily by ensureItems.
+ * dom/DataTransferItemList.idl: Removed NoInterfaceObject since the interface object should exist on DOMWindow.
+
2017-08-15 Simon Fraser <simon.fraser@apple.com>
Remove ScrollView::clipsRepaints() which was only used by Chromium
#include "config.h"
#include "DataTransferItem.h"
-#include "Blob.h"
+#include "File.h"
+#include "ScriptExecutionContext.h"
#include "StringCallback.h"
namespace WebCore {
-DataTransferItem::DataTransferItem()
+DataTransferItem::DataTransferItem(DataTransfer& dataTransfer, const String& type)
+ : m_dataTransfer(dataTransfer)
+ , m_type(type)
+{
+}
+
+DataTransferItem::DataTransferItem(DataTransfer& dataTransfer, const String& type, Ref<File>&& file)
+ : m_dataTransfer(dataTransfer)
+ , m_type(type)
+ , m_file(WTFMove(file))
{
}
{
}
-void DataTransferItem::getAsString(RefPtr<StringCallback>&&) const
+String DataTransferItem::kind() const
{
+ return m_file ? ASCIILiteral("file") : ASCIILiteral("string");
+}
+
+void DataTransferItem::getAsString(ScriptExecutionContext& context, RefPtr<StringCallback>&& callback) const
+{
+ if (!callback || !m_dataTransfer.canReadData() || m_file)
+ return;
+
+ // FIXME: Make this async.
+ callback->scheduleCallback(context, m_dataTransfer.getData(m_type));
}
-RefPtr<Blob> DataTransferItem::getAsFile() const
+RefPtr<File> DataTransferItem::getAsFile() const
{
- return nullptr;
+ if (!m_dataTransfer.canReadData())
+ return nullptr;
+ return m_file.copyRef();
}
} // namespace WebCore
#pragma once
+#include "DataTransfer.h"
+#include "ScriptWrappable.h"
#include <wtf/Forward.h>
#include <wtf/RefCounted.h>
#include <wtf/text/AtomicString.h>
namespace WebCore {
-class Blob;
+class File;
+class ScriptExecutionContext;
class StringCallback;
-class DataTransferItem : public RefCounted<DataTransferItem> {
+class DataTransferItem : public ScriptWrappable {
+ WTF_MAKE_NONCOPYABLE(DataTransferItem); WTF_MAKE_FAST_ALLOCATED;
public:
- DataTransferItem();
+ DataTransferItem(DataTransfer&, const String&);
+ DataTransferItem(DataTransfer&, const String&, Ref<File>&&);
~DataTransferItem();
- const AtomicString& kind() const { return m_kind; }
- const AtomicString& type() const { return m_type; }
- void getAsString(RefPtr<StringCallback>&&) const;
- RefPtr<Blob> getAsFile() const;
+ // DataTransfer owns DataTransferItem, and DataTransfer is kept alive as long as DataTransferItem is alive.
+ void ref() { m_dataTransfer.ref(); }
+ void deref() { m_dataTransfer.deref(); }
+
+ String kind() const;
+ const String& type() const { return m_type; }
+ void getAsString(ScriptExecutionContext&, RefPtr<StringCallback>&&) const;
+ RefPtr<File> getAsFile() const;
private:
- AtomicString m_kind;
- AtomicString m_type;
+ DataTransfer& m_dataTransfer;
+ const String m_type;
+ RefPtr<File> m_file;
};
}
*/
[
- NoInterfaceObject,
EnabledAtRuntime=DataTransferItems,
ImplementationLacksVTable,
] interface DataTransferItem {
readonly attribute DOMString kind;
readonly attribute DOMString type;
- void getAsString(optional StringCallback? callback);
- Blob getAsFile();
+ [CallWith=ScriptExecutionContext] void getAsString(StringCallback? callback);
+ File getAsFile();
};
#include "DataTransferItemList.h"
#include "DataTransferItem.h"
+#include "FileList.h"
namespace WebCore {
unsigned DataTransferItemList::length() const
{
- return 0;
+ return ensureItems().size();
}
-RefPtr<DataTransferItem> DataTransferItemList::item(unsigned)
+RefPtr<DataTransferItem> DataTransferItemList::item(unsigned index)
{
- return nullptr;
+ auto& items = ensureItems();
+ if (items.size() <= index)
+ return nullptr;
+ return items[index].get();
}
ExceptionOr<void> DataTransferItemList::add(const String&, const String&)
{
}
+// FIXME: DataTransfer should filter types itself.
+static bool isSupportedType(const String& type)
+{
+ return equalIgnoringASCIICase(type, "text/plain");
+}
+
+Vector<std::unique_ptr<DataTransferItem>>& DataTransferItemList::ensureItems() const
+{
+ if (m_items)
+ return *m_items;
+
+ Vector<std::unique_ptr<DataTransferItem>> items;
+ for (String& type : m_dataTransfer.types()) {
+ if (isSupportedType(type))
+ items.append(std::make_unique<DataTransferItem>(m_dataTransfer, type));
+ }
+
+ FileList& files = m_dataTransfer.files();
+ for (unsigned i = 0, length = files.length(); i < length; ++i) {
+ File& file = *files.item(i);
+ String type = File::contentTypeForFile(file.path());
+ if (isSupportedType(type))
+ items.append(std::make_unique<DataTransferItem>(m_dataTransfer, type, file));
+ }
+
+
+ m_items = WTFMove(items);
+
+ return *m_items;
+}
+
}
#pragma once
#include "DataTransfer.h"
+#include "DataTransferItem.h"
#include "ExceptionOr.h"
+#include "ScriptWrappable.h"
#include <wtf/Forward.h>
#include <wtf/RefCounted.h>
namespace WebCore {
-class DataTransferItem;
class File;
-class DataTransferItemList {
+class DataTransferItemList : public ScriptWrappable {
WTF_MAKE_NONCOPYABLE(DataTransferItemList); WTF_MAKE_FAST_ALLOCATED;
public:
DataTransferItemList(DataTransfer& dataTransfer)
void clear();
private:
+ Vector<std::unique_ptr<DataTransferItem>>& ensureItems() const;
+
DataTransfer& m_dataTransfer;
+ mutable std::optional<Vector<std::unique_ptr<DataTransferItem>>> m_items;
};
} // namespace WebCore
*/
[
- NoInterfaceObject,
EnabledAtRuntime=DataTransferItems,
JSGenerateToNativeObject,
JSGenerateToJSObject,