| <!DOCTYPE html> <!-- webkit-test-runner [ domPasteAllowed=false useFlexibleViewport=true ignoreSynchronousMessagingTimeouts=true ] --> |
| <html> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| <head> |
| <script src="./resources/dom-paste-helper.js"></script> |
| <script src="../../../resources/js-test.js"></script> |
| <script src="../../../resources/ui-helper.js"></script> |
| <style> |
| body { |
| margin: 0; |
| } |
| |
| #copy { |
| width: 100%; |
| height: 50px; |
| border: 1px dashed black; |
| } |
| |
| #editor { |
| width: 100%; |
| height: 100px; |
| border: 1px dashed silver; |
| text-align: center; |
| } |
| </style> |
| </head> |
| <body> |
| <div id="editor" contenteditable></div> |
| <iframe id="copy" src="data:text/html,<div id='copy' style='font-size: 40px; text-align: center;'>Click here to copy</div> |
| <script> |
| copy.addEventListener('click', () => { |
| getSelection().selectAllChildren(copy); |
| document.execCommand('Copy'); |
| getSelection().removeAllRanges(); |
| }); |
| </script>"></iframe> |
| <div id="description"></div> |
| <div id="console"></div> |
| <script> |
| jsTestIsAsync = true; |
| |
| const editor = document.getElementById("editor"); |
| |
| description("Verifies that no menu is shown when the page programmatically triggers paste on a timer after user interaction. To test manually, click or tap the text on the bottom to copy, and then click or tap the editable area above to trigger two programmatic pastes with the menu. Check that permissions for the first programmatic paste do not affect the second programmatic paste, since it is performed on a zero-delay timer."); |
| |
| async function waitForAndTapPasteMenuTwice() { |
| return new Promise(resolve => { |
| testRunner.runUIScript(` |
| (() => { |
| doneCount = 0; |
| function incrementProgress() { |
| if (++doneCount === 5) |
| uiController.uiScriptComplete(); |
| } |
| |
| uiController.didHideMenuCallback = incrementProgress; |
| uiController.didShowMenuCallback = tapPasteMenuAction; |
| |
| function tapPasteMenuAction() { |
| uiController.chooseMenuAction("Paste", incrementProgress); |
| } |
| |
| uiController.activateAtPoint(160, 50, incrementProgress); |
| })()`, resolve); |
| }); |
| } |
| |
| function paste() { |
| getSelection().setPosition(editor); |
| shouldBe("document.execCommand('Paste')", "true"); |
| shouldBeEqualToString("editor.textContent", "Click here to copy"); |
| editor.textContent = ""; |
| getSelection().removeAllRanges(editor); |
| } |
| |
| editor.addEventListener("click", event => { |
| event.preventDefault(); |
| paste(); |
| setTimeout(paste, 0); |
| }); |
| |
| addEventListener("load", async () => { |
| if (!window.testRunner || !window.internals) |
| return; |
| |
| await UIHelper.activateAt(160, 125); |
| await waitForAndTapPasteMenuTwice(); |
| finishJSTest(); |
| }); |
| </script> |
| </body> |
| </html> |