зеркало из https://github.com/mozilla/gecko-dev.git
Bug 717369 - Autocomplete CSS properties and values in the Style Editor - Part 3 - Style editor tests, r=harth, robcee
This commit is contained in:
Родитель
3d5325e43b
Коммит
60d58aad6a
|
@ -30,7 +30,7 @@ function setupAutoCompletion(ctx, walker) {
|
||||||
|
|
||||||
let keyMap = {
|
let keyMap = {
|
||||||
"Tab": cm => {
|
"Tab": cm => {
|
||||||
if (popup && popup.isOpen) {
|
if (popup && (popup.isOpen || popup._panel.state == "showing")) {
|
||||||
cycleSuggestions(ed);
|
cycleSuggestions(ed);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,7 @@ function setupAutoCompletion(ctx, walker) {
|
||||||
return win.CodeMirror.Pass;
|
return win.CodeMirror.Pass;
|
||||||
},
|
},
|
||||||
"Shift-Tab": cm => {
|
"Shift-Tab": cm => {
|
||||||
if (popup && popup.isOpen) {
|
if (popup && (popup.isOpen || popup._panel.state == "showing")) {
|
||||||
cycleSuggestions(ed, true);
|
cycleSuggestions(ed, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -83,6 +83,7 @@ function autoComplete({ ed, cm }) {
|
||||||
if (!suggestions || !suggestions.length || !suggestions[0].preLabel) {
|
if (!suggestions || !suggestions.length || !suggestions[0].preLabel) {
|
||||||
private.suggestionInsertedOnce = false;
|
private.suggestionInsertedOnce = false;
|
||||||
popup.hidePopup();
|
popup.hidePopup();
|
||||||
|
ed.emit("after-suggest");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// The cursor is at the end of the currently entered part of the token, like
|
// The cursor is at the end of the currently entered part of the token, like
|
||||||
|
@ -94,6 +95,8 @@ function autoComplete({ ed, cm }) {
|
||||||
popup.setItems(suggestions);
|
popup.setItems(suggestions);
|
||||||
popup.openPopup(cm.display.cursor, -1 * left, 0);
|
popup.openPopup(cm.display.cursor, -1 * left, 0);
|
||||||
private.suggestionInsertedOnce = false;
|
private.suggestionInsertedOnce = false;
|
||||||
|
// This event is used in tests.
|
||||||
|
ed.emit("after-suggest");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,9 +122,8 @@ function cycleSuggestions(ed, reverse) {
|
||||||
popup.selectNextItem();
|
popup.selectNextItem();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (popup.itemCount == 1) {
|
if (popup.itemCount == 1)
|
||||||
popup.hidePopup();
|
popup.hidePopup();
|
||||||
}
|
|
||||||
ed.replaceText(firstItem.label.slice(firstItem.preLabel.length), cur, cur);
|
ed.replaceText(firstItem.label.slice(firstItem.preLabel.length), cur, cur);
|
||||||
} else {
|
} else {
|
||||||
let fromCur = {
|
let fromCur = {
|
||||||
|
@ -134,6 +136,8 @@ function cycleSuggestions(ed, reverse) {
|
||||||
popup.selectNextItem();
|
popup.selectNextItem();
|
||||||
ed.replaceText(popup.selectedItem.label, fromCur, cur);
|
ed.replaceText(popup.selectedItem.label, fromCur, cur);
|
||||||
}
|
}
|
||||||
|
// This event is used in tests.
|
||||||
|
ed.emit("suggestion-entered");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -147,6 +151,8 @@ function onEditorKeypress(ed, event) {
|
||||||
case event.DOM_VK_DOWN:
|
case event.DOM_VK_DOWN:
|
||||||
case event.DOM_VK_LEFT:
|
case event.DOM_VK_LEFT:
|
||||||
case event.DOM_VK_RIGHT:
|
case event.DOM_VK_RIGHT:
|
||||||
|
case event.DOM_VK_HOME:
|
||||||
|
case event.DOM_VK_END:
|
||||||
case event.DOM_VK_BACK_SPACE:
|
case event.DOM_VK_BACK_SPACE:
|
||||||
case event.DOM_VK_DELETE:
|
case event.DOM_VK_DELETE:
|
||||||
case event.DOM_VK_ENTER:
|
case event.DOM_VK_ENTER:
|
||||||
|
@ -161,6 +167,13 @@ function onEditorKeypress(ed, event) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the private popup. This method is used by tests to test the feature.
|
||||||
|
*/
|
||||||
|
function getPopup({ ed }) {
|
||||||
|
return privates.get(ed).popup;
|
||||||
|
}
|
||||||
// Export functions
|
// Export functions
|
||||||
|
|
||||||
module.exports.setupAutoCompletion = setupAutoCompletion;
|
module.exports.setupAutoCompletion = setupAutoCompletion;
|
||||||
|
module.exports.getAutocompletionPopup = getPopup;
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>testcase for autocomplete testing</title>
|
||||||
|
<style type="text/css">
|
||||||
|
div {
|
||||||
|
font-size: 4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div > span {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
div + button {
|
||||||
|
border: 2px dotted red;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div>parent <span>child</span></div><button>sibling</button>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -1,5 +1,6 @@
|
||||||
[DEFAULT]
|
[DEFAULT]
|
||||||
support-files =
|
support-files =
|
||||||
|
autocomplete.html
|
||||||
browser_styleeditor_cmd_edit.html
|
browser_styleeditor_cmd_edit.html
|
||||||
four.html
|
four.html
|
||||||
head.js
|
head.js
|
||||||
|
@ -26,6 +27,7 @@ support-files =
|
||||||
test_private.css
|
test_private.css
|
||||||
test_private.html
|
test_private.html
|
||||||
|
|
||||||
|
[browser_styleeditor_autocomplete.js]
|
||||||
[browser_styleeditor_bug_740541_iframes.js]
|
[browser_styleeditor_bug_740541_iframes.js]
|
||||||
[browser_styleeditor_bug_851132_middle_click.js]
|
[browser_styleeditor_bug_851132_middle_click.js]
|
||||||
[browser_styleeditor_bug_870339.js]
|
[browser_styleeditor_bug_870339.js]
|
||||||
|
|
|
@ -0,0 +1,179 @@
|
||||||
|
/* vim: set ts=2 et sw=2 tw=80: */
|
||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
const TESTCASE_URI = TEST_BASE + "autocomplete.html";
|
||||||
|
const MAX_SUGGESTIONS = 15;
|
||||||
|
|
||||||
|
// Pref which decides if CSS autocompletion is enabled in Style Editor or not.
|
||||||
|
const AUTOCOMPLETION_PREF = "devtools.styleeditor.autocompletion-enabled";
|
||||||
|
|
||||||
|
// Test cases to test that autocompletion works correctly when enabled.
|
||||||
|
// Format:
|
||||||
|
// [
|
||||||
|
// -1 for pressing Ctrl + Space or the particular key to press,
|
||||||
|
// Number of suggestions in the popup (-1 if popup is closed),
|
||||||
|
// Index of selected suggestion,
|
||||||
|
// 1 to check whether the selected suggestion is inserted into the editor or not
|
||||||
|
// ]
|
||||||
|
let TEST_CASES = [
|
||||||
|
['VK_RIGHT', -1],
|
||||||
|
['VK_RIGHT', -1],
|
||||||
|
['VK_RIGHT', -1],
|
||||||
|
['VK_RIGHT', -1],
|
||||||
|
[-1, 1, 0],
|
||||||
|
['VK_DOWN', -1],
|
||||||
|
['VK_RIGHT', -1],
|
||||||
|
['VK_RIGHT', -1],
|
||||||
|
['VK_RIGHT', -1],
|
||||||
|
[-1, MAX_SUGGESTIONS, 0],
|
||||||
|
['VK_END', -1],
|
||||||
|
['VK_RETURN', -1],
|
||||||
|
['b', MAX_SUGGESTIONS, 0],
|
||||||
|
['a', 11, 0],
|
||||||
|
['VK_TAB', 11, 0, 1],
|
||||||
|
['VK_TAB', 11, 1, 1],
|
||||||
|
[':', -1],
|
||||||
|
['b', 9, 0],
|
||||||
|
['l', 4, 0],
|
||||||
|
['VK_TAB', 4, 0, 1],
|
||||||
|
['VK_TAB', 4, 1, 1],
|
||||||
|
['VK_TAB', 4, 2, 1],
|
||||||
|
['VK_DOWN', -1],
|
||||||
|
['VK_RETURN', -1],
|
||||||
|
['b', 2, 0],
|
||||||
|
['u', 1, 0],
|
||||||
|
['VK_TAB', -1],
|
||||||
|
['{', -1],
|
||||||
|
['VK_HOME', -1],
|
||||||
|
['VK_DOWN', -1],
|
||||||
|
['VK_DOWN', -1],
|
||||||
|
['VK_RIGHT', -1],
|
||||||
|
['VK_RIGHT', -1],
|
||||||
|
['VK_RIGHT', -1],
|
||||||
|
['VK_RIGHT', -1],
|
||||||
|
['VK_RIGHT', -1],
|
||||||
|
['VK_RIGHT', -1],
|
||||||
|
['VK_RIGHT', -1],
|
||||||
|
['VK_RIGHT', -1],
|
||||||
|
['VK_RIGHT', -1],
|
||||||
|
['VK_RIGHT', -1],
|
||||||
|
[-1, 1, 0],
|
||||||
|
];
|
||||||
|
|
||||||
|
let gEditor;
|
||||||
|
let gPopup;
|
||||||
|
let index = 0;
|
||||||
|
|
||||||
|
function test()
|
||||||
|
{
|
||||||
|
waitForExplicitFinish();
|
||||||
|
|
||||||
|
addTabAndOpenStyleEditor(function(panel) {
|
||||||
|
panel.UI.on("editor-added", testEditorAdded);
|
||||||
|
});
|
||||||
|
|
||||||
|
content.location = TESTCASE_URI;
|
||||||
|
}
|
||||||
|
|
||||||
|
function testEditorAdded(aEvent, aEditor) {
|
||||||
|
info("Editor added, getting the source editor and starting tests");
|
||||||
|
aEditor.getSourceEditor().then(editor => {
|
||||||
|
info("source editor found, starting tests.");
|
||||||
|
gEditor = editor.sourceEditor;
|
||||||
|
gPopup = gEditor.getAutocompletionPopup();
|
||||||
|
waitForFocus(testState, gPanelWindow);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function testState() {
|
||||||
|
if (index == TEST_CASES.length) {
|
||||||
|
testAutocompletionDisabled();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let [key] = TEST_CASES[index];
|
||||||
|
let mods = {};
|
||||||
|
|
||||||
|
if (key == -1) {
|
||||||
|
info("pressing Ctrl + Space to get result: [" + TEST_CASES[index] +
|
||||||
|
"] for index " + index);
|
||||||
|
gEditor.once("after-suggest", checkState);
|
||||||
|
key = " ";
|
||||||
|
mods.accelKey = true;
|
||||||
|
}
|
||||||
|
else if (/(down|left|right|return|home|end)/ig.test(key)) {
|
||||||
|
info("pressing key " + key + " to get result: [" + TEST_CASES[index] +
|
||||||
|
"] for index " + index);
|
||||||
|
gEditor.once("cursorActivity", checkState);
|
||||||
|
}
|
||||||
|
else if (key == "VK_TAB") {
|
||||||
|
info("pressing key " + key + " to get result: [" + TEST_CASES[index] +
|
||||||
|
"] for index " + index);
|
||||||
|
gEditor.once("suggestion-entered", checkState);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
info("pressing key " + key + " to get result: [" + TEST_CASES[index] +
|
||||||
|
"] for index " + index);
|
||||||
|
gEditor.once("after-suggest", checkState);
|
||||||
|
}
|
||||||
|
EventUtils.synthesizeKey(key, mods, gPanelWindow);
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkState() {
|
||||||
|
executeSoon(() => {
|
||||||
|
info("After keypress for index " + index);
|
||||||
|
let [key, total, current, inserted] = TEST_CASES[index];
|
||||||
|
if (total != -1) {
|
||||||
|
ok(gPopup._panel.state == "open" || gPopup._panel.state == "showing",
|
||||||
|
"Popup is open for index " + index);
|
||||||
|
is(total, gPopup.itemCount,
|
||||||
|
"Correct total suggestions for index " + index);
|
||||||
|
is(current, gPopup.selectedIndex,
|
||||||
|
"Correct index is selected for index " + index);
|
||||||
|
if (inserted) {
|
||||||
|
let { preLabel, label } = gPopup.getItemAtIndex(current);
|
||||||
|
let { line, ch } = gEditor.getCursor();
|
||||||
|
let lineText = gEditor.getText(line);
|
||||||
|
is(lineText.substring(ch - label.length, ch), label,
|
||||||
|
"Current suggestion from the popup is inserted into the editor.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ok(gPopup._panel.state != "open" && gPopup._panel.state != "showing",
|
||||||
|
"Popup is closed for index " + index);
|
||||||
|
}
|
||||||
|
index++;
|
||||||
|
testState();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function testAutocompletionDisabled() {
|
||||||
|
gBrowser.removeCurrentTab();
|
||||||
|
|
||||||
|
index = 0;
|
||||||
|
info("Starting test to check if autocompletion is disabled correctly.")
|
||||||
|
Services.prefs.setBoolPref(AUTOCOMPLETION_PREF, false);
|
||||||
|
|
||||||
|
addTabAndOpenStyleEditor(function(panel) {
|
||||||
|
panel.UI.on("editor-added", testEditorAddedDisabled);
|
||||||
|
});
|
||||||
|
|
||||||
|
content.location = TESTCASE_URI;
|
||||||
|
}
|
||||||
|
|
||||||
|
function testEditorAddedDisabled(aEvent, aEditor) {
|
||||||
|
info("Editor added, getting the source editor and starting tests");
|
||||||
|
aEditor.getSourceEditor().then(editor => {
|
||||||
|
ok(!editor.sourceEditor.getAutocompletionPopup,
|
||||||
|
"Autocompletion popup does not exist");
|
||||||
|
cleanup();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function cleanup() {
|
||||||
|
Services.prefs.clearUserPref(AUTOCOMPLETION_PREF);
|
||||||
|
gEditor = null;
|
||||||
|
gPopup = null;
|
||||||
|
finish();
|
||||||
|
}
|
Загрузка…
Ссылка в новой задаче