Skip to content

Commit 61e31fa

Browse files
committed
fix: clicking on color gutter opens color editor on wrong line after some line deletions
1 parent 3f863f7 commit 61e31fa

File tree

3 files changed

+52
-15
lines changed

3 files changed

+52
-15
lines changed

src/editor/Editor.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2592,14 +2592,16 @@ define(function (require, exports, module) {
25922592
* @param {number} lineNumber The line number for the inserted gutter marker
25932593
* @param {string} gutterName The name of the gutter
25942594
* @param {object} marker The dom element representing the marker to the inserted in the gutter
2595+
* @returns {{lineNo : function}} lineHandle this can be used to track the gutter line as the line number
2596+
* changes as the user edits code.
25952597
*/
25962598
Editor.prototype.setGutterMarker = function (lineNumber, gutterName, marker) {
25972599
if (!Editor.isGutterRegistered(gutterName)) {
25982600
console.warn("Gutter name must be registered before calling editor.setGutterMarker");
25992601
return;
26002602
}
26012603

2602-
this._codeMirror.setGutterMarker(lineNumber, gutterName, marker);
2604+
return this._codeMirror.setGutterMarker(lineNumber, gutterName, marker);
26032605
};
26042606

26052607
/**

src/extensionsIntegrated/CSSColorPreview/main.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -142,22 +142,24 @@ define(function (require, exports, module) {
142142
const colorGutters = _.sortBy(_results, "lineNumber");
143143

144144
colorGutters.forEach(function (obj) {
145+
let lineHandle;
145146
let $marker;
146147
if (obj.colorValues.length === 1) {
147148
// Single color preview
148149
$marker = $("<i>")
149150
.addClass(SINGLE_COLOR_PREVIEW_CLASS)
150151
.css('background-color', obj.colorValues[0].color);
152+
lineHandle = editor.setGutterMarker(obj.lineNumber, GUTTER_NAME, $marker[0]);
151153

152-
editor.setGutterMarker(obj.lineNumber, GUTTER_NAME, $marker[0]);
153154
$marker.click((event)=>{
154155
event.preventDefault();
155156
event.stopPropagation();
156-
_colorIconClicked(editor, obj.lineNumber, obj.colorValues[0].color);
157+
_colorIconClicked(editor, lineHandle.lineNo(), obj.colorValues[0].color);
157158
});
158159
} else {
159160
// Multiple colors preview
160161
$marker = $("<div>").addClass(MULTI_COLOR_PREVIEW_CLASS);
162+
lineHandle = editor.setGutterMarker(obj.lineNumber, GUTTER_NAME, $marker[0]);
161163

162164
// Positions for up to 4 colors in grid
163165
const positions = [
@@ -178,18 +180,16 @@ define(function (require, exports, module) {
178180
$colorBox.click((event)=>{
179181
event.preventDefault();
180182
event.stopPropagation();
181-
_colorIconClicked(editor, obj.lineNumber, color.color);
183+
_colorIconClicked(editor, lineHandle.lineNo(), color.color);
182184
});
183185
$marker.append($colorBox);
184186
}
185187
});
186-
187-
editor.setGutterMarker(obj.lineNumber, GUTTER_NAME, $marker[0]);
188188
}
189189
$marker.mouseenter(event=>{
190190
event.preventDefault();
191191
event.stopPropagation();
192-
_applyInlineColor(editor, obj.lineNumber);
192+
_applyInlineColor(editor, lineHandle.lineNo());
193193
});
194194
$marker.mouseleave(event=>{
195195
event.preventDefault();

test/spec/Extn-CSSColorPreview-integ-test.js

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@
1919
*
2020
*/
2121

22-
/*global describe, it, beforeAll, afterAll*/
22+
/*global describe, it, beforeAll, afterAll, beforeEach*/
2323

2424
define(function (require, exports, module) {
2525

2626

2727
var SpecRunnerUtils = require("spec/SpecRunnerUtils");
2828

29-
describe("integration:ColorPreview in gutter", function () {
29+
describe("integration:ColorPreview in gutter - needs focus", function () {
3030
const testRootSpec = "/spec/CSSColorPreview-test-files/";
3131
const GUTTER_NAME = "CodeMirror-colorGutter",
3232
SINGLE_COLOR_PREVIEW_CLASS = "ico-cssColorPreview",
@@ -55,6 +55,10 @@ define(function (require, exports, module) {
5555
await SpecRunnerUtils.closeTestWindow();
5656
}, 30000);
5757

58+
beforeEach(async function () {
59+
await __PR.closeAll();
60+
});
61+
5862
it("should color gutter not appear in cpp files", async function () {
5963
const fileName = "a.cpp";
6064
await __PR.writeTextFile(fileName, "#include <iostream>", true);
@@ -204,16 +208,24 @@ define(function (require, exports, module) {
204208
const editor = await init();
205209
await __PR.execCommand(__PR.Commands.EDIT_BEAUTIFY_CODE);
206210
if(baseFileName === "base.css"){
207-
await __PR.awaitsFor(()=>{
208-
return editor.getLine(0) === ".class-one {";
209-
}, "for beautify complete");
211+
await __PR.awaitsFor(async ()=>{
212+
if(editor.getLine(0) !== ".class-one {"){
213+
await __PR.execCommand(__PR.Commands.EDIT_BEAUTIFY_CODE);
214+
return false;
215+
}
216+
return true;
217+
}, "for beautify complete", 2000, 50);
210218
_verifyExpectedColors(editor, [8, 12, 15, 18, 21, 24]);
211219
await __PR.closeFile();
212220
return;
213221
}
214-
await __PR.awaitsFor(()=>{
215-
return editor.getLine(2) === " <head>";
216-
}, "for beautify complete");
222+
await __PR.awaitsFor(async ()=>{
223+
if(editor.getLine(2) !== " <head>"){
224+
await __PR.execCommand(__PR.Commands.EDIT_BEAUTIFY_CODE);
225+
return false;
226+
}
227+
return true;
228+
}, "for beautify complete", 2000, 50);
217229
_verifyExpectedColors(editor, [8, 12, 13, 14, 15, 16]);
218230
await __PR.closeFile();
219231
});
@@ -250,6 +262,29 @@ define(function (require, exports, module) {
250262
await __PR.closeFile();
251263
});
252264

265+
it(`should color gutter track correct line numbers after deleting lines in ${fileName}`, async function () {
266+
const editor = await init();
267+
validateMultipleColors(editor, 12, ["#00ff8c", "red"]);
268+
269+
__PR.setCursors(["6:1-10:2"]);
270+
__PR.keydown(["BACK_SPACE"]); // this will delete the selected lines
271+
272+
// now the color gutter should account for the missing lines
273+
let gutterMarker = editor.getGutterMarker(11, GUTTER_NAME);
274+
const individualColors = $(gutterMarker).find(".color-box");
275+
individualColors[0].click();
276+
await __PR.awaitsFor(()=>{
277+
return __PR.$(".CodeMirror-linewidget").length === 1 &&
278+
areColorsEqual(__PR.$(".CodeMirror-linewidget").find(".original-color")[0], "#ff0090");
279+
}, "quick edit to color #ff0090 appear");
280+
individualColors[2].click();
281+
await __PR.awaitsFor(()=>{
282+
return __PR.$(".CodeMirror-linewidget").length === 1 &&
283+
areColorsEqual(__PR.$(".CodeMirror-linewidget").find(".original-color")[0], "#954e3e");
284+
}, "quick edit to color #954e3e appear");
285+
await __PR.closeFile();
286+
});
287+
253288
it(`should update colors on typing ${fileName}`, async function () {
254289
const editor = await init();
255290
validateSingleColor(editor, 8, "blue");

0 commit comments

Comments
 (0)