blob: 58557c0e8db025fa924819eb2c65507ff25c34e0 [file] [log] [blame]
<!DOCTYPE html>
<html>
<body>
<script src="/resources/js-test-pre.js"></script>
<div id="container">
<style>
#container { position: relative; }
#container > div { position: relative; border: solid 1px black; width: 200px; height: 200px; }
</style>
<div id="source" contenteditable>
Drag this, <meta content="some secret"><!-- secret -->
<img onclick="dangerousCode()" src="resources/apple.gif"><br>
<iframe src="http://localhost:8000/security/clipboard/resources/content-to-copy.html" width=100 height=100></iframe>
</div>
<div id="destination" style="position: absolute; top: 0px; left: 220px; border-color: blue;" ondrop="doDrop(event)" contenteditable></div>
</div>
<p id="description"></p>
<div id="console"></div>
<script>
description('This tests draggin and dropping HTML by the default action. WebKit should not sanitize the HTML in the same document.<br>'
+ 'To manually test, drag & drop the content in the block above to the blue box on the right.');
jsTestIsAsync = true;
let loadCount = 0;
window.onmessage = (event) => {
if (!loadCount++)
runTest()
else
checkFrameAccess();
}
function runTest() {
document.getElementById('source').focus();
document.execCommand('selectAll');
if (window.testRunner) {
internals.settings.setCustomPasteboardDataEnabled(true);
const sourceRect = source.getBoundingClientRect();
const destinationRect = destination.getBoundingClientRect();
eventSender.mouseMoveTo(sourceRect.x + 10, sourceRect.y + 10);
eventSender.mouseDown();
eventSender.leapForward(500);
eventSender.mouseMoveTo(destinationRect.x + 10, destinationRect.y + 10);
eventSender.mouseUp();
}
}
function doDrop(event) {
shouldBeTrue('html = event.dataTransfer.getData("text/html"); html.includes("Drag this,")');
shouldBeTrue('destination.innerHTML = html; img = destination.querySelector("img"); !!img');
shouldBeEqualToString('new URL(img.src).protocol', 'http:');
shouldBeTrue('html.includes("http://localhost:8000/security/clipboard/resources/content-to-copy.html")');
shouldBeFalse('html.includes("secret")');
evalAndLog('destination.innerHTML = ""');
const observer = new MutationObserver((recordList) => {
for (const record of recordList) {
for (const node of record.addedNodes) {
if (node.nodeValue === null)
continue;
if (node.nodeValue.includes('secret'))
testFailed(`Saw secret in a node ${node}`);
if (node.nodeValue.includes('dangerousCode'))
testFailed(`Saw dangerous code in a node ${node}`);
}
}
});
observer.observe(destination, {childList: true, subtree: true});
}
function checkFrameAccess() {
shouldBeEqualToString('source.innerHTML', '');
shouldBeTrue('destination.textContent.includes("Drag this,")');
shouldBeFalse('destination.innerHTML.includes("secret")');
shouldBeFalse('destination.innerHTML.includes("dangerousCode")');
shouldBeTrue('destination.querySelector("img"); !!img');
shouldBeEqualToString('new URL(img.src).protocol', 'http:');
shouldBeNull('destination.querySelector("iframe").contentDocument');
if (window.testRunner)
container.remove();
finishJSTest();
}
var successfullyParsed = true;
</script>
<script src="/resources/js-test-post.js"></script>
</body>
</html>