Files
tubestation/dom/browser-element/mochitest/browserElement_CopyPaste.js
Yoshi Huang d563322200 Bug 1196665 - Add originAttributes into SpecialPowers. r=bholley
From 7bb0fbba24f4f65d3fa83efe223b1431cd71fdb6 Mon Sep 17 00:00:00 2001
---
 dom/apps/tests/test_third_party_homescreen.html    |   8 +-
 .../test/test_messagemanager_assertpermission.html |   4 +-
 dom/base/test/test_messagemanager_targetchain.html |  16 +--
 ...rowserElement_AllowEmbedAppsInNestedOOIframe.js |  11 +-
 .../mochitest/browserElement_CopyPaste.js          |   9 +-
 .../browserElement_DisallowEmbedAppsInOOP.js       |   9 +-
 .../mochitest/browserElement_Proxy.js              |  10 +-
 .../browserElement_SetInputMethodActive.js         |   3 +-
 .../mochitest/browserElement_SetVisibleFrames.js   |  17 ++--
 .../mochitest/browserElement_SetVisibleFrames2.js  |  16 +--
 .../priority/test_ExpectingSystemMessage2.html     |  16 +--
 .../mochitest/priority/test_NestedFrames.html      |  16 +--
 dom/cache/test/mochitest/driver.js                 |  11 +-
 .../test/mochitest/test_cache_orphaned_body.html   |  33 +-----
 .../test/mochitest/test_cache_orphaned_cache.html  |  33 +-----
 dom/cache/test/mochitest/test_cache_restart.html   |  11 +-
 dom/cache/test/mochitest/test_cache_shrink.html    |  33 +-----
 dom/indexedDB/test/file.js                         |  12 +--
 dom/indexedDB/test/helpers.js                      |   9 +-
 dom/indexedDB/test/webapp_clearBrowserData.js      |   6 +-
 dom/inputmethod/mochitest/test_bug1043828.html     |   5 +-
 dom/inputmethod/mochitest/test_bug944397.html      |   5 +-
 .../mochitest/test_focus_blur_manage_events.html   |   5 +-
 .../mochitest/test_input_registry_events.html      |   5 +-
 .../mochitest/test_simple_manage_events.html       |   5 +-
 .../tests/test_permission_for_nested_oop_app.html  |   3 +-
 .../tests/test_permission_for_two_oop_apps.html    |   3 +-
 dom/ipc/tests/test_permission_helper.js            |  21 ++--
 .../test_permission_when_oop_app_crashes.html      |   3 +-
 dom/tv/test/mochitest/head.js                      |   5 +-
 .../test_SpecialPowersPushAppPermissions.html      |  14 ++-
 .../tests/Harness_sanity/test_bug816847.html       |   6 +-
 .../components/SpecialPowersObserver.js            |   4 +-
 .../content/SpecialPowersObserverAPI.js            |  24 +----
 testing/specialpowers/content/specialpowersAPI.js  | 111 ++++++++-------------
 35 files changed, 173 insertions(+), 329 deletions(-)
2015-10-07 14:35:43 +08:00

357 lines
12 KiB
JavaScript

