diff --git a/dom/browser-element/mochitest/browserElement_CopyPaste.js b/dom/browser-element/mochitest/browserElement_CopyPaste.js index 39989b25503b..a5f625f93018 100644 --- a/dom/browser-element/mochitest/browserElement_CopyPaste.js +++ b/dom/browser-element/mochitest/browserElement_CopyPaste.js @@ -10,14 +10,17 @@ browserElementTestHelpers.setEnabledPref(true); browserElementTestHelpers.setSelectionChangeEnabledPref(true); browserElementTestHelpers.addPermission(); const { Services } = SpecialPowers.Cu.import('resource://gre/modules/Services.jsm'); + var gTextarea = null; var mm; -var iframe; +var iframeOuter; +var iframeInner; var state = 0; var stateMeaning; var defaultData; var pasteData; var focusScript; +var createEmbededFrame = false; function copyToClipboard(str) { gTextarea.value = str; @@ -46,30 +49,47 @@ function getScriptForSetFocus() { } function runTest() { - iframe = document.createElement('iframe'); - iframe.setAttribute('mozbrowser', 'true'); - document.body.appendChild(iframe); + iframeOuter = document.createElement('iframe'); + iframeOuter.setAttribute('mozbrowser', 'true'); + if (createEmbededFrame) { + iframeOuter.src = "file_NestedFramesOuter_CopyPaste.html"; + } + document.body.appendChild(iframeOuter); gTextarea = document.createElement('textarea'); document.body.appendChild(gTextarea); - mm = SpecialPowers.getBrowserFrameMessageManager(iframe); + iframeOuter.addEventListener("mozbrowserloadend", function onloadend(e) { + iframeOuter.removeEventListener("mozbrowserloadend", onloadend); - iframe.addEventListener("mozbrowserloadend", function onloadend(e) { - iframe.removeEventListener("mozbrowserloadend", onloadend); - dispatchTest(e); + if (createEmbededFrame) { + var contentWin = SpecialPowers.wrap(iframeOuter) + .QueryInterface(SpecialPowers.Ci.nsIFrameLoaderOwner) + .frameLoader.docShell.contentViewer.DOMDocument.defaultView; + var contentDoc = contentWin.document; + iframeInner = contentDoc.getElementById('iframeInner'); + iframeInner.addEventListener("mozbrowserloadend", function onloadendinner(e) { + iframeInner.removeEventListener("mozbrowserloadend", onloadendinner); + mm = SpecialPowers.getBrowserFrameMessageManager(iframeInner); + dispatchTest(e); + }); + } else { + iframeInner = iframeOuter; + mm = SpecialPowers.getBrowserFrameMessageManager(iframeInner); + dispatchTest(e); + } }); } function doCommand(cmd) { - Services.obs.notifyObservers({wrappedJSObject: iframe}, + Services.obs.notifyObservers({wrappedJSObject: SpecialPowers.unwrap(iframeInner)}, 'copypaste-docommand', cmd); } function dispatchTest(e) { - iframe.addEventListener("mozbrowserloadend", function onloadend2(e) { - iframe.removeEventListener("mozbrowserloadend", onloadend2); - iframe.focus(); + iframeInner.addEventListener("mozbrowserloadend", function onloadend2(e) { + iframeInner.removeEventListener("mozbrowserloadend", onloadend2); + iframeInner.focus(); SimpleTest.executeSoon(function() { testSelectAll(e); }); }); @@ -77,7 +97,7 @@ function dispatchTest(e) { case 0: // test for textarea defaultData = "Test for selection change event"; pasteData = "from parent "; - iframe.src = "data:text/html," + + iframeInner.src = "data:text/html," + "" + "" + ""; @@ -87,7 +107,7 @@ function dispatchTest(e) { case 1: // test for input text defaultData = "Test for selection change event"; pasteData = "from parent "; - iframe.src = "data:text/html," + + iframeInner.src = "data:text/html," + "" + "" + ""; @@ -97,7 +117,7 @@ function dispatchTest(e) { case 2: // test for input number defaultData = "12345"; pasteData = "67890"; - iframe.src = "data:text/html," + + iframeInner.src = "data:text/html," + "" + "" + ""; @@ -107,7 +127,7 @@ function dispatchTest(e) { case 3: // test for div contenteditable defaultData = "Test for selection change event"; pasteData = "from parent "; - iframe.src = "data:text/html," + + iframeInner.src = "data:text/html," + "
" + defaultData + "
" + "" + ""; @@ -115,11 +135,9 @@ function dispatchTest(e) { focusScript = "var elt=content.document.getElementById('text');elt.focus();"; break; case 4: // test for normal div - SimpleTest.finish(); - return; defaultData = "Test for selection change event"; pasteData = "from parent "; - iframe.src = "data:text/html," + + iframeInner.src = "data:text/html," + "
" + defaultData + "
" + "" + ""; @@ -129,7 +147,7 @@ function dispatchTest(e) { case 5: // test for normal div with designMode:on defaultData = "Test for selection change event"; pasteData = "from parent "; - iframe.src = "data:text/html," + + iframeInner.src = "data:text/html," + defaultData + "" + "" + @@ -138,25 +156,47 @@ function dispatchTest(e) { focusScript = "var elt=content.document.getElementById('text');elt.focus();"; break; default: - SimpleTest.finish(); + if (createEmbededFrame || browserElementTestHelpers.getOOPByDefaultPref()) { + SimpleTest.finish(); + } else { + createEmbededFrame = true; + + // clean up and run test again. + document.body.removeChild(iframeOuter); + document.body.removeChild(gTextarea); + state = 0; + runTest(); + } break; } } +function isChildProcess() { + return SpecialPowers.Cc["@mozilla.org/xre/app-info;1"] + .getService(SpecialPowers.Ci.nsIXULRuntime) + .processType != SpecialPowers.Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT; +} + function testSelectAll(e) { - iframe.addEventListener("mozbrowserselectionstatechanged", function selectchangeforselectall(e) { - iframe.removeEventListener("mozbrowserselectionstatechanged", selectchangeforselectall, true); - ok(true, "got mozbrowserselectionstatechanged event." + stateMeaning); - ok(e.detail, "event.detail is not null." + stateMeaning); - ok(e.detail.width != 0, "event.detail.width is not zero" + stateMeaning); - ok(e.detail.height != 0, "event.detail.height is not zero" + stateMeaning); - SimpleTest.executeSoon(function() { testCopy1(e); }); - }, true); + // Skip mozbrowser test if we're at child process. + if (!isChildProcess()) { + iframeOuter.addEventListener("mozbrowserselectionstatechanged", function selectchangeforselectall(e) { + iframeOuter.removeEventListener("mozbrowserselectionstatechanged", selectchangeforselectall, true); + ok(true, "got mozbrowserselectionstatechanged event." + stateMeaning); + ok(e.detail, "event.detail is not null." + stateMeaning); + ok(e.detail.width != 0, "event.detail.width is not zero" + stateMeaning); + ok(e.detail.height != 0, "event.detail.height is not zero" + stateMeaning); + SimpleTest.executeSoon(function() { testCopy1(e); }); + }, true); + } mm.addMessageListener('content-focus', function messageforfocus(msg) { mm.removeMessageListener('content-focus', messageforfocus); // test selectall command, after calling this the selectionstatechanged event should be fired. doCommand('selectall'); + if (isChildProcess()) { + SimpleTest.executeSoon(function() { testCopy1(e); }); + } }); mm.loadFrameScript(getScriptForSetFocus(), false); @@ -242,9 +282,11 @@ function testCut1(e) { } let compareData = pasteData; - if (state == 3 && browserElementTestHelpers.getOOPByDefaultPref()) { - // Something weird when we doCommand with content editable element in OOP. - // Always true in this case + // Something weird when we doCommand with content editable element in OOP. + // Always true in this case + // Normal div case cannot cut, always true as well. + if ((state == 3 && browserElementTestHelpers.getOOPByDefaultPref()) || + state == 4) { compareData = function() { return true; } } @@ -271,4 +313,15 @@ function testCut2(e) { mm.loadFrameScript(getScriptForGetContent(), false); } -addEventListener('testready', runTest); +// Give our origin permission to open browsers, and remove it when the test is complete. +var principal = SpecialPowers.wrap(document).nodePrincipal; +var context = { 'url': SpecialPowers.wrap(principal.URI).spec, + 'appId': principal.appId, + 'isInBrowserElement': true }; + +addEventListener('testready', function() { + SpecialPowers.pushPermissions([ + {'type': 'browser', 'allow': 1, 'context': context} + ], runTest); +}); + diff --git a/dom/browser-element/mochitest/file_NestedFramesOuter_CopyPaste.html b/dom/browser-element/mochitest/file_NestedFramesOuter_CopyPaste.html new file mode 100644 index 000000000000..2ff4db12e23e --- /dev/null +++ b/dom/browser-element/mochitest/file_NestedFramesOuter_CopyPaste.html @@ -0,0 +1,21 @@ + + +

file_NestedFramesOuter_CopyPaste.html

+ + + diff --git a/dom/browser-element/mochitest/mochitest.ini b/dom/browser-element/mochitest/mochitest.ini index 50af96cd3f72..e61b0c95a3d0 100644 --- a/dom/browser-element/mochitest/mochitest.ini +++ b/dom/browser-element/mochitest/mochitest.ini @@ -113,6 +113,7 @@ support-files = file_inputmethod.html file_post_request.html file_wyciwyg.html + file_NestedFramesOuter_CopyPaste.html # Note: browserElementTestHelpers.js looks at the test's filename to determine # whether the test should be OOP. "_oop_" signals OOP, "_inproc_" signals in