| <!DOCTYPE html> |
| <html> |
| <body> |
| <div id="container"> |
| <div id="destination">3. Drop here</div> |
| </div> |
| <div id="description"></div> |
| <div id="console"></div> |
| <script src="../../resources/js-test-pre.js"></script> |
| <script> |
| |
| description('This tests calling setData to set a URL in a null origin document. The URL should be sanitized when reading in another document.<br>' |
| + 'To manually test, drag and drop the "1. Drag this" above to "2. Drop here" and "3. Drop here".'); |
| jsTestIsAsync = true; |
| |
| if (window.internals) |
| internals.settings.setCustomPasteboardDataEnabled(true); |
| |
| const iframe = document.createElement('iframe'); |
| const destination = document.getElementById('destination'); |
| document.getElementById('container').prepend(iframe); |
| |
| iframe.src = `data:text/html;charset=utf-8,<!DOCTYPE html> |
| <div id="source" draggable="true" data-value="http://webkit.org/b/🤔?x=8 + 6">1. Drag this</div> |
| <div id="destination" onpaste="paste(event)">2. Drop here</div> |
| <script> |
| |
| const source = document.getElementById('source'); |
| const destination = document.getElementById('destination'); |
| const originalURL = source.dataset.value; |
| parent.postMessage({kind: 'originalURL', originalURL}, '*'); |
| |
| function postContent(kind, dataTransfer) { |
| parent.postMessage({ |
| kind, |
| documentLabel: 'the null origin document', |
| url: dataTransfer.getData('url'), |
| html: dataTransfer.getData('text/html'), |
| types: dataTransfer.types, |
| items: Array.from(dataTransfer.items).map((item) => ({kind: item.kind, type: item.type})), |
| }, '*'); |
| } |
| |
| let postDragOver; |
| source.addEventListener("dragstart", (event) => { |
| postDragOver = false; |
| event.dataTransfer.setData('url', originalURL); |
| event.dataTransfer.setData('text/html', 'testing'); |
| postContent('dragstart', event.dataTransfer); |
| }); |
| destination.addEventListener("dragover", (event) => { |
| event.preventDefault(); |
| if (postDragOver) |
| return; |
| postDragOver = true; |
| postContent('dragover', event.dataTransfer); |
| }); |
| destination.addEventListener("drop", (event) => { |
| postContent('drop', event.dataTransfer); |
| destination.remove(); |
| top.postMessage({kind: 'secondDrop'}, '*'); |
| }); |
| |
| if (window.eventSender) { |
| const iframeOffset = {x: 10, y: 10}; |
| eventSender.mouseMoveTo(iframeOffset.x + source.offsetLeft + 5, iframeOffset.y + source.offsetTop + 5); |
| eventSender.mouseDown(); |
| eventSender.leapForward(500); |
| eventSender.mouseMoveTo(iframeOffset.x + destination.offsetLeft + 5, iframeOffset.y + destination.offsetTop + 5); |
| eventSender.mouseUp(); |
| } |
| |
| </scri` + 'pt>'; |
| |
| onmessage = (event) => { |
| const kind = event.data.kind; |
| if (kind == 'originalURL') { |
| originalURL = event.data.originalURL; |
| return; |
| } |
| if (kind == 'secondDrop') |
| return doSecondDrop(event.data.postContent); |
| debug(`${kind} in ${event.data.documentLabel}:`); |
| switch (kind) { |
| case 'dragstart': |
| url = event.data.url; |
| shouldBeEqualToString('url', originalURL); |
| html = event.data.html; |
| shouldBeEqualToString('html', "testing"); |
| types = event.data.types; |
| shouldBeEqualToString('JSON.stringify(types)', '["text/uri-list","text/html"]'); |
| items = event.data.items; |
| shouldBeEqualToString('JSON.stringify(items)', '[{"kind":"string","type":"text/uri-list"},{"kind":"string","type":"text/html"}]'); |
| break; |
| case 'dragover': |
| url = event.data.url; |
| shouldBeEqualToString('url', ''); |
| html = event.data.html; |
| shouldBeEqualToString('html', ''); |
| types = event.data.types; |
| shouldBeEqualToString('JSON.stringify(types)', '["text/uri-list","text/html"]'); |
| items = event.data.items; |
| shouldBeEqualToString('JSON.stringify(items)', '[{"kind":"string","type":"text/uri-list"},{"kind":"string","type":"text/html"}]'); |
| break; |
| case 'drop': |
| url = event.data.url; |
| isSameOrigin = event.data.documentLabel.includes('null'); |
| shouldBeEqualToString('url', isSameOrigin ? originalURL : (new URL(originalURL)).href); |
| html = event.data.html; |
| if (isSameOrigin) |
| shouldBeEqualToString('html', 'testing'); |
| else |
| shouldBeTrue('html.includes("testing")'); |
| types = event.data.types; |
| shouldBeEqualToString('JSON.stringify(types)', '["text/uri-list","text/html"]'); |
| items = event.data.items; |
| shouldBeEqualToString('JSON.stringify(items)', '[{"kind":"string","type":"text/uri-list"},{"kind":"string","type":"text/html"}]'); |
| if (!event.data.documentLabel.includes('null')) { |
| document.getElementById('container').remove(); |
| finishJSTest(); |
| } |
| break; |
| } |
| debug(''); |
| } |
| |
| function postContent(kind, dataTransfer) { |
| window.postMessage({ |
| kind, |
| documentLabel: 'the file URL document', |
| url: dataTransfer.getData('url'), |
| html: dataTransfer.getData('text/html'), |
| types: dataTransfer.types, |
| items: Array.from(dataTransfer.items).map((item) => ({kind: item.kind, type: item.type})), |
| }, '*'); |
| } |
| |
| let postDragOver = false; |
| destination.addEventListener("dragover", (event) => { |
| event.preventDefault(); |
| if (postDragOver) |
| return; |
| postDragOver = true; |
| postContent('dragover', event.dataTransfer); |
| }); |
| destination.addEventListener("drop", (event) => { |
| postContent('drop', event.dataTransfer); |
| }); |
| |
| function doSecondDrop(postContent) { |
| postDragOver = false; |
| if (!window.eventSender) |
| return; |
| |
| eventSender.leapForward(500); |
| eventSender.mouseMoveTo(iframe.offsetLeft + 10, iframe.offsetTop + 10); |
| eventSender.mouseDown(); |
| eventSender.leapForward(500); |
| |
| const destinationRect = destination.getBoundingClientRect(); |
| eventSender.mouseMoveTo(destination.offsetLeft + 5, destination.offsetTop + 5); |
| eventSender.mouseUp(); |
| } |
| |
| </script> |
| <script src="../../resources/js-test-post.js"></script> |
| </body> |
| </html> |