/* Any copyright is dedicated to the public domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
// Test that "cut, copy, paste, selectall" and selectionstatechanged event works from inside an <iframe mozbrowser>.
"use strict";
SimpleTest.waitForExplicitFinish();
SimpleTest.requestFlakyTimeout("untriaged");
SimpleTest.requestLongerTimeout(2); // slow on android
browserElementTestHelpers.setEnabledPref(true);
browserElementTestHelpers.setSelectionChangeEnabledPref(false);
browserElementTestHelpers.setAccessibleCaretEnabledPref(true);
browserElementTestHelpers.addPermission();
const { Services } = SpecialPowers.Cu.import('resource://gre/modules/Services.jsm');
var gTextarea = null;
var mm;
var iframeOuter;
var iframeInner;
var state = 0;
var stateMeaning;
var defaultData;
var pasteData;
var focusScript;
var createEmbededFrame = false;
var testSelectionChange = false;
function copyToClipboard(str) {
gTextarea.value = str;
SpecialPowers.wrap(gTextarea).editor.selectAll();
SpecialPowers.wrap(gTextarea).editor.copy();
}
function getScriptForGetContent() {
var script = 'data:,\
var elt = content.document.getElementById("text"); \
var txt = ""; \
if (elt) { \
if (elt.tagName === "DIV" || elt.tagName === "BODY") { \
txt = elt.textContent; \
} else { \
txt = elt.value; \
} \
} \
sendAsyncMessage("content-text", txt);';
return script;
}
function getScriptForSetFocus() {
var script = 'data:,' + focusScript + 'sendAsyncMessage("content-focus")';
return script;
}
function runTest() {
iframeOuter = document.createElement('iframe');
iframeOuter.setAttribute('mozbrowser', 'true');
if (createEmbededFrame) {
iframeOuter.src = "file_empty.html";
}
document.body.appendChild(iframeOuter);
gTextarea = document.createElement('textarea');
document.body.appendChild(gTextarea);
iframeOuter.addEventListener("mozbrowserloadend", function onloadend(e) {
iframeOuter.removeEventListener("mozbrowserloadend", onloadend);
if (createEmbededFrame) {
var contentWin = SpecialPowers.wrap(iframeOuter)
.QueryInterface(SpecialPowers.Ci.nsIFrameLoaderOwner)
.frameLoader.docShell.contentViewer.DOMDocument.defaultView;
var contentDoc = contentWin.document;
iframeInner = contentDoc.createElement('iframe');
iframeInner.setAttribute('mozbrowser', true);
iframeInner.setAttribute('remote', 'false');
contentDoc.body.appendChild(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: SpecialPowers.unwrap(iframeInner)},
'copypaste-docommand', cmd);
}
function rerunTest() {
// clean up and run test again.
document.body.removeChild(iframeOuter);
document.body.removeChild(gTextarea);
state = 0;
runTest();
}
function dispatchTest(e) {
iframeInner.addEventListener("mozbrowserloadend", function onloadend2(e) {
iframeInner.removeEventListener("mozbrowserloadend", onloadend2);
iframeInner.focus();
SimpleTest.executeSoon(function() { testSelectAll(e); });
});
switch (state) {
case 0: // test for textarea
defaultData = "Test for selection change event";
pasteData = "from parent ";
iframeInner.src = "data:text/html,<html><body>" +
"<textarea id='text'>" + defaultData + "</textarea>" +
"</body>" +
"</html>";
stateMeaning = " (test: textarea)";
focusScript = "var elt=content.document.getElementById('text');elt.focus();elt.select();";
break;
case 1: // test for input text
defaultData = "Test for selection change event";
pasteData = "from parent ";
iframeInner.src = "data:text/html,<html><body>" +
"<input type='text' id='text' value='" + defaultData + "'>" +
"</body>" +
"</html>";
stateMeaning = " (test: <input type=text>)";
focusScript = "var elt=content.document.getElementById('text');elt.focus();elt.select();";
break;
case 2: // test for input number
defaultData = "12345";
pasteData = "67890";
iframeInner.src = "data:text/html,<html><body>" +
"<input type='number' id='text' value='" + defaultData + "'>" +
"</body>" +
"</html>";
stateMeaning = " (test: <input type=number>)";
focusScript = "var elt=content.document.getElementById('text');elt.focus();elt.select();";
break;
case 3: // test for div contenteditable
defaultData = "Test for selection change event";
pasteData = "from parent ";
iframeInner.src = "data:text/html,<html><body>" +
"<div contenteditable='true' id='text'>" + defaultData + "</div>" +
"</body>" +
"</html>";
stateMeaning = " (test: content editable div)";
focusScript = "var elt=content.document.getElementById('text');elt.focus();";
break;
case 4: // test for normal div
defaultData = "Test for selection change event";
pasteData = "from parent ";
iframeInner.src = "data:text/html,<html><body>" +
"<div id='text'>" + defaultData + "</div>" +
"</body>" +
"</html>";
stateMeaning = " (test: normal div)";
focusScript = "var elt=content.document.getElementById('text');elt.focus();";
break;
case 5: // test for normal div with designMode:on
defaultData = "Test for selection change event";
pasteData = "from parent ";
iframeInner.src = "data:text/html,<html><body id='text'>" +
defaultData +
"</body>" +
"<script>document.designMode='on';</script>" +
"</html>";
stateMeaning = " (test: normal div with designMode:on)";
focusScript = "var elt=content.document.getElementById('text');elt.focus();";
break;
default:
if (createEmbededFrame || browserElementTestHelpers.getOOPByDefaultPref()) {
if (testSelectionChange) {
SimpleTest.finish();
return;
} else {
testSelectionChange = true;
createEmbededFrame = false;
SpecialPowers.pushPrefEnv(
{'set':
[['selectioncaret.enabled', true],
['layout.accessiblecaret.enabled', false]]},
function() {
rerunTest();
});
}
} else {
createEmbededFrame = true;
rerunTest();
}
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) {
// Skip mozbrowser test if we're at child process.
if (!isChildProcess()) {
let eventName = testSelectionChange ? "mozbrowserselectionstatechanged" : "mozbrowsercaretstatechanged";
iframeOuter.addEventListener(eventName, function selectchangeforselectall(e) {
if (!e.detail.states || e.detail.states.indexOf('selectall') == 0) {
iframeOuter.removeEventListener(eventName, 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);
if (testSelectionChange) {
ok(e.detail.states, "event.detail.state " + e.detail.states);
}
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);
}
function testCopy1(e) {
// Right now we're at "selectall" state, so we can test copy commnad by
// calling doCommand
copyToClipboard("");
let setup = function() {
doCommand("copy");
};
let nextTest = function(success) {
ok(success, "copy command works" + stateMeaning);
SimpleTest.executeSoon(function() { testPaste1(e); });
};
let success = function() {
nextTest(true);
}
let fail = function() {
nextTest(false);
}
let compareData = defaultData;
SimpleTest.waitForClipboard(compareData, setup, success, fail);
}
function testPaste1(e) {
// Next test paste command, first we copy to global clipboard in parent side.
// Then paste it to child side.
copyToClipboard(pasteData);
doCommand('selectall');
doCommand("paste");
SimpleTest.executeSoon(function() { testPaste2(e); });
}
function testPaste2(e) {
mm.addMessageListener('content-text', function messageforpaste(msg) {
mm.removeMessageListener('content-text', messageforpaste);
if (state == 4) {
// normal div cannot paste, so the content remain unchange
ok(SpecialPowers.wrap(msg).json === defaultData, "paste command works" + stateMeaning);
} else if (state == 3 && browserElementTestHelpers.getOOPByDefaultPref()) {
// Something weird when we doCommand with content editable element in OOP. Mark this case as todo
todo(false, "paste command works" + stateMeaning);
} else {
ok(SpecialPowers.wrap(msg).json === pasteData, "paste command works" + stateMeaning);
}
SimpleTest.executeSoon(function() { testCut1(e); });
});
mm.loadFrameScript(getScriptForGetContent(), false);
}
function testCut1(e) {
// Clean clipboard first
copyToClipboard("");
let setup = function() {
doCommand("selectall");
doCommand("cut");
};
let nextTest = function(success) {
if (state == 3 && browserElementTestHelpers.getOOPByDefaultPref()) {
// Something weird when we doCommand with content editable element in OOP.
todo(false, "cut function works" + stateMeaning);
} else {
ok(success, "cut function works" + stateMeaning);
}
SimpleTest.executeSoon(function() { testCut2(e); });
};
let success = function() {
nextTest(true);
}
let fail = function() {
nextTest(false);
}
let compareData = pasteData;
// 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; }
}
SimpleTest.waitForClipboard(compareData, setup, success, fail);
}
function testCut2(e) {
mm.addMessageListener('content-text', function messageforcut(msg) {
mm.removeMessageListener('content-text', messageforcut);
// normal div cannot cut
if (state == 4) {
ok(SpecialPowers.wrap(msg).json !== "", "cut command works" + stateMeaning);
} else if (state == 3 && browserElementTestHelpers.getOOPByDefaultPref()) {
// Something weird when we doCommand with content editable element in OOP. Mark this case as todo
todo(false, "cut command works" + stateMeaning);
} else {
ok(SpecialPowers.wrap(msg).json === "", "cut command works" + stateMeaning);
}
state++;
dispatchTest(e);
});
mm.loadFrameScript(getScriptForGetContent(), false);
}
// 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,
originAttributes: {
appId: principal.appId,
inBrowser: true }};
addEventListener('testready', function() {
SpecialPowers.pushPermissions([
{type: 'browser', allow: 1, context: context}
], runTest);
});