summaryrefslogtreecommitdiffstats
path: root/toolkit/content/tests/chrome/file_autocomplete_with_composition.js
diff options
context:
space:
mode:
authorMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
committerMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
commit5f8de423f190bbb79a62f804151bc24824fa32d8 (patch)
tree10027f336435511475e392454359edea8e25895d /toolkit/content/tests/chrome/file_autocomplete_with_composition.js
parent49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff)
downloadUXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip
Add m-esr52 at 52.6.0
Diffstat (limited to 'toolkit/content/tests/chrome/file_autocomplete_with_composition.js')
-rw-r--r--toolkit/content/tests/chrome/file_autocomplete_with_composition.js540
1 files changed, 540 insertions, 0 deletions
diff --git a/toolkit/content/tests/chrome/file_autocomplete_with_composition.js b/toolkit/content/tests/chrome/file_autocomplete_with_composition.js
new file mode 100644
index 000000000..881e772ad
--- /dev/null
+++ b/toolkit/content/tests/chrome/file_autocomplete_with_composition.js
@@ -0,0 +1,540 @@
+// nsDoTestsForAutoCompleteWithComposition tests autocomplete with composition.
+// Users must include SimpleTest.js and EventUtils.js.
+
+function waitForCondition(condition, nextTest) {
+ var tries = 0;
+ var interval = setInterval(function() {
+ if (condition() || tries >= 30) {
+ moveOn();
+ }
+ tries++;
+ }, 100);
+ var moveOn = function() { clearInterval(interval); nextTest(); };
+}
+
+function nsDoTestsForAutoCompleteWithComposition(aDescription,
+ aWindow,
+ aTarget,
+ aAutoCompleteController,
+ aIsFunc,
+ aGetTargetValueFunc,
+ aOnFinishFunc)
+{
+ this._description = aDescription;
+ this._window = aWindow;
+ this._target = aTarget;
+ this._controller = aAutoCompleteController;
+
+ this._is = aIsFunc;
+ this._getTargetValue = aGetTargetValueFunc;
+ this._onFinish = aOnFinishFunc;
+
+ this._target.focus();
+
+ this._DefaultCompleteDefaultIndex =
+ this._controller.input.completeDefaultIndex;
+
+ this._doTests();
+}
+
+nsDoTestsForAutoCompleteWithComposition.prototype = {
+ _window: null,
+ _target: null,
+ _controller: null,
+ _DefaultCompleteDefaultIndex: false,
+ _description: "",
+
+ _is: null,
+ _getTargetValue: function () { return "not initialized"; },
+ _onFinish: null,
+
+ _doTests: function ()
+ {
+ if (++this._testingIndex == this._tests.length) {
+ this._controller.input.completeDefaultIndex =
+ this._DefaultCompleteDefaultIndex;
+ this._onFinish();
+ return;
+ }
+
+ var test = this._tests[this._testingIndex];
+ if (this._controller.input.completeDefaultIndex != test.completeDefaultIndex) {
+ this._controller.input.completeDefaultIndex = test.completeDefaultIndex;
+ }
+ test.execute(this._window);
+
+ waitForCondition(() => {
+ return this._controller.searchStatus >=
+ Components.interfaces.nsIAutoCompleteController.STATUS_COMPLETE_NO_MATCH;
+ },
+ this._checkResult.bind(this));
+ },
+
+ _checkResult: function ()
+ {
+ var test = this._tests[this._testingIndex];
+ this._is(this._getTargetValue(), test.value,
+ this._description + ", " + test.description + ": value");
+ this._is(this._controller.searchString, test.searchString,
+ this._description + ", " + test.description +": searchString");
+ this._is(this._controller.input.popupOpen, test.popup,
+ this._description + ", " + test.description + ": popupOpen");
+ this._doTests();
+ },
+
+ _testingIndex: -1,
+ _tests: [
+ // Simple composition when popup hasn't been shown.
+ // The autocomplete popup should not be shown during composition, but
+ // after compositionend, the popup should be shown.
+ { description: "compositionstart shouldn't open the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeCompositionChange(
+ { "composition":
+ { "string": "M",
+ "clauses":
+ [
+ { "length": 1, "attr": COMPOSITION_ATTR_RAW_CLAUSE }
+ ]
+ },
+ "caret": { "start": 1, "length": 0 },
+ "key": { key: "M", code: "KeyM", keyCode: KeyboardEvent.DOM_VK_M,
+ shiftKey: true },
+ }, aWindow);
+ }, popup: false, value: "M", searchString: ""
+ },
+ { description: "modifying composition string shouldn't open the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeCompositionChange(
+ { "composition":
+ { "string": "Mo",
+ "clauses":
+ [
+ { "length": 2, "attr": COMPOSITION_ATTR_RAW_CLAUSE }
+ ]
+ },
+ "caret": { "start": 2, "length": 0 },
+ "key": { key: "o", code: "KeyO", keyCode: KeyboardEvent.DOM_VK_O },
+ }, aWindow);
+ }, popup: false, value: "Mo", searchString: ""
+ },
+ { description: "compositionend should open the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeComposition({ type: "compositioncommitasis",
+ key: { key: "KEY_Enter", code: "Enter" } }, aWindow);
+ }, popup: true, value: "Mo", searchString: "Mo"
+ },
+ // If composition starts when popup is shown, the compositionstart event
+ // should cause closing the popup.
+ { description: "compositionstart should close the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeCompositionChange(
+ { "composition":
+ { "string": "z",
+ "clauses":
+ [
+ { "length": 1, "attr": COMPOSITION_ATTR_RAW_CLAUSE }
+ ]
+ },
+ "caret": { "start": 1, "length": 0 },
+ "key": { key: "z", code: "KeyZ", keyCode: KeyboardEvent.DOM_VK_Z },
+ }, aWindow);
+ }, popup: false, value: "Moz", searchString: "Mo"
+ },
+ { description: "modifying composition string shouldn't reopen the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeCompositionChange(
+ { "composition":
+ { "string": "zi",
+ "clauses":
+ [
+ { "length": 2, "attr": COMPOSITION_ATTR_RAW_CLAUSE }
+ ]
+ },
+ "caret": { "start": 2, "length": 0 },
+ "key": { key: "i", code: "KeyI", keyCode: KeyboardEvent.DOM_VK_I },
+ }, aWindow);
+ }, popup: false, value: "Mozi", searchString: "Mo"
+ },
+ { description: "compositionend should research the result and open the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeComposition({ type: "compositioncommitasis",
+ key: { key: "KEY_Enter", code: "Enter" } }, aWindow);
+ }, popup: true, value: "Mozi", searchString: "Mozi"
+ },
+ // If composition is cancelled, the value shouldn't be changed.
+ { description: "compositionstart should reclose the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeCompositionChange(
+ { "composition":
+ { "string": "l",
+ "clauses":
+ [
+ { "length": 1, "attr": COMPOSITION_ATTR_RAW_CLAUSE }
+ ]
+ },
+ "caret": { "start": 1, "length": 0 },
+ "key": { key: "l", code: "KeyL", keyCode: KeyboardEvent.DOM_VK_L },
+ }, aWindow);
+ }, popup: false, value: "Mozil", searchString: "Mozi"
+ },
+ { description: "modifying composition string shouldn't reopen the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeCompositionChange(
+ { "composition":
+ { "string": "ll",
+ "clauses":
+ [
+ { "length": 2, "attr": COMPOSITION_ATTR_RAW_CLAUSE }
+ ]
+ },
+ "caret": { "start": 2, "length": 0 },
+ "key": { key: "l", code: "KeyL", keyCode: KeyboardEvent.DOM_VK_L },
+ }, aWindow);
+ }, popup: false, value: "Mozill", searchString: "Mozi"
+ },
+ { description: "modifying composition string to empty string shouldn't reopen the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeCompositionChange(
+ { "composition":
+ { "string": "",
+ "clauses":
+ [
+ { "length": 0, "attr": 0 }
+ ]
+ },
+ "caret": { "start": 0, "length": 0 }
+ }, aWindow);
+ }, popup: false, value: "Mozi", searchString: "Mozi"
+ },
+ { description: "cancled compositionend should reopen the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeComposition({ type: "compositioncommit", data: "",
+ key: { key: "KEY_Escape", code: "Escape" } }, aWindow);
+ }, popup: true, value: "Mozi", searchString: "Mozi"
+ },
+ // But if composition replaces some characters and canceled, the search
+ // string should be the latest value.
+ { description: "compositionstart with selected string should close the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeKey("VK_LEFT", { shiftKey: true }, aWindow);
+ synthesizeKey("VK_LEFT", { shiftKey: true }, aWindow);
+ synthesizeCompositionChange(
+ { "composition":
+ { "string": "z",
+ "clauses":
+ [
+ { "length": 1, "attr": COMPOSITION_ATTR_RAW_CLAUSE }
+ ]
+ },
+ "caret": { "start": 1, "length": 0 },
+ "key": { key: "z", code: "KeyZ", keyCode: KeyboardEvent.DOM_VK_Z },
+ }, aWindow);
+ }, popup: false, value: "Moz", searchString: "Mozi"
+ },
+ { description: "modifying composition string shouldn't reopen the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeCompositionChange(
+ { "composition":
+ { "string": "zi",
+ "clauses":
+ [
+ { "length": 2, "attr": COMPOSITION_ATTR_RAW_CLAUSE }
+ ]
+ },
+ "caret": { "start": 2, "length": 0 },
+ "key": { key: "i", code: "KeyI", keyCode: KeyboardEvent.DOM_VK_I },
+ }, aWindow);
+ }, popup: false, value: "Mozi", searchString: "Mozi"
+ },
+ { description: "modifying composition string to empty string shouldn't reopen the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeCompositionChange(
+ { "composition":
+ { "string": "",
+ "clauses":
+ [
+ { "length": 0, "attr": 0 }
+ ]
+ },
+ "caret": { "start": 0, "length": 0 }
+ }, aWindow);
+ }, popup: false, value: "Mo", searchString: "Mozi"
+ },
+ { description: "canceled compositionend should search the result with the latest value",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeComposition({ type: "compositioncommitasis",
+ key: { key: "KEY_Escape", code: "Escape" } }, aWindow);
+ }, popup: true, value: "Mo", searchString: "Mo"
+ },
+ // If all characters are removed, the popup should be closed.
+ { description: "the value becomes empty by backspace, the popup should be closed",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeKey("VK_BACK_SPACE", {}, aWindow);
+ synthesizeKey("VK_BACK_SPACE", {}, aWindow);
+ }, popup: false, value: "", searchString: ""
+ },
+ // composition which is canceled shouldn't cause opening the popup.
+ { description: "compositionstart shouldn't open the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeCompositionChange(
+ { "composition":
+ { "string": "M",
+ "clauses":
+ [
+ { "length": 1, "attr": COMPOSITION_ATTR_RAW_CLAUSE }
+ ]
+ },
+ "caret": { "start": 1, "length": 0 },
+ "key": { key: "m", code: "KeyM", keyCode: KeyboardEvent.DOM_VK_M,
+ shiftKey: true },
+ }, aWindow);
+ }, popup: false, value: "M", searchString: ""
+ },
+ { description: "modifying composition string shouldn't open the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeCompositionChange(
+ { "composition":
+ { "string": "Mo",
+ "clauses":
+ [
+ { "length": 2, "attr": COMPOSITION_ATTR_RAW_CLAUSE }
+ ]
+ },
+ "caret": { "start": 2, "length": 0 },
+ "key": { key: "o", code: "KeyO", keyCode: KeyboardEvent.DOM_VK_O },
+ }, aWindow);
+ }, popup: false, value: "Mo", searchString: ""
+ },
+ { description: "modifying composition string to empty string shouldn't open the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeCompositionChange(
+ { "composition":
+ { "string": "",
+ "clauses":
+ [
+ { "length": 0, "attr": 0 }
+ ]
+ },
+ "caret": { "start": 0, "length": 0 }
+ }, aWindow);
+ }, popup: false, value: "", searchString: ""
+ },
+ { description: "canceled compositionend shouldn't open the popup if it was closed",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeComposition({ type: "compositioncommitasis",
+ key: { key: "KEY_Escape", code: "Escape" } }, aWindow);
+ }, popup: false, value: "", searchString: ""
+ },
+ // Down key should open the popup even if the editor is empty.
+ { description: "DOWN key should open the popup even if the value is empty",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeKey("VK_DOWN", {}, aWindow);
+ }, popup: true, value: "", searchString: ""
+ },
+ // If popup is open at starting composition, the popup should be reopened
+ // after composition anyway.
+ { description: "compositionstart shouldn't open the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeCompositionChange(
+ { "composition":
+ { "string": "M",
+ "clauses":
+ [
+ { "length": 1, "attr": COMPOSITION_ATTR_RAW_CLAUSE }
+ ]
+ },
+ "caret": { "start": 1, "length": 0 },
+ "key": { key: "M", code: "KeyM", keyCode: KeyboardEvent.DOM_VK_M,
+ shiftKey: true },
+ }, aWindow);
+ }, popup: false, value: "M", searchString: ""
+ },
+ { description: "modifying composition string shouldn't open the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeCompositionChange(
+ { "composition":
+ { "string": "Mo",
+ "clauses":
+ [
+ { "length": 2, "attr": COMPOSITION_ATTR_RAW_CLAUSE }
+ ]
+ },
+ "caret": { "start": 2, "length": 0 },
+ "key": { key: "o", code: "KeyO", keyCode: KeyboardEvent.DOM_VK_O },
+ }, aWindow);
+ }, popup: false, value: "Mo", searchString: ""
+ },
+ { description: "modifying composition string to empty string shouldn't open the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeCompositionChange(
+ { "composition":
+ { "string": "",
+ "clauses":
+ [
+ { "length": 0, "attr": 0 }
+ ]
+ },
+ "caret": { "start": 0, "length": 0 }
+ }, aWindow);
+ }, popup: false, value: "", searchString: ""
+ },
+ { description: "canceled compositionend should open the popup if it was opened",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeComposition({ type: "compositioncommitasis",
+ key: { key: "KEY_Escape", code: "Escape" } }, aWindow);
+ }, popup: true, value: "", searchString: ""
+ },
+ // Type normally, and hit escape, the popup should be closed.
+ { description: "ESCAPE should close the popup after typing something",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeKey("M", { shiftKey: true }, aWindow);
+ synthesizeKey("o", { shiftKey: true }, aWindow);
+ synthesizeKey("VK_ESCAPE", {}, aWindow);
+ }, popup: false, value: "Mo", searchString: "Mo"
+ },
+ // Even if the popup is closed, composition which is canceled should open
+ // the popup if the value isn't empty.
+ // XXX This might not be good behavior, but anyway, this is minor issue...
+ { description: "compositionstart shouldn't open the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeCompositionChange(
+ { "composition":
+ { "string": "z",
+ "clauses":
+ [
+ { "length": 1, "attr": COMPOSITION_ATTR_RAW_CLAUSE }
+ ]
+ },
+ "caret": { "start": 1, "length": 0 },
+ "key": { key: "z", code: "KeyZ", keyCode: KeyboardEvent.DOM_VK_Z },
+ }, aWindow);
+ }, popup: false, value: "Moz", searchString: "Mo"
+ },
+ { description: "modifying composition string shouldn't open the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeCompositionChange(
+ { "composition":
+ { "string": "zi",
+ "clauses":
+ [
+ { "length": 2, "attr": COMPOSITION_ATTR_RAW_CLAUSE }
+ ]
+ },
+ "caret": { "start": 2, "length": 0 },
+ "key": { key: "i", code: "KeyI", keyCode: KeyboardEvent.DOM_VK_I },
+ }, aWindow);
+ }, popup: false, value: "Mozi", searchString: "Mo"
+ },
+ { description: "modifying composition string to empty string shouldn't open the popup",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeCompositionChange(
+ { "composition":
+ { "string": "",
+ "clauses":
+ [
+ { "length": 0, "attr": 0 }
+ ]
+ },
+ "caret": { "start": 0, "length": 0 }
+ }, aWindow);
+ }, popup: false, value: "Mo", searchString: "Mo"
+ },
+ { description: "canceled compositionend shouldn't open the popup if the popup was closed",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeComposition({ type: "compositioncommitasis",
+ key: { key: "KEY_Escape", code: "Escape" } }, aWindow);
+ }, popup: true, value: "Mo", searchString: "Mo"
+ },
+ // House keeping...
+ { description: "house keeping for next tests",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeKey("VK_BACK_SPACE", {}, aWindow);
+ synthesizeKey("VK_BACK_SPACE", {}, aWindow);
+ }, popup: false, value: "", searchString: ""
+ },
+ // Testing for nsIAutoCompleteInput.completeDefaultIndex being true.
+ { description: "compositionstart shouldn't open the popup (completeDefaultIndex is true)",
+ completeDefaultIndex: true,
+ execute: function (aWindow) {
+ synthesizeCompositionChange(
+ { "composition":
+ { "string": "M",
+ "clauses":
+ [
+ { "length": 1, "attr": COMPOSITION_ATTR_RAW_CLAUSE }
+ ]
+ },
+ "caret": { "start": 1, "length": 0 },
+ "key": { key: "M", code: "KeyM", keyCode: KeyboardEvent.DOM_VK_M,
+ shiftKey: true },
+ }, aWindow);
+ }, popup: false, value: "M", searchString: ""
+ },
+ { description: "modifying composition string shouldn't open the popup (completeDefaultIndex is true)",
+ completeDefaultIndex: true,
+ execute: function (aWindow) {
+ synthesizeCompositionChange(
+ { "composition":
+ { "string": "Mo",
+ "clauses":
+ [
+ { "length": 2, "attr": COMPOSITION_ATTR_RAW_CLAUSE }
+ ]
+ },
+ "caret": { "start": 2, "length": 0 },
+ "key": { key: "o", code: "KeyO", keyCode: KeyboardEvent.DOM_VK_O },
+ }, aWindow);
+ }, popup: false, value: "Mo", searchString: ""
+ },
+ { description: "compositionend should open the popup (completeDefaultIndex is true)",
+ completeDefaultIndex: true,
+ execute: function (aWindow) {
+ synthesizeComposition({ type: "compositioncommitasis",
+ key: { key: "KEY_Enter", code: "Enter" } }, aWindow);
+ }, popup: true, value: "Mozilla", searchString: "Mo"
+ },
+ // House keeping...
+ { description: "house keeping for next tests",
+ completeDefaultIndex: false,
+ execute: function (aWindow) {
+ synthesizeKey("VK_BACK_SPACE", {}, aWindow);
+ synthesizeKey("VK_BACK_SPACE", {}, aWindow);
+ synthesizeKey("VK_BACK_SPACE", {}, aWindow);
+ synthesizeKey("VK_BACK_SPACE", {}, aWindow);
+ synthesizeKey("VK_BACK_SPACE", {}, aWindow);
+ synthesizeKey("VK_BACK_SPACE", {}, aWindow);
+ }, popup: false, value: "", searchString: ""
+ }
+ ]
+};