Bug 1254070 - inspector: trigger autocomplete if nextchar is not a word character;r=gl

For the style attribute CSS autocompletion, suggestions will now be provided
when the character after the caret is a non-word character. As opposed to the
current behavior where suggestions would only be displayed if the next character
was the end of the input or a space.

This allows to show suggestions when the user's caret is next to ";" or '"', which
can frequently happen when editing style attributes.

MozReview-Commit-ID: Bvz6koikbqR

--HG--
extra : rebase_source : fc4978fdd14bcaf99d3286e7750c005e8d11d96a
extra : amend_source : 33cbbee2523bbc89fa2d5d09297666fc3256045f
This commit is contained in:
Julian Descottes 2016-03-08 19:27:25 +01:00
Родитель a11cd38818
Коммит 9e8018a6ae
5 изменённых файлов: 66 добавлений и 9 удалений

Просмотреть файл

@ -64,6 +64,7 @@ skip-if = e10s # scratchpad.xul is not loading in e10s window
subsuite = clipboard
[browser_markup_css_completion_style_attribute_01.js]
[browser_markup_css_completion_style_attribute_02.js]
[browser_markup_css_completion_style_attribute_03.js]
[browser_markup_dragdrop_autoscroll.js]
[browser_markup_dragdrop_distance.js]
[browser_markup_dragdrop_draggable.js]

Просмотреть файл

@ -70,7 +70,6 @@ const TEST_DATA = [
];
add_task(function* () {
info("Opening the inspector on the test URL");
let {inspector} = yield openInspectorForURL(TEST_URL);
yield runStyleAttributeAutocompleteTests(inspector, TEST_DATA);

Просмотреть файл

@ -98,7 +98,6 @@ const TEST_DATA_INNER = [
];
add_task(function* () {
info("Opening the inspector on the test URL");
let {inspector} = yield openInspectorForURL(TEST_URL);
yield runStyleAttributeAutocompleteTests(inspector, TEST_DATA_DOUBLE);

Просмотреть файл

@ -0,0 +1,54 @@
/* vim: set ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/* import-globals-from helper_style_attr_test_runner.js */
"use strict";
// Test CSS autocompletion of the style attribute can be triggered when the
// caret is before a non-word character.
loadHelperScript("helper_style_attr_test_runner.js");
const TEST_URL = URL_ROOT + "doc_markup_edit.html";
// test data format :
// [
// what key to press,
// expected input box value after keypress,
// expected input.selectionStart,
// expected input.selectionEnd,
// is popup expected to be open ?
// ]
const TEST_DATA = [
["s", "s", 1, 1, false],
["t", "st", 2, 2, false],
["y", "sty", 3, 3, false],
["l", "styl", 4, 4, false],
["e", "style", 5, 5, false],
["=", "style=", 6, 6, false],
["\"", "style=\"", 7, 7, false],
["\"", "style=\"\"", 8, 8, false],
["VK_LEFT", "style=\"\"", 7, 7, false],
["c", "style=\"color\"", 8, 12, true],
["o", "style=\"color\"", 9, 12, true],
["VK_RIGHT", "style=\"color\"", 12, 12, false],
[":", "style=\"color:aliceblue\"", 13, 22, true],
["b", "style=\"color:beige\"", 14, 18, true],
["VK_RIGHT", "style=\"color:beige\"", 18, 18, false],
[";", "style=\"color:beige;\"", 19, 19, false],
[";", "style=\"color:beige;;\"", 20, 20, false],
["VK_LEFT", "style=\"color:beige;;\"", 19, 19, false],
["p", "style=\"color:beige;padding;\"", 20, 26, true],
["VK_RIGHT", "style=\"color:beige;padding;\"", 26, 26, false],
[":", "style=\"color:beige;padding:calc;\"", 27, 31, true],
["0", "style=\"color:beige;padding:0;\"", 28, 28, false],
["VK_RETURN", "style=\"color:beige;padding:0;\"",
-1, -1, false]
];
add_task(function* () {
let {inspector} = yield openInspectorForURL(TEST_URL);
yield runStyleAttributeAutocompleteTests(inspector, TEST_DATA);
});

Просмотреть файл

@ -1297,14 +1297,18 @@ InplaceEditor.prototype = {
if (query == null) {
return;
}
// If nothing is selected and there is a non-space character after the
// cursor, do not autocomplete.
// If nothing is selected and there is a word (\w) character after the cursor, do
// not autocomplete.
if (input.selectionStart == input.selectionEnd &&
input.selectionStart < input.value.length &&
input.value.slice(input.selectionStart)[0] != " ") {
// This emit is mainly to make the test flow simpler.
this.emit("after-suggest", "nothing to autocomplete");
return;
input.selectionStart < input.value.length) {
let nextChar = input.value.slice(input.selectionStart)[0];
// Check if the next character is a valid word character, no suggestion should be
// provided when preceeding a word.
if (/[\w-]/.test(nextChar)) {
// This emit is mainly to make the test flow simpler.
this.emit("after-suggest", "nothing to autocomplete");
return;
}
}
let list = [];
if (this.contentType == CONTENT_TYPES.CSS_PROPERTY) {