Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(725)

Unified Diff: third_party/WebKit/Source/devtools/front_end/text_editor/CodeMirrorTextEditor.js

Issue 2466123002: DevTools: reformat front-end code to match chromium style. (Closed)
Patch Set: all done Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/devtools/front_end/text_editor/CodeMirrorTextEditor.js
diff --git a/third_party/WebKit/Source/devtools/front_end/text_editor/CodeMirrorTextEditor.js b/third_party/WebKit/Source/devtools/front_end/text_editor/CodeMirrorTextEditor.js
index d3cbcf226c44b5349df3ed033ee6e195d883e3d0..94f04e5084a47a595ee29e3fbaceb8fde38490af 100644
--- a/third_party/WebKit/Source/devtools/front_end/text_editor/CodeMirrorTextEditor.js
+++ b/third_party/WebKit/Source/devtools/front_end/text_editor/CodeMirrorTextEditor.js
@@ -27,1690 +27,1573 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-
/**
- * @constructor
* @implements {WebInspector.TextEditor}
- * @extends {WebInspector.VBox}
- * @param {!WebInspector.TextEditor.Options} options
+ * @unrestricted
*/
-WebInspector.CodeMirrorTextEditor = function(options)
-{
- WebInspector.VBox.call(this);
+WebInspector.CodeMirrorTextEditor = class extends WebInspector.VBox {
+ /**
+ * @param {!WebInspector.TextEditor.Options} options
+ */
+ constructor(options) {
+ super();
this._options = options;
- this.registerRequiredCSS("cm/codemirror.css");
- this.registerRequiredCSS("text_editor/cmdevtools.css");
+ this.registerRequiredCSS('cm/codemirror.css');
+ this.registerRequiredCSS('text_editor/cmdevtools.css');
WebInspector.CodeMirrorUtils.appendThemeStyle(this.element);
this._codeMirror = new window.CodeMirror(this.element, {
- lineNumbers: options.lineNumbers,
- matchBrackets: true,
- smartIndent: true,
- styleSelectedText: true,
- electricChars: true,
- styleActiveLine: true,
- indentUnit: 4,
- lineWrapping: options.lineWrapping
+ lineNumbers: options.lineNumbers,
+ matchBrackets: true,
+ smartIndent: true,
+ styleSelectedText: true,
+ electricChars: true,
+ styleActiveLine: true,
+ indentUnit: 4,
+ lineWrapping: options.lineWrapping
});
this._codeMirrorElement = this.element.lastElementChild;
this._codeMirror._codeMirrorTextEditor = this;
- CodeMirror.keyMap["devtools-common"] = {
- "Left": "goCharLeft",
- "Right": "goCharRight",
- "Up": "goLineUp",
- "Down": "goLineDown",
- "End": "goLineEnd",
- "Home": "goLineStartSmart",
- "PageUp": "smartPageUp",
- "PageDown": "smartPageDown",
- "Delete": "delCharAfter",
- "Backspace": "delCharBefore",
- "Tab": "defaultTab",
- "Shift-Tab": "indentLess",
- "Enter": "newlineAndIndent",
- "Ctrl-Space": "autocomplete",
- "Esc": "dismiss",
- "Ctrl-M": "gotoMatchingBracket"
+ CodeMirror.keyMap['devtools-common'] = {
+ 'Left': 'goCharLeft',
+ 'Right': 'goCharRight',
+ 'Up': 'goLineUp',
+ 'Down': 'goLineDown',
+ 'End': 'goLineEnd',
+ 'Home': 'goLineStartSmart',
+ 'PageUp': 'smartPageUp',
+ 'PageDown': 'smartPageDown',
+ 'Delete': 'delCharAfter',
+ 'Backspace': 'delCharBefore',
+ 'Tab': 'defaultTab',
+ 'Shift-Tab': 'indentLess',
+ 'Enter': 'newlineAndIndent',
+ 'Ctrl-Space': 'autocomplete',
+ 'Esc': 'dismiss',
+ 'Ctrl-M': 'gotoMatchingBracket'
};
- CodeMirror.keyMap["devtools-pc"] = {
- "Ctrl-A": "selectAll",
- "Ctrl-Z": "undoAndReveal",
- "Shift-Ctrl-Z": "redoAndReveal",
- "Ctrl-Y": "redo",
- "Ctrl-Home": "goDocStart",
- "Ctrl-Up": "goDocStart",
- "Ctrl-End": "goDocEnd",
- "Ctrl-Down": "goDocEnd",
- "Ctrl-Left": "goGroupLeft",
- "Ctrl-Right": "goGroupRight",
- "Alt-Left": "moveCamelLeft",
- "Alt-Right": "moveCamelRight",
- "Shift-Alt-Left": "selectCamelLeft",
- "Shift-Alt-Right": "selectCamelRight",
- "Ctrl-Backspace": "delGroupBefore",
- "Ctrl-Delete": "delGroupAfter",
- "Ctrl-/": "toggleComment",
- "Ctrl-D": "selectNextOccurrence",
- "Ctrl-U": "undoLastSelection",
- fallthrough: "devtools-common"
+ CodeMirror.keyMap['devtools-pc'] = {
+ 'Ctrl-A': 'selectAll',
+ 'Ctrl-Z': 'undoAndReveal',
+ 'Shift-Ctrl-Z': 'redoAndReveal',
+ 'Ctrl-Y': 'redo',
+ 'Ctrl-Home': 'goDocStart',
+ 'Ctrl-Up': 'goDocStart',
+ 'Ctrl-End': 'goDocEnd',
+ 'Ctrl-Down': 'goDocEnd',
+ 'Ctrl-Left': 'goGroupLeft',
+ 'Ctrl-Right': 'goGroupRight',
+ 'Alt-Left': 'moveCamelLeft',
+ 'Alt-Right': 'moveCamelRight',
+ 'Shift-Alt-Left': 'selectCamelLeft',
+ 'Shift-Alt-Right': 'selectCamelRight',
+ 'Ctrl-Backspace': 'delGroupBefore',
+ 'Ctrl-Delete': 'delGroupAfter',
+ 'Ctrl-/': 'toggleComment',
+ 'Ctrl-D': 'selectNextOccurrence',
+ 'Ctrl-U': 'undoLastSelection',
+ fallthrough: 'devtools-common'
};
- CodeMirror.keyMap["devtools-mac"] = {
- "Cmd-A" : "selectAll",
- "Cmd-Z" : "undoAndReveal",
- "Shift-Cmd-Z": "redoAndReveal",
- "Cmd-Up": "goDocStart",
- "Cmd-Down": "goDocEnd",
- "Alt-Left": "goGroupLeft",
- "Alt-Right": "goGroupRight",
- "Ctrl-Left": "moveCamelLeft",
- "Ctrl-Right": "moveCamelRight",
- "Ctrl-A": "goLineLeft",
- "Ctrl-E": "goLineRight",
- "Shift-Ctrl-Left": "selectCamelLeft",
- "Shift-Ctrl-Right": "selectCamelRight",
- "Cmd-Left": "goLineStartSmart",
- "Cmd-Right": "goLineEnd",
- "Cmd-Backspace": "delLineLeft",
- "Alt-Backspace": "delGroupBefore",
- "Alt-Delete": "delGroupAfter",
- "Cmd-/": "toggleComment",
- "Cmd-D": "selectNextOccurrence",
- "Cmd-U": "undoLastSelection",
- fallthrough: "devtools-common"
+ CodeMirror.keyMap['devtools-mac'] = {
+ 'Cmd-A': 'selectAll',
+ 'Cmd-Z': 'undoAndReveal',
+ 'Shift-Cmd-Z': 'redoAndReveal',
+ 'Cmd-Up': 'goDocStart',
+ 'Cmd-Down': 'goDocEnd',
+ 'Alt-Left': 'goGroupLeft',
+ 'Alt-Right': 'goGroupRight',
+ 'Ctrl-Left': 'moveCamelLeft',
+ 'Ctrl-Right': 'moveCamelRight',
+ 'Ctrl-A': 'goLineLeft',
+ 'Ctrl-E': 'goLineRight',
+ 'Shift-Ctrl-Left': 'selectCamelLeft',
+ 'Shift-Ctrl-Right': 'selectCamelRight',
+ 'Cmd-Left': 'goLineStartSmart',
+ 'Cmd-Right': 'goLineEnd',
+ 'Cmd-Backspace': 'delLineLeft',
+ 'Alt-Backspace': 'delGroupBefore',
+ 'Alt-Delete': 'delGroupAfter',
+ 'Cmd-/': 'toggleComment',
+ 'Cmd-D': 'selectNextOccurrence',
+ 'Cmd-U': 'undoLastSelection',
+ fallthrough: 'devtools-common'
};
if (options.bracketMatchingSetting)
- options.bracketMatchingSetting.addChangeListener(this._enableBracketMatchingIfNeeded, this);
+ options.bracketMatchingSetting.addChangeListener(this._enableBracketMatchingIfNeeded, this);
this._enableBracketMatchingIfNeeded();
- this._codeMirror.setOption("keyMap", WebInspector.isMac() ? "devtools-mac" : "devtools-pc");
+ this._codeMirror.setOption('keyMap', WebInspector.isMac() ? 'devtools-mac' : 'devtools-pc');
- this._codeMirror.addKeyMap({
- "'": "maybeAvoidSmartSingleQuotes",
- "'\"'": "maybeAvoidSmartDoubleQuotes"
- });
+ this._codeMirror.addKeyMap({'\'': 'maybeAvoidSmartSingleQuotes', '\'"\'': 'maybeAvoidSmartDoubleQuotes'});
- this._codeMirror.setOption("flattenSpans", false);
+ this._codeMirror.setOption('flattenSpans', false);
- this._codeMirror.setOption("maxHighlightLength", WebInspector.CodeMirrorTextEditor.maxHighlightLength);
- this._codeMirror.setOption("mode", null);
- this._codeMirror.setOption("crudeMeasuringFrom", 1000);
+ this._codeMirror.setOption('maxHighlightLength', WebInspector.CodeMirrorTextEditor.maxHighlightLength);
+ this._codeMirror.setOption('mode', null);
+ this._codeMirror.setOption('crudeMeasuringFrom', 1000);
this._shouldClearHistory = true;
- this._lineSeparator = "\n";
+ this._lineSeparator = '\n';
this._fixWordMovement = new WebInspector.CodeMirrorTextEditor.FixWordMovement(this._codeMirror);
- this._selectNextOccurrenceController = new WebInspector.CodeMirrorTextEditor.SelectNextOccurrenceController(this, this._codeMirror);
+ this._selectNextOccurrenceController =
+ new WebInspector.CodeMirrorTextEditor.SelectNextOccurrenceController(this, this._codeMirror);
- this._codeMirror.on("changes", this._changes.bind(this));
- this._codeMirror.on("beforeSelectionChange", this._beforeSelectionChange.bind(this));
- this._codeMirror.on("keyHandled", this._onKeyHandled.bind(this));
+ this._codeMirror.on('changes', this._changes.bind(this));
+ this._codeMirror.on('beforeSelectionChange', this._beforeSelectionChange.bind(this));
+ this._codeMirror.on('keyHandled', this._onKeyHandled.bind(this));
- this.element.style.overflow = "hidden";
- this._codeMirrorElement.classList.add("source-code");
- this._codeMirrorElement.classList.add("fill");
+ this.element.style.overflow = 'hidden';
+ this._codeMirrorElement.classList.add('source-code');
+ this._codeMirrorElement.classList.add('fill');
/** @type {!Multimap<number, !WebInspector.CodeMirrorTextEditor.Decoration>} */
this._decorations = new Multimap();
this._nestedUpdatesCounter = 0;
- this.element.addEventListener("focus", this._handleElementFocus.bind(this), false);
- this.element.addEventListener("keydown", this._handleKeyDown.bind(this), true);
- this.element.addEventListener("keydown", this._handlePostKeyDown.bind(this), false);
+ this.element.addEventListener('focus', this._handleElementFocus.bind(this), false);
+ this.element.addEventListener('keydown', this._handleKeyDown.bind(this), true);
+ this.element.addEventListener('keydown', this._handlePostKeyDown.bind(this), false);
this.element.tabIndex = 0;
this._needsRefresh = true;
if (options.mimeType)
- this.setMimeType(options.mimeType);
+ this.setMimeType(options.mimeType);
if (options.autoHeight)
- this._codeMirror.setSize(null, "auto");
-};
+ this._codeMirror.setSize(null, 'auto');
+ }
-WebInspector.CodeMirrorTextEditor.maxHighlightLength = 1000;
-
-/**
- * @param {!CodeMirror} codeMirror
- */
-WebInspector.CodeMirrorTextEditor.autocompleteCommand = function(codeMirror)
-{
+ /**
+ * @param {!CodeMirror} codeMirror
+ */
+ static autocompleteCommand(codeMirror) {
var autocompleteController = codeMirror._codeMirrorTextEditor._autocompleteController;
if (autocompleteController)
- autocompleteController.autocomplete();
-};
-CodeMirror.commands.autocomplete = WebInspector.CodeMirrorTextEditor.autocompleteCommand;
+ autocompleteController.autocomplete();
+ }
-/**
- * @param {!CodeMirror} codeMirror
- */
-WebInspector.CodeMirrorTextEditor.undoLastSelectionCommand = function(codeMirror)
-{
+ /**
+ * @param {!CodeMirror} codeMirror
+ */
+ static undoLastSelectionCommand(codeMirror) {
codeMirror._codeMirrorTextEditor._selectNextOccurrenceController.undoLastSelection();
-};
-CodeMirror.commands.undoLastSelection = WebInspector.CodeMirrorTextEditor.undoLastSelectionCommand;
+ }
-/**
- * @param {!CodeMirror} codeMirror
- */
-WebInspector.CodeMirrorTextEditor.selectNextOccurrenceCommand = function(codeMirror)
-{
+ /**
+ * @param {!CodeMirror} codeMirror
+ */
+ static selectNextOccurrenceCommand(codeMirror) {
codeMirror._codeMirrorTextEditor._selectNextOccurrenceController.selectNextOccurrence();
-};
-CodeMirror.commands.selectNextOccurrence = WebInspector.CodeMirrorTextEditor.selectNextOccurrenceCommand;
+ }
-/**
- * @param {boolean} shift
- * @param {!CodeMirror} codeMirror
- */
-WebInspector.CodeMirrorTextEditor.moveCamelLeftCommand = function(shift, codeMirror)
-{
+ /**
+ * @param {boolean} shift
+ * @param {!CodeMirror} codeMirror
+ */
+ static moveCamelLeftCommand(shift, codeMirror) {
codeMirror._codeMirrorTextEditor._doCamelCaseMovement(-1, shift);
-};
-CodeMirror.commands.moveCamelLeft = WebInspector.CodeMirrorTextEditor.moveCamelLeftCommand.bind(null, false);
-CodeMirror.commands.selectCamelLeft = WebInspector.CodeMirrorTextEditor.moveCamelLeftCommand.bind(null, true);
+ }
-/**
- * @param {boolean} shift
- * @param {!CodeMirror} codeMirror
- */
-WebInspector.CodeMirrorTextEditor.moveCamelRightCommand = function(shift, codeMirror)
-{
+ /**
+ * @param {boolean} shift
+ * @param {!CodeMirror} codeMirror
+ */
+ static moveCamelRightCommand(shift, codeMirror) {
codeMirror._codeMirrorTextEditor._doCamelCaseMovement(1, shift);
-};
-CodeMirror.commands.moveCamelRight = WebInspector.CodeMirrorTextEditor.moveCamelRightCommand.bind(null, false);
-CodeMirror.commands.selectCamelRight = WebInspector.CodeMirrorTextEditor.moveCamelRightCommand.bind(null, true);
-
-/**
- * @param {!CodeMirror} codeMirror
- */
-CodeMirror.commands.gotoMatchingBracket = function(codeMirror)
-{
- var updatedSelections = [];
- var selections = codeMirror.listSelections();
- for (var i = 0; i < selections.length; ++i) {
- var selection = selections[i];
- var cursor = selection.head;
- var matchingBracket = codeMirror.findMatchingBracket(cursor, false, { maxScanLines: 10000 });
- var updatedHead = cursor;
- if (matchingBracket && matchingBracket.match) {
- var columnCorrection = CodeMirror.cmpPos(matchingBracket.from, cursor) === 0 ? 1 : 0;
- updatedHead = new CodeMirror.Pos(matchingBracket.to.line, matchingBracket.to.ch + columnCorrection);
- }
- updatedSelections.push({
- anchor: updatedHead,
- head: updatedHead
- });
- }
- codeMirror.setSelections(updatedSelections);
-};
-
-/**
- * @param {!CodeMirror} codemirror
- */
-CodeMirror.commands.undoAndReveal = function(codemirror)
-{
- var scrollInfo = codemirror.getScrollInfo();
- codemirror.execCommand("undo");
- var cursor = codemirror.getCursor("start");
- codemirror._codeMirrorTextEditor._innerRevealLine(cursor.line, scrollInfo);
- var autocompleteController = codemirror._codeMirrorTextEditor._autocompleteController;
- if (autocompleteController)
- autocompleteController.clearAutocomplete();
-};
-
-/**
- * @param {!CodeMirror} codemirror
- */
-CodeMirror.commands.redoAndReveal = function(codemirror)
-{
- var scrollInfo = codemirror.getScrollInfo();
- codemirror.execCommand("redo");
- var cursor = codemirror.getCursor("start");
- codemirror._codeMirrorTextEditor._innerRevealLine(cursor.line, scrollInfo);
- var autocompleteController = codemirror._codeMirrorTextEditor._autocompleteController;
- if (autocompleteController)
- autocompleteController.clearAutocomplete();
-};
-
-/**
- * @return {!Object|undefined}
- */
-CodeMirror.commands.dismiss = function(codemirror)
-{
- var selections = codemirror.listSelections();
- var selection = selections[0];
- if (selections.length === 1) {
- if (WebInspector.CodeMirrorUtils.toRange(selection.anchor, selection.head).isEmpty())
- return CodeMirror.Pass;
- codemirror.setSelection(selection.anchor, selection.anchor, {scroll: false});
- codemirror._codeMirrorTextEditor.scrollLineIntoView(selection.anchor.line);
- return;
- }
-
- codemirror.setSelection(selection.anchor, selection.head, {scroll: false});
- codemirror._codeMirrorTextEditor.scrollLineIntoView(selection.anchor.line);
-};
-
-/**
- * @return {!Object|undefined}
- */
-CodeMirror.commands.smartPageUp = function(codemirror)
-{
- if (codemirror._codeMirrorTextEditor.selection().equal(WebInspector.TextRange.createFromLocation(0, 0)))
- return CodeMirror.Pass;
- codemirror.execCommand("goPageUp");
-};
-
-/**
- * @return {!Object|undefined}
- */
-CodeMirror.commands.smartPageDown = function(codemirror)
-{
- if (codemirror._codeMirrorTextEditor.selection().equal(codemirror._codeMirrorTextEditor.fullRange().collapseToEnd()))
- return CodeMirror.Pass;
- codemirror.execCommand("goPageDown");
-};
-
-/**
- * @param {string} quoteCharacter
- * @param {!CodeMirror} codeMirror
- * @return {*}
- */
-WebInspector.CodeMirrorTextEditor._maybeAvoidSmartQuotes = function(quoteCharacter, codeMirror)
-{
+ }
+
+ /**
+ * @param {string} quoteCharacter
+ * @param {!CodeMirror} codeMirror
+ * @return {*}
+ */
+ static _maybeAvoidSmartQuotes(quoteCharacter, codeMirror) {
var textEditor = codeMirror._codeMirrorTextEditor;
- if (!codeMirror.getOption("autoCloseBrackets"))
- return CodeMirror.Pass;
+ if (!codeMirror.getOption('autoCloseBrackets'))
+ return CodeMirror.Pass;
var selections = textEditor.selections();
if (selections.length !== 1 || !selections[0].isEmpty())
- return CodeMirror.Pass;
+ return CodeMirror.Pass;
var selection = selections[0];
var token = textEditor.tokenAtTextPosition(selection.startLine, selection.startColumn);
- if (!token || !token.type || token.type.indexOf("string") === -1)
- return CodeMirror.Pass;
+ if (!token || !token.type || token.type.indexOf('string') === -1)
+ return CodeMirror.Pass;
var line = textEditor.line(selection.startLine);
var tokenValue = line.substring(token.startColumn, token.endColumn);
- if (tokenValue[0] === tokenValue[tokenValue.length - 1] && (tokenValue[0] === "'" || tokenValue[0] === "\""))
- return CodeMirror.Pass;
+ if (tokenValue[0] === tokenValue[tokenValue.length - 1] && (tokenValue[0] === '\'' || tokenValue[0] === '"'))
+ return CodeMirror.Pass;
codeMirror.replaceSelection(quoteCharacter);
-};
-CodeMirror.commands.maybeAvoidSmartSingleQuotes = WebInspector.CodeMirrorTextEditor._maybeAvoidSmartQuotes.bind(null, "'");
-CodeMirror.commands.maybeAvoidSmartDoubleQuotes = WebInspector.CodeMirrorTextEditor._maybeAvoidSmartQuotes.bind(null, "\"");
-
-WebInspector.CodeMirrorTextEditor.LongLineModeLineLengthThreshold = 2000;
-WebInspector.CodeMirrorTextEditor.MaxEditableTextSize = 1024 * 1024 * 10;
-
-WebInspector.CodeMirrorTextEditor.prototype = {
- /**
- * @protected
- * @return {!CodeMirror}
- */
- codeMirror: function()
- {
- return this._codeMirror;
- },
-
- /**
- * @override
- * @return {!WebInspector.Widget}
- */
- widget: function()
- {
- return this;
- },
-
- _onKeyHandled: function()
- {
- WebInspector.shortcutRegistry.dismissPendingShortcutAction();
- },
-
-
- /**
- * @param {number} lineNumber
- * @param {number} lineLength
- * @param {number} charNumber
- * @return {{lineNumber: number, columnNumber: number}}
- */
- _normalizePositionForOverlappingColumn: function(lineNumber, lineLength, charNumber)
- {
- var linesCount = this._codeMirror.lineCount();
- var columnNumber = charNumber;
- if (charNumber < 0 && lineNumber > 0) {
- --lineNumber;
- columnNumber = this.line(lineNumber).length;
- } else if (charNumber >= lineLength && lineNumber < linesCount - 1) {
- ++lineNumber;
- columnNumber = 0;
- } else {
- columnNumber = Number.constrain(charNumber, 0, lineLength);
- }
- return {
- lineNumber: lineNumber,
- columnNumber: columnNumber
- };
- },
-
- /**
- * @param {number} lineNumber
- * @param {number} columnNumber
- * @param {number} direction
- * @return {{lineNumber: number, columnNumber: number}}
- */
- _camelCaseMoveFromPosition: function(lineNumber, columnNumber, direction)
- {
- /**
- * @param {number} charNumber
- * @param {number} length
- * @return {boolean}
- */
- function valid(charNumber, length)
- {
- return charNumber >= 0 && charNumber < length;
- }
-
- /**
- * @param {string} text
- * @param {number} charNumber
- * @return {boolean}
- */
- function isWordStart(text, charNumber)
- {
- var position = charNumber;
- var nextPosition = charNumber + 1;
- return valid(position, text.length) && valid(nextPosition, text.length)
- && WebInspector.TextUtils.isWordChar(text[position]) && WebInspector.TextUtils.isWordChar(text[nextPosition])
- && WebInspector.TextUtils.isUpperCase(text[position]) && WebInspector.TextUtils.isLowerCase(text[nextPosition]);
- }
-
- /**
- * @param {string} text
- * @param {number} charNumber
- * @return {boolean}
- */
- function isWordEnd(text, charNumber)
- {
- var position = charNumber;
- var prevPosition = charNumber - 1;
- return valid(position, text.length) && valid(prevPosition, text.length)
- && WebInspector.TextUtils.isWordChar(text[position]) && WebInspector.TextUtils.isWordChar(text[prevPosition])
- && WebInspector.TextUtils.isUpperCase(text[position]) && WebInspector.TextUtils.isLowerCase(text[prevPosition]);
- }
-
- /**
- * @param {number} lineNumber
- * @param {number} lineLength
- * @param {number} columnNumber
- * @return {{lineNumber: number, columnNumber: number}}
- */
- function constrainPosition(lineNumber, lineLength, columnNumber)
- {
- return {
- lineNumber: lineNumber,
- columnNumber: Number.constrain(columnNumber, 0, lineLength)
- };
- }
-
- var text = this.line(lineNumber);
- var length = text.length;
-
- if ((columnNumber === length && direction === 1)
- || (columnNumber === 0 && direction === -1))
- return this._normalizePositionForOverlappingColumn(lineNumber, length, columnNumber + direction);
-
- var charNumber = direction === 1 ? columnNumber : columnNumber - 1;
-
- // Move through initial spaces if any.
- while (valid(charNumber, length) && WebInspector.TextUtils.isSpaceChar(text[charNumber]))
- charNumber += direction;
- if (!valid(charNumber, length))
- return constrainPosition(lineNumber, length, charNumber);
-
- if (WebInspector.TextUtils.isStopChar(text[charNumber])) {
- while (valid(charNumber, length) && WebInspector.TextUtils.isStopChar(text[charNumber]))
- charNumber += direction;
- if (!valid(charNumber, length))
- return constrainPosition(lineNumber, length, charNumber);
- return {
- lineNumber: lineNumber,
- columnNumber: direction === -1 ? charNumber + 1 : charNumber
- };
- }
-
- charNumber += direction;
- while (valid(charNumber, length) && !isWordStart(text, charNumber) && !isWordEnd(text, charNumber) && WebInspector.TextUtils.isWordChar(text[charNumber]))
- charNumber += direction;
-
- if (!valid(charNumber, length))
- return constrainPosition(lineNumber, length, charNumber);
- if (isWordStart(text, charNumber) || isWordEnd(text, charNumber)) {
- return {
- lineNumber: lineNumber,
- columnNumber: charNumber
- };
- }
-
- return {
- lineNumber: lineNumber,
- columnNumber: direction === -1 ? charNumber + 1 : charNumber
- };
- },
-
- /**
- * @param {number} direction
- * @param {boolean} shift
- */
- _doCamelCaseMovement: function(direction, shift)
- {
- var selections = this.selections();
- for (var i = 0; i < selections.length; ++i) {
- var selection = selections[i];
- var move = this._camelCaseMoveFromPosition(selection.endLine, selection.endColumn, direction);
- selection.endLine = move.lineNumber;
- selection.endColumn = move.columnNumber;
- if (!shift)
- selections[i] = selection.collapseToEnd();
- }
- this.setSelections(selections);
- },
-
- dispose: function()
- {
- if (this._options.bracketMatchingSetting)
- this._options.bracketMatchingSetting.removeChangeListener(this._enableBracketMatchingIfNeeded, this);
- },
-
- _enableBracketMatchingIfNeeded: function()
- {
- this._codeMirror.setOption("autoCloseBrackets", (this._options.bracketMatchingSetting && this._options.bracketMatchingSetting.get()) ? { explode: false } : false);
- },
-
- /**
- * @override
- */
- wasShown: function()
- {
- if (this._needsRefresh)
- this.refresh();
- },
-
- /**
- * @protected
- */
- refresh: function()
- {
- if (this.isShowing()) {
- this._codeMirror.refresh();
- this._needsRefresh = false;
- return;
- }
- this._needsRefresh = true;
- },
-
- /**
- * @override
- */
- willHide: function()
- {
- delete this._editorSizeInSync;
- },
-
- undo: function()
- {
- this._codeMirror.undo();
- },
+ }
+
+ /**
+ * @param {string} modeName
+ * @param {string} tokenPrefix
+ */
+ static _overrideModeWithPrefixedTokens(modeName, tokenPrefix) {
+ var oldModeName = modeName + '-old';
+ if (CodeMirror.modes[oldModeName])
+ return;
- redo: function()
- {
- this._codeMirror.redo();
- },
+ CodeMirror.defineMode(oldModeName, CodeMirror.modes[modeName]);
+ CodeMirror.defineMode(modeName, modeConstructor);
- /**
- * @param {!Event} e
- */
- _handleKeyDown: function(e)
- {
- if (this._autocompleteController && this._autocompleteController.keyDown(e))
- e.consume(true);
- },
+ function modeConstructor(config, parserConfig) {
+ var innerConfig = {};
+ for (var i in parserConfig)
+ innerConfig[i] = parserConfig[i];
+ innerConfig.name = oldModeName;
+ var codeMirrorMode = CodeMirror.getMode(config, innerConfig);
+ codeMirrorMode.name = modeName;
+ codeMirrorMode.token = tokenOverride.bind(null, codeMirrorMode.token);
+ return codeMirrorMode;
+ }
- /**
- * @param {!Event} e
- */
- _handlePostKeyDown: function(e)
- {
- if (e.defaultPrevented)
- e.consume(true);
- },
+ function tokenOverride(superToken, stream, state) {
+ var token = superToken(stream, state);
+ return token ? tokenPrefix + token.split(/ +/).join(' ' + tokenPrefix) : token;
+ }
+ }
- /**
- * @override
- * @param {?WebInspector.AutocompleteConfig} config
- */
- configureAutocomplete: function(config)
- {
- if (this._autocompleteController) {
- this._autocompleteController.dispose();
- delete this._autocompleteController;
- }
+ /**
+ * @param {string} mimeType
+ * @return {!Promise}
+ */
+ static _loadMimeTypeModes(mimeType) {
+ var installed = WebInspector.CodeMirrorTextEditor._loadedMimeModeExtensions;
- if (config)
- this._autocompleteController = new WebInspector.TextEditorAutocompleteController(this, this._codeMirror, config);
- },
+ var nameToExtension = new Map();
+ var extensions = self.runtime.extensions(WebInspector.CodeMirrorMimeMode);
+ for (var extension of extensions)
+ nameToExtension.set(extension.descriptor()['fileName'], extension);
- /**
- * @param {number} lineNumber
- * @param {number} column
- * @return {?{x: number, y: number, height: number}}
- */
- cursorPositionToCoordinates: function(lineNumber, column)
- {
- if (lineNumber >= this._codeMirror.lineCount() || lineNumber < 0 || column < 0 || column > this._codeMirror.getLine(lineNumber).length)
- return null;
- var metrics = this._codeMirror.cursorCoords(new CodeMirror.Pos(lineNumber, column));
- return {
- x: metrics.left,
- y: metrics.top,
- height: metrics.bottom - metrics.top
- };
- },
+ var modesToLoad = new Set();
+ for (var extension of extensions) {
+ var descriptor = extension.descriptor();
+ if (installed.has(extension) || descriptor['mimeTypes'].indexOf(mimeType) === -1)
+ continue;
+
+ modesToLoad.add(extension);
+ var deps = descriptor['dependencies'] || [];
+ for (var i = 0; i < deps.length; ++i) {
+ var extension = nameToExtension.get(deps[i]);
+ if (extension && !installed.has(extension))
+ modesToLoad.add(extension);
+ }
+ }
- /**
- * @param {number} x
- * @param {number} y
- * @return {?WebInspector.TextRange}
- */
- coordinatesToCursorPosition: function(x, y)
- {
- var element = this.element.ownerDocument.elementFromPoint(x, y);
- if (!element || !element.isSelfOrDescendant(this._codeMirror.getWrapperElement()))
- return null;
- var gutterBox = this._codeMirror.getGutterElement().boxInWindow();
- if (x >= gutterBox.x && x <= gutterBox.x + gutterBox.width &&
- y >= gutterBox.y && y <= gutterBox.y + gutterBox.height)
- return null;
- var coords = this._codeMirror.coordsChar({left: x, top: y});
- return WebInspector.CodeMirrorUtils.toRange(coords, coords);
- },
+ var promises = [];
+ for (var extension of modesToLoad)
+ promises.push(extension.instance().then(installMode.bind(null, extension)));
+ return Promise.all(promises);
/**
- * @param {number} lineNumber
- * @param {number} column
- * @return {?{startColumn: number, endColumn: number, type: string}}
+ * @param {!Runtime.Extension} extension
+ * @param {!Object} instance
*/
- tokenAtTextPosition: function(lineNumber, column)
- {
- if (lineNumber < 0 || lineNumber >= this._codeMirror.lineCount())
- return null;
- var token = this._codeMirror.getTokenAt(new CodeMirror.Pos(lineNumber, (column || 0) + 1));
- if (!token)
- return null;
- return {
- startColumn: token.start,
- endColumn: token.end,
- type: token.type
- };
- },
+ function installMode(extension, instance) {
+ if (installed.has(extension))
+ return;
+ var mode = /** @type {!WebInspector.CodeMirrorMimeMode} */ (instance);
+ mode.install(extension);
+ installed.add(extension);
+ }
+ }
+
+ /**
+ * @protected
+ * @return {!CodeMirror}
+ */
+ codeMirror() {
+ return this._codeMirror;
+ }
+
+ /**
+ * @override
+ * @return {!WebInspector.Widget}
+ */
+ widget() {
+ return this;
+ }
+
+ _onKeyHandled() {
+ WebInspector.shortcutRegistry.dismissPendingShortcutAction();
+ }
+
+ /**
+ * @param {number} lineNumber
+ * @param {number} lineLength
+ * @param {number} charNumber
+ * @return {{lineNumber: number, columnNumber: number}}
+ */
+ _normalizePositionForOverlappingColumn(lineNumber, lineLength, charNumber) {
+ var linesCount = this._codeMirror.lineCount();
+ var columnNumber = charNumber;
+ if (charNumber < 0 && lineNumber > 0) {
+ --lineNumber;
+ columnNumber = this.line(lineNumber).length;
+ } else if (charNumber >= lineLength && lineNumber < linesCount - 1) {
+ ++lineNumber;
+ columnNumber = 0;
+ } else {
+ columnNumber = Number.constrain(charNumber, 0, lineLength);
+ }
+ return {lineNumber: lineNumber, columnNumber: columnNumber};
+ }
+ /**
+ * @param {number} lineNumber
+ * @param {number} columnNumber
+ * @param {number} direction
+ * @return {{lineNumber: number, columnNumber: number}}
+ */
+ _camelCaseMoveFromPosition(lineNumber, columnNumber, direction) {
/**
+ * @param {number} charNumber
+ * @param {number} length
* @return {boolean}
*/
- isClean: function()
- {
- return this._codeMirror.isClean();
- },
-
- markClean: function()
- {
- this._codeMirror.markClean();
- },
+ function valid(charNumber, length) {
+ return charNumber >= 0 && charNumber < length;
+ }
/**
+ * @param {string} text
+ * @param {number} charNumber
* @return {boolean}
*/
- _hasLongLines: function()
- {
- function lineIterator(lineHandle)
- {
- if (lineHandle.text.length > WebInspector.CodeMirrorTextEditor.LongLineModeLineLengthThreshold)
- hasLongLines = true;
- return hasLongLines;
- }
- var hasLongLines = false;
- this._codeMirror.eachLine(lineIterator);
- return hasLongLines;
- },
-
- _enableLongLinesMode: function()
- {
- this._codeMirror.setOption("styleSelectedText", false);
- },
-
- _disableLongLinesMode: function()
- {
- this._codeMirror.setOption("styleSelectedText", true);
- },
-
- /**
- * @param {string} mimeType
- * @return {!Promise}
- */
- setMimeType: function(mimeType)
- {
- if (this._hasLongLines())
- this._enableLongLinesMode();
- else
- this._disableLongLinesMode();
- return WebInspector.CodeMirrorTextEditor._loadMimeTypeModes(mimeType).then(() => this._codeMirror.setOption("mode", mimeType));
- },
-
- /**
- * @param {boolean} readOnly
- */
- setReadOnly: function(readOnly)
- {
- this.element.classList.toggle("CodeMirror-readonly", readOnly);
- this._codeMirror.setOption("readOnly", readOnly);
- },
+ function isWordStart(text, charNumber) {
+ var position = charNumber;
+ var nextPosition = charNumber + 1;
+ return valid(position, text.length) && valid(nextPosition, text.length) &&
+ WebInspector.TextUtils.isWordChar(text[position]) && WebInspector.TextUtils.isWordChar(text[nextPosition]) &&
+ WebInspector.TextUtils.isUpperCase(text[position]) && WebInspector.TextUtils.isLowerCase(text[nextPosition]);
+ }
/**
+ * @param {string} text
+ * @param {number} charNumber
* @return {boolean}
*/
- readOnly: function()
- {
- return !!this._codeMirror.getOption("readOnly");
- },
-
- /**
- * @override
- * @param {function(!KeyboardEvent)} handler
- */
- addKeyDownHandler: function(handler)
- {
- this._codeMirror.on("keydown", (CodeMirror, event) => handler(event));
- },
+ function isWordEnd(text, charNumber) {
+ var position = charNumber;
+ var prevPosition = charNumber - 1;
+ return valid(position, text.length) && valid(prevPosition, text.length) &&
+ WebInspector.TextUtils.isWordChar(text[position]) && WebInspector.TextUtils.isWordChar(text[prevPosition]) &&
+ WebInspector.TextUtils.isUpperCase(text[position]) && WebInspector.TextUtils.isLowerCase(text[prevPosition]);
+ }
/**
* @param {number} lineNumber
+ * @param {number} lineLength
* @param {number} columnNumber
- * @param {!Element} element
- * @param {symbol} type
- * @param {boolean=} insertBefore
- * @return {!WebInspector.TextEditorBookMark}
- */
- addBookmark: function(lineNumber, columnNumber, element, type, insertBefore)
- {
- var bookmark = new WebInspector.TextEditorBookMark(this._codeMirror.setBookmark(new CodeMirror.Pos(lineNumber, columnNumber), {
- widget: element,
- insertLeft: insertBefore
- }), type, this);
- this._updateDecorations(lineNumber);
- return bookmark;
- },
-
- /**
- * @param {!WebInspector.TextRange} range
- * @param {symbol=} type
- * @return {!Array.<!WebInspector.TextEditorBookMark>}
- */
- bookmarks: function(range, type)
- {
- var pos = WebInspector.CodeMirrorUtils.toPos(range);
- var markers = this._codeMirror.findMarksAt(pos.start);
- if (!range.isEmpty()) {
- var middleMarkers = this._codeMirror.findMarks(pos.start, pos.end);
- var endMarkers = this._codeMirror.findMarksAt(pos.end);
- markers = markers.concat(middleMarkers, endMarkers);
- }
- var bookmarks = [];
- for (var i = 0; i < markers.length; i++) {
- var bookmark = markers[i][WebInspector.TextEditorBookMark._symbol];
- if (bookmark && (!type || bookmark.type() === type))
- bookmarks.push(bookmark);
- }
- return bookmarks;
- },
-
- focus: function()
- {
- this._codeMirror.focus();
- },
-
- /**
- * @override
- * @return {boolean}
- */
- hasFocus: function()
- {
- return this._codeMirror.hasFocus();
- },
-
- _handleElementFocus: function()
- {
- this._codeMirror.focus();
- },
-
- /**
- * @param {function()} operation
- */
- operation: function(operation)
- {
- this._codeMirror.operation(operation);
- },
-
- /**
- * @param {number} lineNumber
- */
- scrollLineIntoView: function(lineNumber)
- {
- this._innerRevealLine(lineNumber, this._codeMirror.getScrollInfo());
- },
-
- /**
- * @param {number} lineNumber
- * @param {!{left: number, top: number, width: number, height: number, clientWidth: number, clientHeight: number}} scrollInfo
- */
- _innerRevealLine: function(lineNumber, scrollInfo)
- {
- var topLine = this._codeMirror.lineAtHeight(scrollInfo.top, "local");
- var bottomLine = this._codeMirror.lineAtHeight(scrollInfo.top + scrollInfo.clientHeight, "local");
- var linesPerScreen = bottomLine - topLine + 1;
- if (lineNumber < topLine) {
- var topLineToReveal = Math.max(lineNumber - (linesPerScreen / 2) + 1, 0) | 0;
- this._codeMirror.scrollIntoView(new CodeMirror.Pos(topLineToReveal, 0));
- } else if (lineNumber > bottomLine) {
- var bottomLineToReveal = Math.min(lineNumber + (linesPerScreen / 2) - 1, this.linesCount - 1) | 0;
- this._codeMirror.scrollIntoView(new CodeMirror.Pos(bottomLineToReveal, 0));
- }
- },
-
- /**
- * @param {!Element} element
- * @param {number} lineNumber
- * @param {number=} startColumn
- * @param {number=} endColumn
- */
- addDecoration: function(element, lineNumber, startColumn, endColumn)
- {
- var widget = this._codeMirror.addLineWidget(lineNumber, element);
- var update = null;
- if (typeof startColumn !== "undefined") {
- if (typeof endColumn === "undefined")
- endColumn = Infinity;
- update = this._updateFloatingDecoration.bind(this, element, lineNumber, startColumn, endColumn);
- update();
- }
-
- this._decorations.set(lineNumber, {
- element: element,
- update: update,
- widget: widget
- });
- },
-
- /**
- * @param {!Element} element
- * @param {number} lineNumber
- * @param {number} startColumn
- * @param {number} endColumn
+ * @return {{lineNumber: number, columnNumber: number}}
*/
- _updateFloatingDecoration: function(element, lineNumber, startColumn, endColumn)
- {
- var base = this._codeMirror.cursorCoords(new CodeMirror.Pos(lineNumber, 0), "page");
- var start = this._codeMirror.cursorCoords(new CodeMirror.Pos(lineNumber, startColumn), "page");
- var end = this._codeMirror.charCoords(new CodeMirror.Pos(lineNumber, endColumn), "page");
- element.style.width = (end.right - start.left) + "px";
- element.style.left = (start.left - base.left) + "px";
- },
+ function constrainPosition(lineNumber, lineLength, columnNumber) {
+ return {lineNumber: lineNumber, columnNumber: Number.constrain(columnNumber, 0, lineLength)};
+ }
- /**
- * @param {number} lineNumber
- */
- _updateDecorations: function(lineNumber)
- {
- this._decorations.get(lineNumber).forEach(innerUpdateDecorations);
-
- /**
- * @param {!WebInspector.CodeMirrorTextEditor.Decoration} decoration
- */
- function innerUpdateDecorations(decoration)
- {
- if (decoration.update)
- decoration.update();
- }
- },
+ var text = this.line(lineNumber);
+ var length = text.length;
- /**
- * @param {!Element} element
- * @param {number} lineNumber
- */
- removeDecoration: function(element, lineNumber)
- {
- this._decorations.get(lineNumber).forEach(innerRemoveDecoration.bind(this));
-
- /**
- * @this {WebInspector.CodeMirrorTextEditor}
- * @param {!WebInspector.CodeMirrorTextEditor.Decoration} decoration
- */
- function innerRemoveDecoration(decoration)
- {
- if (decoration.element !== element)
- return;
- this._codeMirror.removeLineWidget(decoration.widget);
- this._decorations.remove(lineNumber, decoration);
- }
- },
+ if ((columnNumber === length && direction === 1) || (columnNumber === 0 && direction === -1))
+ return this._normalizePositionForOverlappingColumn(lineNumber, length, columnNumber + direction);
- /**
- * @param {number} lineNumber 0-based
- * @param {number=} columnNumber
- * @param {boolean=} shouldHighlight
- */
- revealPosition: function(lineNumber, columnNumber, shouldHighlight)
- {
- lineNumber = Number.constrain(lineNumber, 0, this._codeMirror.lineCount() - 1);
- if (typeof columnNumber !== "number")
- columnNumber = 0;
- columnNumber = Number.constrain(columnNumber, 0, this._codeMirror.getLine(lineNumber).length);
-
- this.clearPositionHighlight();
- this._highlightedLine = this._codeMirror.getLineHandle(lineNumber);
- if (!this._highlightedLine)
- return;
- this.scrollLineIntoView(lineNumber);
- if (shouldHighlight) {
- this._codeMirror.addLineClass(this._highlightedLine, null, "cm-highlight");
- this._clearHighlightTimeout = setTimeout(this.clearPositionHighlight.bind(this), 2000);
- }
- this.setSelection(WebInspector.TextRange.createFromLocation(lineNumber, columnNumber));
- },
-
- clearPositionHighlight: function()
- {
- if (this._clearHighlightTimeout)
- clearTimeout(this._clearHighlightTimeout);
- delete this._clearHighlightTimeout;
-
- if (this._highlightedLine)
- this._codeMirror.removeLineClass(this._highlightedLine, null, "cm-highlight");
- delete this._highlightedLine;
- },
+ var charNumber = direction === 1 ? columnNumber : columnNumber - 1;
- /**
- * @override
- * @return {!Array.<!Element>}
- */
- elementsToRestoreScrollPositionsFor: function()
- {
- return [];
- },
+ // Move through initial spaces if any.
+ while (valid(charNumber, length) && WebInspector.TextUtils.isSpaceChar(text[charNumber]))
+ charNumber += direction;
+ if (!valid(charNumber, length))
+ return constrainPosition(lineNumber, length, charNumber);
- /**
- * @param {number} width
- * @param {number} height
- */
- _updatePaddingBottom: function(width, height)
- {
- var scrollInfo = this._codeMirror.getScrollInfo();
- var newPaddingBottom;
- var linesElement = this._codeMirrorElement.querySelector(".CodeMirror-lines");
- var lineCount = this._codeMirror.lineCount();
- if (lineCount <= 1)
- newPaddingBottom = 0;
- else
- newPaddingBottom = Math.max(scrollInfo.clientHeight - this._codeMirror.getLineHandle(this._codeMirror.lastLine()).height, 0);
- newPaddingBottom += "px";
- linesElement.style.paddingBottom = newPaddingBottom;
- this._codeMirror.setSize(width, height);
- },
-
- _resizeEditor: function()
- {
- var parentElement = this.element.parentElement;
- if (!parentElement || !this.isShowing())
- return;
- var scrollLeft = this._codeMirror.doc.scrollLeft;
- var scrollTop = this._codeMirror.doc.scrollTop;
- var width = parentElement.offsetWidth;
- var height = parentElement.offsetHeight - this.element.offsetTop;
- if (this._options.autoHeight) {
- this._codeMirror.setSize(width, "auto");
- } else {
- this._codeMirror.setSize(width, height);
- this._updatePaddingBottom(width, height);
- }
- this._codeMirror.scrollTo(scrollLeft, scrollTop);
- },
+ if (WebInspector.TextUtils.isStopChar(text[charNumber])) {
+ while (valid(charNumber, length) && WebInspector.TextUtils.isStopChar(text[charNumber]))
+ charNumber += direction;
+ if (!valid(charNumber, length))
+ return constrainPosition(lineNumber, length, charNumber);
+ return {lineNumber: lineNumber, columnNumber: direction === -1 ? charNumber + 1 : charNumber};
+ }
- /**
- * @override
- */
- onResize: function()
- {
- if (this._autocompleteController)
- this._autocompleteController.clearAutocomplete();
- this._resizeEditor();
- this._editorSizeInSync = true;
- if (this._selectionSetScheduled) {
- delete this._selectionSetScheduled;
- this.setSelection(this._lastSelection);
- }
- },
+ charNumber += direction;
+ while (valid(charNumber, length) && !isWordStart(text, charNumber) && !isWordEnd(text, charNumber) &&
+ WebInspector.TextUtils.isWordChar(text[charNumber]))
+ charNumber += direction;
- /**
- * @param {!WebInspector.TextRange} range
- * @param {string} text
- * @param {string=} origin
- * @return {!WebInspector.TextRange}
- */
- editRange: function(range, text, origin)
- {
- var pos = WebInspector.CodeMirrorUtils.toPos(range);
- this._codeMirror.replaceRange(text, pos.start, pos.end, origin);
- return WebInspector.CodeMirrorUtils.toRange(pos.start, this._codeMirror.posFromIndex(this._codeMirror.indexFromPos(pos.start) + text.length));
- },
+ if (!valid(charNumber, length))
+ return constrainPosition(lineNumber, length, charNumber);
+ if (isWordStart(text, charNumber) || isWordEnd(text, charNumber)) {
+ return {lineNumber: lineNumber, columnNumber: charNumber};
+ }
- /**
- * @override
- */
- clearAutocomplete: function()
- {
- if (this._autocompleteController)
- this._autocompleteController.clearAutocomplete();
- },
+ return {lineNumber: lineNumber, columnNumber: direction === -1 ? charNumber + 1 : charNumber};
+ }
- /**
- * @param {number} lineNumber
- * @param {number} column
- * @param {function(string):boolean} isWordChar
- * @return {!WebInspector.TextRange}
- */
- wordRangeForCursorPosition: function(lineNumber, column, isWordChar)
- {
- var line = this.line(lineNumber);
- var wordStart = column;
- if (column !== 0 && isWordChar(line.charAt(column - 1))) {
- wordStart = column - 1;
- while (wordStart > 0 && isWordChar(line.charAt(wordStart - 1)))
- --wordStart;
- }
- var wordEnd = column;
- while (wordEnd < line.length && isWordChar(line.charAt(wordEnd)))
- ++wordEnd;
- return new WebInspector.TextRange(lineNumber, wordStart, lineNumber, wordEnd);
- },
+ /**
+ * @param {number} direction
+ * @param {boolean} shift
+ */
+ _doCamelCaseMovement(direction, shift) {
+ var selections = this.selections();
+ for (var i = 0; i < selections.length; ++i) {
+ var selection = selections[i];
+ var move = this._camelCaseMoveFromPosition(selection.endLine, selection.endColumn, direction);
+ selection.endLine = move.lineNumber;
+ selection.endColumn = move.columnNumber;
+ if (!shift)
+ selections[i] = selection.collapseToEnd();
+ }
+ this.setSelections(selections);
+ }
+
+ dispose() {
+ if (this._options.bracketMatchingSetting)
+ this._options.bracketMatchingSetting.removeChangeListener(this._enableBracketMatchingIfNeeded, this);
+ }
+
+ _enableBracketMatchingIfNeeded() {
+ this._codeMirror.setOption(
+ 'autoCloseBrackets', (this._options.bracketMatchingSetting && this._options.bracketMatchingSetting.get()) ?
+ {explode: false} :
+ false);
+ }
+
+ /**
+ * @override
+ */
+ wasShown() {
+ if (this._needsRefresh)
+ this.refresh();
+ }
+
+ /**
+ * @protected
+ */
+ refresh() {
+ if (this.isShowing()) {
+ this._codeMirror.refresh();
+ this._needsRefresh = false;
+ return;
+ }
+ this._needsRefresh = true;
+ }
+
+ /**
+ * @override
+ */
+ willHide() {
+ delete this._editorSizeInSync;
+ }
+
+ undo() {
+ this._codeMirror.undo();
+ }
+
+ redo() {
+ this._codeMirror.redo();
+ }
+
+ /**
+ * @param {!Event} e
+ */
+ _handleKeyDown(e) {
+ if (this._autocompleteController && this._autocompleteController.keyDown(e))
+ e.consume(true);
+ }
+
+ /**
+ * @param {!Event} e
+ */
+ _handlePostKeyDown(e) {
+ if (e.defaultPrevented)
+ e.consume(true);
+ }
+
+ /**
+ * @override
+ * @param {?WebInspector.AutocompleteConfig} config
+ */
+ configureAutocomplete(config) {
+ if (this._autocompleteController) {
+ this._autocompleteController.dispose();
+ delete this._autocompleteController;
+ }
- /**
- * @param {!CodeMirror} codeMirror
- * @param {!Array.<!CodeMirror.ChangeObject>} changes
- */
- _changes: function(codeMirror, changes)
- {
- if (!changes.length)
- return;
- // We do not show "scroll beyond end of file" span for one line documents, so we need to check if "document has one line" changed.
- var hasOneLine = this._codeMirror.lineCount() === 1;
- if (hasOneLine !== this._hasOneLine)
- this._resizeEditor();
- this._hasOneLine = hasOneLine;
-
- this._decorations.valuesArray().forEach(decoration => this._codeMirror.removeLineWidget(decoration.widget));
- this._decorations.clear();
- },
+ if (config)
+ this._autocompleteController = new WebInspector.TextEditorAutocompleteController(this, this._codeMirror, config);
+ }
+
+ /**
+ * @param {number} lineNumber
+ * @param {number} column
+ * @return {?{x: number, y: number, height: number}}
+ */
+ cursorPositionToCoordinates(lineNumber, column) {
+ if (lineNumber >= this._codeMirror.lineCount() || lineNumber < 0 || column < 0 ||
+ column > this._codeMirror.getLine(lineNumber).length)
+ return null;
+ var metrics = this._codeMirror.cursorCoords(new CodeMirror.Pos(lineNumber, column));
+ return {x: metrics.left, y: metrics.top, height: metrics.bottom - metrics.top};
+ }
+
+ /**
+ * @param {number} x
+ * @param {number} y
+ * @return {?WebInspector.TextRange}
+ */
+ coordinatesToCursorPosition(x, y) {
+ var element = this.element.ownerDocument.elementFromPoint(x, y);
+ if (!element || !element.isSelfOrDescendant(this._codeMirror.getWrapperElement()))
+ return null;
+ var gutterBox = this._codeMirror.getGutterElement().boxInWindow();
+ if (x >= gutterBox.x && x <= gutterBox.x + gutterBox.width && y >= gutterBox.y &&
+ y <= gutterBox.y + gutterBox.height)
+ return null;
+ var coords = this._codeMirror.coordsChar({left: x, top: y});
+ return WebInspector.CodeMirrorUtils.toRange(coords, coords);
+ }
+
+ /**
+ * @param {number} lineNumber
+ * @param {number} column
+ * @return {?{startColumn: number, endColumn: number, type: string}}
+ */
+ tokenAtTextPosition(lineNumber, column) {
+ if (lineNumber < 0 || lineNumber >= this._codeMirror.lineCount())
+ return null;
+ var token = this._codeMirror.getTokenAt(new CodeMirror.Pos(lineNumber, (column || 0) + 1));
+ if (!token)
+ return null;
+ return {startColumn: token.start, endColumn: token.end, type: token.type};
+ }
+
+ /**
+ * @return {boolean}
+ */
+ isClean() {
+ return this._codeMirror.isClean();
+ }
+
+ markClean() {
+ this._codeMirror.markClean();
+ }
+
+ /**
+ * @return {boolean}
+ */
+ _hasLongLines() {
+ function lineIterator(lineHandle) {
+ if (lineHandle.text.length > WebInspector.CodeMirrorTextEditor.LongLineModeLineLengthThreshold)
+ hasLongLines = true;
+ return hasLongLines;
+ }
+ var hasLongLines = false;
+ this._codeMirror.eachLine(lineIterator);
+ return hasLongLines;
+ }
+
+ _enableLongLinesMode() {
+ this._codeMirror.setOption('styleSelectedText', false);
+ }
+
+ _disableLongLinesMode() {
+ this._codeMirror.setOption('styleSelectedText', true);
+ }
+
+ /**
+ * @param {string} mimeType
+ * @return {!Promise}
+ */
+ setMimeType(mimeType) {
+ if (this._hasLongLines())
+ this._enableLongLinesMode();
+ else
+ this._disableLongLinesMode();
+ return WebInspector.CodeMirrorTextEditor._loadMimeTypeModes(mimeType).then(
+ () => this._codeMirror.setOption('mode', mimeType));
+ }
+
+ /**
+ * @param {boolean} readOnly
+ */
+ setReadOnly(readOnly) {
+ this.element.classList.toggle('CodeMirror-readonly', readOnly);
+ this._codeMirror.setOption('readOnly', readOnly);
+ }
+
+ /**
+ * @return {boolean}
+ */
+ readOnly() {
+ return !!this._codeMirror.getOption('readOnly');
+ }
+
+ /**
+ * @override
+ * @param {function(!KeyboardEvent)} handler
+ */
+ addKeyDownHandler(handler) {
+ this._codeMirror.on('keydown', (CodeMirror, event) => handler(event));
+ }
+
+ /**
+ * @param {number} lineNumber
+ * @param {number} columnNumber
+ * @param {!Element} element
+ * @param {symbol} type
+ * @param {boolean=} insertBefore
+ * @return {!WebInspector.TextEditorBookMark}
+ */
+ addBookmark(lineNumber, columnNumber, element, type, insertBefore) {
+ var bookmark = new WebInspector.TextEditorBookMark(
+ this._codeMirror.setBookmark(
+ new CodeMirror.Pos(lineNumber, columnNumber), {widget: element, insertLeft: insertBefore}),
+ type, this);
+ this._updateDecorations(lineNumber);
+ return bookmark;
+ }
+
+ /**
+ * @param {!WebInspector.TextRange} range
+ * @param {symbol=} type
+ * @return {!Array.<!WebInspector.TextEditorBookMark>}
+ */
+ bookmarks(range, type) {
+ var pos = WebInspector.CodeMirrorUtils.toPos(range);
+ var markers = this._codeMirror.findMarksAt(pos.start);
+ if (!range.isEmpty()) {
+ var middleMarkers = this._codeMirror.findMarks(pos.start, pos.end);
+ var endMarkers = this._codeMirror.findMarksAt(pos.end);
+ markers = markers.concat(middleMarkers, endMarkers);
+ }
+ var bookmarks = [];
+ for (var i = 0; i < markers.length; i++) {
+ var bookmark = markers[i][WebInspector.TextEditorBookMark._symbol];
+ if (bookmark && (!type || bookmark.type() === type))
+ bookmarks.push(bookmark);
+ }
+ return bookmarks;
+ }
+
+ /**
+ * @override
+ */
+ focus() {
+ this._codeMirror.focus();
+ }
+
+ /**
+ * @override
+ * @return {boolean}
+ */
+ hasFocus() {
+ return this._codeMirror.hasFocus();
+ }
+
+ _handleElementFocus() {
+ this._codeMirror.focus();
+ }
+
+ /**
+ * @param {function()} operation
+ */
+ operation(operation) {
+ this._codeMirror.operation(operation);
+ }
+
+ /**
+ * @param {number} lineNumber
+ */
+ scrollLineIntoView(lineNumber) {
+ this._innerRevealLine(lineNumber, this._codeMirror.getScrollInfo());
+ }
+
+ /**
+ * @param {number} lineNumber
+ * @param {!{left: number, top: number, width: number, height: number, clientWidth: number, clientHeight: number}} scrollInfo
+ */
+ _innerRevealLine(lineNumber, scrollInfo) {
+ var topLine = this._codeMirror.lineAtHeight(scrollInfo.top, 'local');
+ var bottomLine = this._codeMirror.lineAtHeight(scrollInfo.top + scrollInfo.clientHeight, 'local');
+ var linesPerScreen = bottomLine - topLine + 1;
+ if (lineNumber < topLine) {
+ var topLineToReveal = Math.max(lineNumber - (linesPerScreen / 2) + 1, 0) | 0;
+ this._codeMirror.scrollIntoView(new CodeMirror.Pos(topLineToReveal, 0));
+ } else if (lineNumber > bottomLine) {
+ var bottomLineToReveal = Math.min(lineNumber + (linesPerScreen / 2) - 1, this.linesCount - 1) | 0;
+ this._codeMirror.scrollIntoView(new CodeMirror.Pos(bottomLineToReveal, 0));
+ }
+ }
+
+ /**
+ * @param {!Element} element
+ * @param {number} lineNumber
+ * @param {number=} startColumn
+ * @param {number=} endColumn
+ */
+ addDecoration(element, lineNumber, startColumn, endColumn) {
+ var widget = this._codeMirror.addLineWidget(lineNumber, element);
+ var update = null;
+ if (typeof startColumn !== 'undefined') {
+ if (typeof endColumn === 'undefined')
+ endColumn = Infinity;
+ update = this._updateFloatingDecoration.bind(this, element, lineNumber, startColumn, endColumn);
+ update();
+ }
- /**
- * @param {!CodeMirror} codeMirror
- * @param {{ranges: !Array.<{head: !CodeMirror.Pos, anchor: !CodeMirror.Pos}>}} selection
- */
- _beforeSelectionChange: function(codeMirror, selection)
- {
- this._selectNextOccurrenceController.selectionWillChange();
- },
+ this._decorations.set(lineNumber, {element: element, update: update, widget: widget});
+ }
+
+ /**
+ * @param {!Element} element
+ * @param {number} lineNumber
+ * @param {number} startColumn
+ * @param {number} endColumn
+ */
+ _updateFloatingDecoration(element, lineNumber, startColumn, endColumn) {
+ var base = this._codeMirror.cursorCoords(new CodeMirror.Pos(lineNumber, 0), 'page');
+ var start = this._codeMirror.cursorCoords(new CodeMirror.Pos(lineNumber, startColumn), 'page');
+ var end = this._codeMirror.charCoords(new CodeMirror.Pos(lineNumber, endColumn), 'page');
+ element.style.width = (end.right - start.left) + 'px';
+ element.style.left = (start.left - base.left) + 'px';
+ }
+
+ /**
+ * @param {number} lineNumber
+ */
+ _updateDecorations(lineNumber) {
+ this._decorations.get(lineNumber).forEach(innerUpdateDecorations);
+
+ /**
+ * @param {!WebInspector.CodeMirrorTextEditor.Decoration} decoration
+ */
+ function innerUpdateDecorations(decoration) {
+ if (decoration.update)
+ decoration.update();
+ }
+ }
- /**
- * @param {number} lineNumber
- */
- scrollToLine: function(lineNumber)
- {
- var pos = new CodeMirror.Pos(lineNumber, 0);
- var coords = this._codeMirror.charCoords(pos, "local");
- this._codeMirror.scrollTo(0, coords.top);
- },
+ /**
+ * @param {!Element} element
+ * @param {number} lineNumber
+ */
+ removeDecoration(element, lineNumber) {
+ this._decorations.get(lineNumber).forEach(innerRemoveDecoration.bind(this));
/**
- * @return {number}
+ * @this {WebInspector.CodeMirrorTextEditor}
+ * @param {!WebInspector.CodeMirrorTextEditor.Decoration} decoration
*/
- firstVisibleLine: function()
- {
- return this._codeMirror.lineAtHeight(this._codeMirror.getScrollInfo().top, "local");
- },
+ function innerRemoveDecoration(decoration) {
+ if (decoration.element !== element)
+ return;
+ this._codeMirror.removeLineWidget(decoration.widget);
+ this._decorations.remove(lineNumber, decoration);
+ }
+ }
+
+ /**
+ * @param {number} lineNumber 0-based
+ * @param {number=} columnNumber
+ * @param {boolean=} shouldHighlight
+ */
+ revealPosition(lineNumber, columnNumber, shouldHighlight) {
+ lineNumber = Number.constrain(lineNumber, 0, this._codeMirror.lineCount() - 1);
+ if (typeof columnNumber !== 'number')
+ columnNumber = 0;
+ columnNumber = Number.constrain(columnNumber, 0, this._codeMirror.getLine(lineNumber).length);
+
+ this.clearPositionHighlight();
+ this._highlightedLine = this._codeMirror.getLineHandle(lineNumber);
+ if (!this._highlightedLine)
+ return;
+ this.scrollLineIntoView(lineNumber);
+ if (shouldHighlight) {
+ this._codeMirror.addLineClass(this._highlightedLine, null, 'cm-highlight');
+ this._clearHighlightTimeout = setTimeout(this.clearPositionHighlight.bind(this), 2000);
+ }
+ this.setSelection(WebInspector.TextRange.createFromLocation(lineNumber, columnNumber));
+ }
+
+ clearPositionHighlight() {
+ if (this._clearHighlightTimeout)
+ clearTimeout(this._clearHighlightTimeout);
+ delete this._clearHighlightTimeout;
+
+ if (this._highlightedLine)
+ this._codeMirror.removeLineClass(this._highlightedLine, null, 'cm-highlight');
+ delete this._highlightedLine;
+ }
+
+ /**
+ * @override
+ * @return {!Array.<!Element>}
+ */
+ elementsToRestoreScrollPositionsFor() {
+ return [];
+ }
+
+ /**
+ * @param {number} width
+ * @param {number} height
+ */
+ _updatePaddingBottom(width, height) {
+ var scrollInfo = this._codeMirror.getScrollInfo();
+ var newPaddingBottom;
+ var linesElement = this._codeMirrorElement.querySelector('.CodeMirror-lines');
+ var lineCount = this._codeMirror.lineCount();
+ if (lineCount <= 1)
+ newPaddingBottom = 0;
+ else
+ newPaddingBottom =
+ Math.max(scrollInfo.clientHeight - this._codeMirror.getLineHandle(this._codeMirror.lastLine()).height, 0);
+ newPaddingBottom += 'px';
+ linesElement.style.paddingBottom = newPaddingBottom;
+ this._codeMirror.setSize(width, height);
+ }
+
+ _resizeEditor() {
+ var parentElement = this.element.parentElement;
+ if (!parentElement || !this.isShowing())
+ return;
+ var scrollLeft = this._codeMirror.doc.scrollLeft;
+ var scrollTop = this._codeMirror.doc.scrollTop;
+ var width = parentElement.offsetWidth;
+ var height = parentElement.offsetHeight - this.element.offsetTop;
+ if (this._options.autoHeight) {
+ this._codeMirror.setSize(width, 'auto');
+ } else {
+ this._codeMirror.setSize(width, height);
+ this._updatePaddingBottom(width, height);
+ }
+ this._codeMirror.scrollTo(scrollLeft, scrollTop);
+ }
+
+ /**
+ * @override
+ */
+ onResize() {
+ if (this._autocompleteController)
+ this._autocompleteController.clearAutocomplete();
+ this._resizeEditor();
+ this._editorSizeInSync = true;
+ if (this._selectionSetScheduled) {
+ delete this._selectionSetScheduled;
+ this.setSelection(this._lastSelection);
+ }
+ }
+
+ /**
+ * @param {!WebInspector.TextRange} range
+ * @param {string} text
+ * @param {string=} origin
+ * @return {!WebInspector.TextRange}
+ */
+ editRange(range, text, origin) {
+ var pos = WebInspector.CodeMirrorUtils.toPos(range);
+ this._codeMirror.replaceRange(text, pos.start, pos.end, origin);
+ return WebInspector.CodeMirrorUtils.toRange(
+ pos.start, this._codeMirror.posFromIndex(this._codeMirror.indexFromPos(pos.start) + text.length));
+ }
+
+ /**
+ * @override
+ */
+ clearAutocomplete() {
+ if (this._autocompleteController)
+ this._autocompleteController.clearAutocomplete();
+ }
+
+ /**
+ * @param {number} lineNumber
+ * @param {number} column
+ * @param {function(string):boolean} isWordChar
+ * @return {!WebInspector.TextRange}
+ */
+ wordRangeForCursorPosition(lineNumber, column, isWordChar) {
+ var line = this.line(lineNumber);
+ var wordStart = column;
+ if (column !== 0 && isWordChar(line.charAt(column - 1))) {
+ wordStart = column - 1;
+ while (wordStart > 0 && isWordChar(line.charAt(wordStart - 1)))
+ --wordStart;
+ }
+ var wordEnd = column;
+ while (wordEnd < line.length && isWordChar(line.charAt(wordEnd)))
+ ++wordEnd;
+ return new WebInspector.TextRange(lineNumber, wordStart, lineNumber, wordEnd);
+ }
+
+ /**
+ * @param {!CodeMirror} codeMirror
+ * @param {!Array.<!CodeMirror.ChangeObject>} changes
+ */
+ _changes(codeMirror, changes) {
+ if (!changes.length)
+ return;
+ // We do not show "scroll beyond end of file" span for one line documents, so we need to check if "document has one line" changed.
+ var hasOneLine = this._codeMirror.lineCount() === 1;
+ if (hasOneLine !== this._hasOneLine)
+ this._resizeEditor();
+ this._hasOneLine = hasOneLine;
+
+ this._decorations.valuesArray().forEach(decoration => this._codeMirror.removeLineWidget(decoration.widget));
+ this._decorations.clear();
+ }
+
+ /**
+ * @param {!CodeMirror} codeMirror
+ * @param {{ranges: !Array.<{head: !CodeMirror.Pos, anchor: !CodeMirror.Pos}>}} selection
+ */
+ _beforeSelectionChange(codeMirror, selection) {
+ this._selectNextOccurrenceController.selectionWillChange();
+ }
+
+ /**
+ * @param {number} lineNumber
+ */
+ scrollToLine(lineNumber) {
+ var pos = new CodeMirror.Pos(lineNumber, 0);
+ var coords = this._codeMirror.charCoords(pos, 'local');
+ this._codeMirror.scrollTo(0, coords.top);
+ }
+
+ /**
+ * @return {number}
+ */
+ firstVisibleLine() {
+ return this._codeMirror.lineAtHeight(this._codeMirror.getScrollInfo().top, 'local');
+ }
+
+ /**
+ * @return {number}
+ */
+ scrollTop() {
+ return this._codeMirror.getScrollInfo().top;
+ }
+
+ /**
+ * @param {number} scrollTop
+ */
+ setScrollTop(scrollTop) {
+ this._codeMirror.scrollTo(0, scrollTop);
+ }
+
+ /**
+ * @return {number}
+ */
+ lastVisibleLine() {
+ var scrollInfo = this._codeMirror.getScrollInfo();
+ return this._codeMirror.lineAtHeight(scrollInfo.top + scrollInfo.clientHeight, 'local');
+ }
+
+ /**
+ * @override
+ * @return {!WebInspector.TextRange}
+ */
+ selection() {
+ var start = this._codeMirror.getCursor('anchor');
+ var end = this._codeMirror.getCursor('head');
+
+ return WebInspector.CodeMirrorUtils.toRange(start, end);
+ }
+
+ /**
+ * @return {!Array.<!WebInspector.TextRange>}
+ */
+ selections() {
+ var selectionList = this._codeMirror.listSelections();
+ var result = [];
+ for (var i = 0; i < selectionList.length; ++i) {
+ var selection = selectionList[i];
+ result.push(WebInspector.CodeMirrorUtils.toRange(selection.anchor, selection.head));
+ }
+ return result;
+ }
+
+ /**
+ * @return {?WebInspector.TextRange}
+ */
+ lastSelection() {
+ return this._lastSelection;
+ }
+
+ /**
+ * @override
+ * @param {!WebInspector.TextRange} textRange
+ */
+ setSelection(textRange) {
+ this._lastSelection = textRange;
+ if (!this._editorSizeInSync) {
+ this._selectionSetScheduled = true;
+ return;
+ }
+ var pos = WebInspector.CodeMirrorUtils.toPos(textRange);
+ this._codeMirror.setSelection(pos.start, pos.end);
+ }
+
+ /**
+ * @param {!Array.<!WebInspector.TextRange>} ranges
+ * @param {number=} primarySelectionIndex
+ */
+ setSelections(ranges, primarySelectionIndex) {
+ var selections = [];
+ for (var i = 0; i < ranges.length; ++i) {
+ var selection = WebInspector.CodeMirrorUtils.toPos(ranges[i]);
+ selections.push({anchor: selection.start, head: selection.end});
+ }
+ primarySelectionIndex = primarySelectionIndex || 0;
+ this._codeMirror.setSelections(selections, primarySelectionIndex, {scroll: false});
+ }
+
+ /**
+ * @param {string} text
+ */
+ _detectLineSeparator(text) {
+ this._lineSeparator = text.indexOf('\r\n') >= 0 ? '\r\n' : '\n';
+ }
+
+ /**
+ * @override
+ * @param {string} text
+ */
+ setText(text) {
+ if (text.length > WebInspector.CodeMirrorTextEditor.MaxEditableTextSize) {
+ this.configureAutocomplete(null);
+ this.setReadOnly(true);
+ }
+ this._codeMirror.setValue(text);
+ if (this._shouldClearHistory) {
+ this._codeMirror.clearHistory();
+ this._shouldClearHistory = false;
+ }
+ this._detectLineSeparator(text);
+ }
+
+ /**
+ * @override
+ * @param {!WebInspector.TextRange=} textRange
+ * @return {string}
+ */
+ text(textRange) {
+ if (!textRange)
+ return this._codeMirror.getValue().replace(/\n/g, this._lineSeparator);
+ var pos = WebInspector.CodeMirrorUtils.toPos(textRange.normalize());
+ return this._codeMirror.getRange(pos.start, pos.end).replace(/\n/g, this._lineSeparator);
+ }
+
+ /**
+ * @override
+ * @return {!WebInspector.TextRange}
+ */
+ fullRange() {
+ var lineCount = this.linesCount;
+ var lastLine = this._codeMirror.getLine(lineCount - 1);
+ return WebInspector.CodeMirrorUtils.toRange(
+ new CodeMirror.Pos(0, 0), new CodeMirror.Pos(lineCount - 1, lastLine.length));
+ }
+
+ /**
+ * @override
+ * @param {number} lineNumber
+ * @return {string}
+ */
+ line(lineNumber) {
+ return this._codeMirror.getLine(lineNumber);
+ }
+
+ /**
+ * @return {number}
+ */
+ get linesCount() {
+ return this._codeMirror.lineCount();
+ }
+
+ /**
+ * @override
+ */
+ newlineAndIndent() {
+ this._codeMirror.execCommand('newlineAndIndent');
+ }
+
+ /**
+ * @param {number} line
+ * @param {string} name
+ * @param {?Object} value
+ */
+ setAttribute(line, name, value) {
+ if (line < 0 || line >= this._codeMirror.lineCount())
+ return;
+ var handle = this._codeMirror.getLineHandle(line);
+ if (handle.attributes === undefined)
+ handle.attributes = {};
+ handle.attributes[name] = value;
+ }
+
+ /**
+ * @param {number} line
+ * @param {string} name
+ * @return {?Object} value
+ */
+ getAttribute(line, name) {
+ if (line < 0 || line >= this._codeMirror.lineCount())
+ return null;
+ var handle = this._codeMirror.getLineHandle(line);
+ return handle.attributes && handle.attributes[name] !== undefined ? handle.attributes[name] : null;
+ }
+
+ /**
+ * @param {number} line
+ * @param {string} name
+ */
+ removeAttribute(line, name) {
+ if (line < 0 || line >= this._codeMirror.lineCount())
+ return;
+ var handle = this._codeMirror.getLineHandle(line);
+ if (handle && handle.attributes)
+ delete handle.attributes[name];
+ }
+
+ /**
+ * @param {number} lineNumber
+ * @param {number} columnNumber
+ * @return {!WebInspector.TextEditorPositionHandle}
+ */
+ textEditorPositionHandle(lineNumber, columnNumber) {
+ return new WebInspector.CodeMirrorPositionHandle(this._codeMirror, new CodeMirror.Pos(lineNumber, columnNumber));
+ }
+};
- /**
- * @return {number}
- */
- scrollTop: function()
- {
- return this._codeMirror.getScrollInfo().top;
- },
+WebInspector.CodeMirrorTextEditor.maxHighlightLength = 1000;
- /**
- * @param {number} scrollTop
- */
- setScrollTop: function(scrollTop)
- {
- this._codeMirror.scrollTo(0, scrollTop);
- },
- /**
- * @return {number}
- */
- lastVisibleLine: function()
- {
- var scrollInfo = this._codeMirror.getScrollInfo();
- return this._codeMirror.lineAtHeight(scrollInfo.top + scrollInfo.clientHeight, "local");
- },
+CodeMirror.commands.autocomplete = WebInspector.CodeMirrorTextEditor.autocompleteCommand;
- /**
- * @override
- * @return {!WebInspector.TextRange}
- */
- selection: function()
- {
- var start = this._codeMirror.getCursor("anchor");
- var end = this._codeMirror.getCursor("head");
- return WebInspector.CodeMirrorUtils.toRange(start, end);
- },
+CodeMirror.commands.undoLastSelection = WebInspector.CodeMirrorTextEditor.undoLastSelectionCommand;
- /**
- * @return {!Array.<!WebInspector.TextRange>}
- */
- selections: function()
- {
- var selectionList = this._codeMirror.listSelections();
- var result = [];
- for (var i = 0; i < selectionList.length; ++i) {
- var selection = selectionList[i];
- result.push(WebInspector.CodeMirrorUtils.toRange(selection.anchor, selection.head));
- }
- return result;
- },
- /**
- * @return {?WebInspector.TextRange}
- */
- lastSelection: function()
- {
- return this._lastSelection;
- },
+CodeMirror.commands.selectNextOccurrence = WebInspector.CodeMirrorTextEditor.selectNextOccurrenceCommand;
- /**
- * @override
- * @param {!WebInspector.TextRange} textRange
- */
- setSelection: function(textRange)
- {
- this._lastSelection = textRange;
- if (!this._editorSizeInSync) {
- this._selectionSetScheduled = true;
- return;
- }
- var pos = WebInspector.CodeMirrorUtils.toPos(textRange);
- this._codeMirror.setSelection(pos.start, pos.end);
- },
- /**
- * @param {!Array.<!WebInspector.TextRange>} ranges
- * @param {number=} primarySelectionIndex
- */
- setSelections: function(ranges, primarySelectionIndex)
- {
- var selections = [];
- for (var i = 0; i < ranges.length; ++i) {
- var selection = WebInspector.CodeMirrorUtils.toPos(ranges[i]);
- selections.push({
- anchor: selection.start,
- head: selection.end
- });
- }
- primarySelectionIndex = primarySelectionIndex || 0;
- this._codeMirror.setSelections(selections, primarySelectionIndex, { scroll: false });
- },
+CodeMirror.commands.moveCamelLeft = WebInspector.CodeMirrorTextEditor.moveCamelLeftCommand.bind(null, false);
+CodeMirror.commands.selectCamelLeft = WebInspector.CodeMirrorTextEditor.moveCamelLeftCommand.bind(null, true);
- /**
- * @param {string} text
- */
- _detectLineSeparator: function(text)
- {
- this._lineSeparator = text.indexOf("\r\n") >= 0 ? "\r\n" : "\n";
- },
- /**
- * @override
- * @param {string} text
- */
- setText: function(text)
- {
- if (text.length > WebInspector.CodeMirrorTextEditor.MaxEditableTextSize) {
- this.configureAutocomplete(null);
- this.setReadOnly(true);
- }
- this._codeMirror.setValue(text);
- if (this._shouldClearHistory) {
- this._codeMirror.clearHistory();
- this._shouldClearHistory = false;
- }
- this._detectLineSeparator(text);
- },
+CodeMirror.commands.moveCamelRight = WebInspector.CodeMirrorTextEditor.moveCamelRightCommand.bind(null, false);
+CodeMirror.commands.selectCamelRight = WebInspector.CodeMirrorTextEditor.moveCamelRightCommand.bind(null, true);
- /**
- * @override
- * @param {!WebInspector.TextRange=} textRange
- * @return {string}
- */
- text: function(textRange)
- {
- if (!textRange)
- return this._codeMirror.getValue().replace(/\n/g, this._lineSeparator);
- var pos = WebInspector.CodeMirrorUtils.toPos(textRange.normalize());
- return this._codeMirror.getRange(pos.start, pos.end).replace(/\n/g, this._lineSeparator);
- },
+/**
+ * @param {!CodeMirror} codeMirror
+ */
+CodeMirror.commands.gotoMatchingBracket = function(codeMirror) {
+ var updatedSelections = [];
+ var selections = codeMirror.listSelections();
+ for (var i = 0; i < selections.length; ++i) {
+ var selection = selections[i];
+ var cursor = selection.head;
+ var matchingBracket = codeMirror.findMatchingBracket(cursor, false, {maxScanLines: 10000});
+ var updatedHead = cursor;
+ if (matchingBracket && matchingBracket.match) {
+ var columnCorrection = CodeMirror.cmpPos(matchingBracket.from, cursor) === 0 ? 1 : 0;
+ updatedHead = new CodeMirror.Pos(matchingBracket.to.line, matchingBracket.to.ch + columnCorrection);
+ }
+ updatedSelections.push({anchor: updatedHead, head: updatedHead});
+ }
+ codeMirror.setSelections(updatedSelections);
+};
- /**
- * @override
- * @return {!WebInspector.TextRange}
- */
- fullRange: function()
- {
- var lineCount = this.linesCount;
- var lastLine = this._codeMirror.getLine(lineCount - 1);
- return WebInspector.CodeMirrorUtils.toRange(new CodeMirror.Pos(0, 0), new CodeMirror.Pos(lineCount - 1, lastLine.length));
- },
+/**
+ * @param {!CodeMirror} codemirror
+ */
+CodeMirror.commands.undoAndReveal = function(codemirror) {
+ var scrollInfo = codemirror.getScrollInfo();
+ codemirror.execCommand('undo');
+ var cursor = codemirror.getCursor('start');
+ codemirror._codeMirrorTextEditor._innerRevealLine(cursor.line, scrollInfo);
+ var autocompleteController = codemirror._codeMirrorTextEditor._autocompleteController;
+ if (autocompleteController)
+ autocompleteController.clearAutocomplete();
+};
- /**
- * @override
- * @param {number} lineNumber
- * @return {string}
- */
- line: function(lineNumber)
- {
- return this._codeMirror.getLine(lineNumber);
- },
+/**
+ * @param {!CodeMirror} codemirror
+ */
+CodeMirror.commands.redoAndReveal = function(codemirror) {
+ var scrollInfo = codemirror.getScrollInfo();
+ codemirror.execCommand('redo');
+ var cursor = codemirror.getCursor('start');
+ codemirror._codeMirrorTextEditor._innerRevealLine(cursor.line, scrollInfo);
+ var autocompleteController = codemirror._codeMirrorTextEditor._autocompleteController;
+ if (autocompleteController)
+ autocompleteController.clearAutocomplete();
+};
- /**
- * @return {number}
- */
- get linesCount()
- {
- return this._codeMirror.lineCount();
- },
+/**
+ * @return {!Object|undefined}
+ */
+CodeMirror.commands.dismiss = function(codemirror) {
+ var selections = codemirror.listSelections();
+ var selection = selections[0];
+ if (selections.length === 1) {
+ if (WebInspector.CodeMirrorUtils.toRange(selection.anchor, selection.head).isEmpty())
+ return CodeMirror.Pass;
+ codemirror.setSelection(selection.anchor, selection.anchor, {scroll: false});
+ codemirror._codeMirrorTextEditor.scrollLineIntoView(selection.anchor.line);
+ return;
+ }
- /**
- * @override
- */
- newlineAndIndent: function()
- {
- this._codeMirror.execCommand("newlineAndIndent");
- },
+ codemirror.setSelection(selection.anchor, selection.head, {scroll: false});
+ codemirror._codeMirrorTextEditor.scrollLineIntoView(selection.anchor.line);
+};
- /**
- * @param {number} line
- * @param {string} name
- * @param {?Object} value
- */
- setAttribute: function(line, name, value)
- {
- if (line < 0 || line >= this._codeMirror.lineCount())
- return;
- var handle = this._codeMirror.getLineHandle(line);
- if (handle.attributes === undefined) handle.attributes = {};
- handle.attributes[name] = value;
- },
+/**
+ * @return {!Object|undefined}
+ */
+CodeMirror.commands.smartPageUp = function(codemirror) {
+ if (codemirror._codeMirrorTextEditor.selection().equal(WebInspector.TextRange.createFromLocation(0, 0)))
+ return CodeMirror.Pass;
+ codemirror.execCommand('goPageUp');
+};
- /**
- * @param {number} line
- * @param {string} name
- * @return {?Object} value
- */
- getAttribute: function(line, name)
- {
- if (line < 0 || line >= this._codeMirror.lineCount())
- return null;
- var handle = this._codeMirror.getLineHandle(line);
- return handle.attributes && handle.attributes[name] !== undefined ? handle.attributes[name] : null;
- },
+/**
+ * @return {!Object|undefined}
+ */
+CodeMirror.commands.smartPageDown = function(codemirror) {
+ if (codemirror._codeMirrorTextEditor.selection().equal(codemirror._codeMirrorTextEditor.fullRange().collapseToEnd()))
+ return CodeMirror.Pass;
+ codemirror.execCommand('goPageDown');
+};
- /**
- * @param {number} line
- * @param {string} name
- */
- removeAttribute: function(line, name)
- {
- if (line < 0 || line >= this._codeMirror.lineCount())
- return;
- var handle = this._codeMirror.getLineHandle(line);
- if (handle && handle.attributes)
- delete handle.attributes[name];
- },
- /**
- * @param {number} lineNumber
- * @param {number} columnNumber
- * @return {!WebInspector.TextEditorPositionHandle}
- */
- textEditorPositionHandle: function(lineNumber, columnNumber)
- {
- return new WebInspector.CodeMirrorPositionHandle(this._codeMirror, new CodeMirror.Pos(lineNumber, columnNumber));
- },
+CodeMirror.commands.maybeAvoidSmartSingleQuotes =
+ WebInspector.CodeMirrorTextEditor._maybeAvoidSmartQuotes.bind(null, '\'');
+CodeMirror.commands.maybeAvoidSmartDoubleQuotes =
+ WebInspector.CodeMirrorTextEditor._maybeAvoidSmartQuotes.bind(null, '"');
- __proto__: WebInspector.VBox.prototype
-};
+WebInspector.CodeMirrorTextEditor.LongLineModeLineLengthThreshold = 2000;
+WebInspector.CodeMirrorTextEditor.MaxEditableTextSize = 1024 * 1024 * 10;
/**
- * @constructor
* @implements {WebInspector.TextEditorPositionHandle}
- * @param {!CodeMirror} codeMirror
- * @param {!CodeMirror.Pos} pos
+ * @unrestricted
*/
-WebInspector.CodeMirrorPositionHandle = function(codeMirror, pos)
-{
+WebInspector.CodeMirrorPositionHandle = class {
+ /**
+ * @param {!CodeMirror} codeMirror
+ * @param {!CodeMirror.Pos} pos
+ */
+ constructor(codeMirror, pos) {
this._codeMirror = codeMirror;
this._lineHandle = codeMirror.getLineHandle(pos.line);
this._columnNumber = pos.ch;
-};
-
-WebInspector.CodeMirrorPositionHandle.prototype = {
- /**
- * @override
- * @return {?{lineNumber: number, columnNumber: number}}
- */
- resolve: function()
- {
- var lineNumber = this._codeMirror.getLineNumber(this._lineHandle);
- if (typeof lineNumber !== "number")
- return null;
- return {
- lineNumber: lineNumber,
- columnNumber: this._columnNumber
- };
- },
-
- /**
- * @override
- * @param {!WebInspector.TextEditorPositionHandle} positionHandle
- * @return {boolean}
- */
- equal: function(positionHandle)
- {
- return positionHandle._lineHandle === this._lineHandle && positionHandle._columnNumber === this._columnNumber && positionHandle._codeMirror === this._codeMirror;
- }
+ }
+
+ /**
+ * @override
+ * @return {?{lineNumber: number, columnNumber: number}}
+ */
+ resolve() {
+ var lineNumber = this._codeMirror.getLineNumber(this._lineHandle);
+ if (typeof lineNumber !== 'number')
+ return null;
+ return {lineNumber: lineNumber, columnNumber: this._columnNumber};
+ }
+
+ /**
+ * @override
+ * @param {!WebInspector.TextEditorPositionHandle} positionHandle
+ * @return {boolean}
+ */
+ equal(positionHandle) {
+ return positionHandle._lineHandle === this._lineHandle && positionHandle._columnNumber === this._columnNumber &&
+ positionHandle._codeMirror === this._codeMirror;
+ }
};
/**
- * @constructor
- * @param {!CodeMirror} codeMirror
+ * @unrestricted
*/
-WebInspector.CodeMirrorTextEditor.FixWordMovement = function(codeMirror)
-{
- function moveLeft(shift, codeMirror)
- {
- codeMirror.setExtending(shift);
- var cursor = codeMirror.getCursor("head");
- codeMirror.execCommand("goGroupLeft");
- var newCursor = codeMirror.getCursor("head");
- if (newCursor.ch === 0 && newCursor.line !== 0) {
- codeMirror.setExtending(false);
- return;
- }
-
- var skippedText = codeMirror.getRange(newCursor, cursor, "#");
- if (/^\s+$/.test(skippedText))
- codeMirror.execCommand("goGroupLeft");
+WebInspector.CodeMirrorTextEditor.FixWordMovement = class {
+ /**
+ * @param {!CodeMirror} codeMirror
+ */
+ constructor(codeMirror) {
+ function moveLeft(shift, codeMirror) {
+ codeMirror.setExtending(shift);
+ var cursor = codeMirror.getCursor('head');
+ codeMirror.execCommand('goGroupLeft');
+ var newCursor = codeMirror.getCursor('head');
+ if (newCursor.ch === 0 && newCursor.line !== 0) {
codeMirror.setExtending(false);
+ return;
+ }
+
+ var skippedText = codeMirror.getRange(newCursor, cursor, '#');
+ if (/^\s+$/.test(skippedText))
+ codeMirror.execCommand('goGroupLeft');
+ codeMirror.setExtending(false);
}
- function moveRight(shift, codeMirror)
- {
- codeMirror.setExtending(shift);
- var cursor = codeMirror.getCursor("head");
- codeMirror.execCommand("goGroupRight");
- var newCursor = codeMirror.getCursor("head");
- if (newCursor.ch === 0 && newCursor.line !== 0) {
- codeMirror.setExtending(false);
- return;
- }
-
- var skippedText = codeMirror.getRange(cursor, newCursor, "#");
- if (/^\s+$/.test(skippedText))
- codeMirror.execCommand("goGroupRight");
+ function moveRight(shift, codeMirror) {
+ codeMirror.setExtending(shift);
+ var cursor = codeMirror.getCursor('head');
+ codeMirror.execCommand('goGroupRight');
+ var newCursor = codeMirror.getCursor('head');
+ if (newCursor.ch === 0 && newCursor.line !== 0) {
codeMirror.setExtending(false);
+ return;
+ }
+
+ var skippedText = codeMirror.getRange(cursor, newCursor, '#');
+ if (/^\s+$/.test(skippedText))
+ codeMirror.execCommand('goGroupRight');
+ codeMirror.setExtending(false);
}
- var modifierKey = WebInspector.isMac() ? "Alt" : "Ctrl";
- var leftKey = modifierKey + "-Left";
- var rightKey = modifierKey + "-Right";
+ var modifierKey = WebInspector.isMac() ? 'Alt' : 'Ctrl';
+ var leftKey = modifierKey + '-Left';
+ var rightKey = modifierKey + '-Right';
var keyMap = {};
keyMap[leftKey] = moveLeft.bind(null, false);
keyMap[rightKey] = moveRight.bind(null, false);
- keyMap["Shift-" + leftKey] = moveLeft.bind(null, true);
- keyMap["Shift-" + rightKey] = moveRight.bind(null, true);
+ keyMap['Shift-' + leftKey] = moveLeft.bind(null, true);
+ keyMap['Shift-' + rightKey] = moveRight.bind(null, true);
codeMirror.addKeyMap(keyMap);
+ }
};
/**
- * @constructor
- * @param {!WebInspector.CodeMirrorTextEditor} textEditor
- * @param {!CodeMirror} codeMirror
+ * @unrestricted
*/
-WebInspector.CodeMirrorTextEditor.SelectNextOccurrenceController = function(textEditor, codeMirror)
-{
+WebInspector.CodeMirrorTextEditor.SelectNextOccurrenceController = class {
+ /**
+ * @param {!WebInspector.CodeMirrorTextEditor} textEditor
+ * @param {!CodeMirror} codeMirror
+ */
+ constructor(textEditor, codeMirror) {
this._textEditor = textEditor;
this._codeMirror = codeMirror;
-};
-
-WebInspector.CodeMirrorTextEditor.SelectNextOccurrenceController.prototype = {
- selectionWillChange: function()
- {
- if (!this._muteSelectionListener)
- delete this._fullWordSelection;
- },
+ }
+
+ selectionWillChange() {
+ if (!this._muteSelectionListener)
+ delete this._fullWordSelection;
+ }
+
+ /**
+ * @param {!Array.<!WebInspector.TextRange>} selections
+ * @param {!WebInspector.TextRange} range
+ * @return {boolean}
+ */
+ _findRange(selections, range) {
+ for (var i = 0; i < selections.length; ++i) {
+ if (range.equal(selections[i]))
+ return true;
+ }
+ return false;
+ }
+
+ undoLastSelection() {
+ this._muteSelectionListener = true;
+ this._codeMirror.execCommand('undoSelection');
+ this._muteSelectionListener = false;
+ }
+
+ selectNextOccurrence() {
+ var selections = this._textEditor.selections();
+ var anyEmptySelection = false;
+ for (var i = 0; i < selections.length; ++i) {
+ var selection = selections[i];
+ anyEmptySelection = anyEmptySelection || selection.isEmpty();
+ if (selection.startLine !== selection.endLine)
+ return;
+ }
+ if (anyEmptySelection) {
+ this._expandSelectionsToWords(selections);
+ return;
+ }
- /**
- * @param {!Array.<!WebInspector.TextRange>} selections
- * @param {!WebInspector.TextRange} range
- * @return {boolean}
- */
- _findRange: function(selections, range)
- {
- for (var i = 0; i < selections.length; ++i) {
- if (range.equal(selections[i]))
- return true;
- }
- return false;
- },
-
- undoLastSelection: function()
- {
- this._muteSelectionListener = true;
- this._codeMirror.execCommand("undoSelection");
- this._muteSelectionListener = false;
- },
-
- selectNextOccurrence: function()
- {
- var selections = this._textEditor.selections();
- var anyEmptySelection = false;
- for (var i = 0; i < selections.length; ++i) {
- var selection = selections[i];
- anyEmptySelection = anyEmptySelection || selection.isEmpty();
- if (selection.startLine !== selection.endLine)
- return;
- }
- if (anyEmptySelection) {
- this._expandSelectionsToWords(selections);
- return;
- }
-
- var last = selections[selections.length - 1];
- var next = last;
- do {
- next = this._findNextOccurrence(next, !!this._fullWordSelection);
- } while (next && this._findRange(selections, next) && !next.equal(last));
-
- if (!next)
- return;
- selections.push(next);
-
- this._muteSelectionListener = true;
- this._textEditor.setSelections(selections, selections.length - 1);
- delete this._muteSelectionListener;
-
- this._textEditor.scrollLineIntoView(next.startLine);
- },
+ var last = selections[selections.length - 1];
+ var next = last;
+ do {
+ next = this._findNextOccurrence(next, !!this._fullWordSelection);
+ } while (next && this._findRange(selections, next) && !next.equal(last));
- /**
- * @param {!Array.<!WebInspector.TextRange>} selections
- */
- _expandSelectionsToWords: function(selections)
- {
- var newSelections = [];
- for (var i = 0; i < selections.length; ++i) {
- var selection = selections[i];
- var startRangeWord = this._textEditor.wordRangeForCursorPosition(selection.startLine, selection.startColumn, WebInspector.TextUtils.isWordChar)
- || WebInspector.TextRange.createFromLocation(selection.startLine, selection.startColumn);
- var endRangeWord = this._textEditor.wordRangeForCursorPosition(selection.endLine, selection.endColumn, WebInspector.TextUtils.isWordChar)
- || WebInspector.TextRange.createFromLocation(selection.endLine, selection.endColumn);
- var newSelection = new WebInspector.TextRange(startRangeWord.startLine, startRangeWord.startColumn, endRangeWord.endLine, endRangeWord.endColumn);
- newSelections.push(newSelection);
- }
- this._textEditor.setSelections(newSelections, newSelections.length - 1);
- this._fullWordSelection = true;
- },
+ if (!next)
+ return;
+ selections.push(next);
- /**
- * @param {!WebInspector.TextRange} range
- * @param {boolean} fullWord
- * @return {?WebInspector.TextRange}
- */
- _findNextOccurrence: function(range, fullWord)
- {
- range = range.normalize();
- var matchedLineNumber;
- var matchedColumnNumber;
- var textToFind = this._textEditor.text(range);
- function findWordInLine(wordRegex, lineNumber, lineText, from, to)
- {
- if (typeof matchedLineNumber === "number")
- return true;
- wordRegex.lastIndex = from;
- var result = wordRegex.exec(lineText);
- if (!result || result.index + textToFind.length > to)
- return false;
- matchedLineNumber = lineNumber;
- matchedColumnNumber = result.index;
- return true;
- }
-
- var iteratedLineNumber;
- function lineIterator(regex, lineHandle)
- {
- if (findWordInLine(regex, iteratedLineNumber++, lineHandle.text, 0, lineHandle.text.length))
- return true;
- }
-
- var regexSource = textToFind.escapeForRegExp();
- if (fullWord)
- regexSource = "\\b" + regexSource + "\\b";
- var wordRegex = new RegExp(regexSource, "g");
- var currentLineText = this._codeMirror.getLine(range.startLine);
-
- findWordInLine(wordRegex, range.startLine, currentLineText, range.endColumn, currentLineText.length);
- iteratedLineNumber = range.startLine + 1;
- this._codeMirror.eachLine(range.startLine + 1, this._codeMirror.lineCount(), lineIterator.bind(null, wordRegex));
- iteratedLineNumber = 0;
- this._codeMirror.eachLine(0, range.startLine, lineIterator.bind(null, wordRegex));
- findWordInLine(wordRegex, range.startLine, currentLineText, 0, range.startColumn);
-
- if (typeof matchedLineNumber !== "number")
- return null;
- return new WebInspector.TextRange(matchedLineNumber, matchedColumnNumber, matchedLineNumber, matchedColumnNumber + textToFind.length);
- }
-};
+ this._muteSelectionListener = true;
+ this._textEditor.setSelections(selections, selections.length - 1);
+ delete this._muteSelectionListener;
-/**
- * @param {string} modeName
- * @param {string} tokenPrefix
- */
-WebInspector.CodeMirrorTextEditor._overrideModeWithPrefixedTokens = function(modeName, tokenPrefix)
-{
- var oldModeName = modeName + "-old";
- if (CodeMirror.modes[oldModeName])
- return;
+ this._textEditor.scrollLineIntoView(next.startLine);
+ }
- CodeMirror.defineMode(oldModeName, CodeMirror.modes[modeName]);
- CodeMirror.defineMode(modeName, modeConstructor);
-
- function modeConstructor(config, parserConfig)
- {
- var innerConfig = {};
- for (var i in parserConfig)
- innerConfig[i] = parserConfig[i];
- innerConfig.name = oldModeName;
- var codeMirrorMode = CodeMirror.getMode(config, innerConfig);
- codeMirrorMode.name = modeName;
- codeMirrorMode.token = tokenOverride.bind(null, codeMirrorMode.token);
- return codeMirrorMode;
+ /**
+ * @param {!Array.<!WebInspector.TextRange>} selections
+ */
+ _expandSelectionsToWords(selections) {
+ var newSelections = [];
+ for (var i = 0; i < selections.length; ++i) {
+ var selection = selections[i];
+ var startRangeWord = this._textEditor.wordRangeForCursorPosition(
+ selection.startLine, selection.startColumn, WebInspector.TextUtils.isWordChar) ||
+ WebInspector.TextRange.createFromLocation(selection.startLine, selection.startColumn);
+ var endRangeWord = this._textEditor.wordRangeForCursorPosition(
+ selection.endLine, selection.endColumn, WebInspector.TextUtils.isWordChar) ||
+ WebInspector.TextRange.createFromLocation(selection.endLine, selection.endColumn);
+ var newSelection = new WebInspector.TextRange(
+ startRangeWord.startLine, startRangeWord.startColumn, endRangeWord.endLine, endRangeWord.endColumn);
+ newSelections.push(newSelection);
+ }
+ this._textEditor.setSelections(newSelections, newSelections.length - 1);
+ this._fullWordSelection = true;
+ }
+
+ /**
+ * @param {!WebInspector.TextRange} range
+ * @param {boolean} fullWord
+ * @return {?WebInspector.TextRange}
+ */
+ _findNextOccurrence(range, fullWord) {
+ range = range.normalize();
+ var matchedLineNumber;
+ var matchedColumnNumber;
+ var textToFind = this._textEditor.text(range);
+ function findWordInLine(wordRegex, lineNumber, lineText, from, to) {
+ if (typeof matchedLineNumber === 'number')
+ return true;
+ wordRegex.lastIndex = from;
+ var result = wordRegex.exec(lineText);
+ if (!result || result.index + textToFind.length > to)
+ return false;
+ matchedLineNumber = lineNumber;
+ matchedColumnNumber = result.index;
+ return true;
}
- function tokenOverride(superToken, stream, state)
- {
- var token = superToken(stream, state);
- return token ? tokenPrefix + token.split(/ +/).join(" " + tokenPrefix) : token;
+ var iteratedLineNumber;
+ function lineIterator(regex, lineHandle) {
+ if (findWordInLine(regex, iteratedLineNumber++, lineHandle.text, 0, lineHandle.text.length))
+ return true;
}
+
+ var regexSource = textToFind.escapeForRegExp();
+ if (fullWord)
+ regexSource = '\\b' + regexSource + '\\b';
+ var wordRegex = new RegExp(regexSource, 'g');
+ var currentLineText = this._codeMirror.getLine(range.startLine);
+
+ findWordInLine(wordRegex, range.startLine, currentLineText, range.endColumn, currentLineText.length);
+ iteratedLineNumber = range.startLine + 1;
+ this._codeMirror.eachLine(range.startLine + 1, this._codeMirror.lineCount(), lineIterator.bind(null, wordRegex));
+ iteratedLineNumber = 0;
+ this._codeMirror.eachLine(0, range.startLine, lineIterator.bind(null, wordRegex));
+ findWordInLine(wordRegex, range.startLine, currentLineText, 0, range.startColumn);
+
+ if (typeof matchedLineNumber !== 'number')
+ return null;
+ return new WebInspector.TextRange(
+ matchedLineNumber, matchedColumnNumber, matchedLineNumber, matchedColumnNumber + textToFind.length);
+ }
};
+
/**
* @interface
*/
WebInspector.TextEditorPositionHandle = function() {};
WebInspector.TextEditorPositionHandle.prototype = {
- /**
- * @return {?{lineNumber: number, columnNumber: number}}
- */
- resolve: function() { },
-
- /**
- * @param {!WebInspector.TextEditorPositionHandle} positionHandle
- * @return {boolean}
- */
- equal: function(positionHandle) { }
+ /**
+ * @return {?{lineNumber: number, columnNumber: number}}
+ */
+ resolve: function() {},
+
+ /**
+ * @param {!WebInspector.TextEditorPositionHandle} positionHandle
+ * @return {boolean}
+ */
+ equal: function(positionHandle) {}
};
-WebInspector.CodeMirrorTextEditor._overrideModeWithPrefixedTokens("css", "css-");
-WebInspector.CodeMirrorTextEditor._overrideModeWithPrefixedTokens("javascript", "js-");
-WebInspector.CodeMirrorTextEditor._overrideModeWithPrefixedTokens("xml", "xml-");
+WebInspector.CodeMirrorTextEditor._overrideModeWithPrefixedTokens('css', 'css-');
+WebInspector.CodeMirrorTextEditor._overrideModeWithPrefixedTokens('javascript', 'js-');
+WebInspector.CodeMirrorTextEditor._overrideModeWithPrefixedTokens('xml', 'xml-');
/** @type {!Set<!Runtime.Extension>} */
WebInspector.CodeMirrorTextEditor._loadedMimeModeExtensions = new Set();
-/**
- * @param {string} mimeType
- * @return {!Promise}
- */
-WebInspector.CodeMirrorTextEditor._loadMimeTypeModes = function(mimeType)
-{
- var installed = WebInspector.CodeMirrorTextEditor._loadedMimeModeExtensions;
-
- var nameToExtension = new Map();
- var extensions = self.runtime.extensions(WebInspector.CodeMirrorMimeMode);
- for (var extension of extensions)
- nameToExtension.set(extension.descriptor()["fileName"], extension);
-
- var modesToLoad = new Set();
- for (var extension of extensions) {
- var descriptor = extension.descriptor();
- if (installed.has(extension) || descriptor["mimeTypes"].indexOf(mimeType) === -1)
- continue;
-
- modesToLoad.add(extension);
- var deps = descriptor["dependencies"] || [];
- for (var i = 0; i < deps.length; ++i) {
- var extension = nameToExtension.get(deps[i]);
- if (extension && !installed.has(extension))
- modesToLoad.add(extension);
- }
- }
-
- var promises = [];
- for (var extension of modesToLoad)
- promises.push(extension.instance().then(installMode.bind(null, extension)));
- return Promise.all(promises);
-
- /**
- * @param {!Runtime.Extension} extension
- * @param {!Object} instance
- */
- function installMode(extension, instance)
- {
- if (installed.has(extension))
- return;
- var mode = /** @type {!WebInspector.CodeMirrorMimeMode} */ (instance);
- mode.install(extension);
- installed.add(extension);
- }
-};
/**
* @interface
*/
-WebInspector.CodeMirrorMimeMode = function()
-{
-};
+WebInspector.CodeMirrorMimeMode = function() {};
WebInspector.CodeMirrorMimeMode.prototype = {
- /**
- * @param {!Runtime.Extension} extension
- */
- install: function(extension) { }
+ /**
+ * @param {!Runtime.Extension} extension
+ */
+ install: function(extension) {}
};
/**
- * @constructor
- * @param {!CodeMirror.TextMarker} marker
- * @param {symbol} type
- * @param {!WebInspector.CodeMirrorTextEditor} editor
+ * @unrestricted
*/
-WebInspector.TextEditorBookMark = function(marker, type, editor)
-{
+WebInspector.TextEditorBookMark = class {
+ /**
+ * @param {!CodeMirror.TextMarker} marker
+ * @param {symbol} type
+ * @param {!WebInspector.CodeMirrorTextEditor} editor
+ */
+ constructor(marker, type, editor) {
marker[WebInspector.TextEditorBookMark._symbol] = this;
this._marker = marker;
this._type = type;
this._editor = editor;
+ }
+
+ clear() {
+ var position = this._marker.find();
+ this._marker.clear();
+ if (position)
+ this._editor._updateDecorations(position.line);
+ }
+
+ refresh() {
+ this._marker.changed();
+ var position = this._marker.find();
+ if (position)
+ this._editor._updateDecorations(position.line);
+ }
+
+ /**
+ * @return {symbol}
+ */
+ type() {
+ return this._type;
+ }
+
+ /**
+ * @return {?WebInspector.TextRange}
+ */
+ position() {
+ var pos = this._marker.find();
+ return pos ? WebInspector.TextRange.createFromLocation(pos.line, pos.ch) : null;
+ }
};
-WebInspector.TextEditorBookMark._symbol = Symbol("WebInspector.TextEditorBookMark");
-
-WebInspector.TextEditorBookMark.prototype = {
- clear: function()
- {
- var position = this._marker.find();
- this._marker.clear();
- if (position)
- this._editor._updateDecorations(position.line);
- },
-
- refresh: function()
- {
- this._marker.changed();
- var position = this._marker.find();
- if (position)
- this._editor._updateDecorations(position.line);
- },
-
- /**
- * @return {symbol}
- */
- type: function()
- {
- return this._type;
- },
-
- /**
- * @return {?WebInspector.TextRange}
- */
- position: function()
- {
- var pos = this._marker.find();
- return pos ? WebInspector.TextRange.createFromLocation(pos.line, pos.ch) : null;
- }
-};
+WebInspector.TextEditorBookMark._symbol = Symbol('WebInspector.TextEditorBookMark');
/**
* @typedef {{
@@ -1722,22 +1605,16 @@ WebInspector.TextEditorBookMark.prototype = {
WebInspector.CodeMirrorTextEditor.Decoration;
/**
- * @constructor
* @implements {WebInspector.TextEditorFactory}
+ * @unrestricted
*/
-WebInspector.CodeMirrorTextEditorFactory = function()
-{
+WebInspector.CodeMirrorTextEditorFactory = class {
+ /**
+ * @override
+ * @param {!WebInspector.TextEditor.Options} options
+ * @return {!WebInspector.CodeMirrorTextEditor}
+ */
+ createEditor(options) {
+ return new WebInspector.CodeMirrorTextEditor(options);
+ }
};
-
-WebInspector.CodeMirrorTextEditorFactory.prototype = {
- /**
- * @override
- * @param {!WebInspector.TextEditor.Options} options
- * @return {!WebInspector.CodeMirrorTextEditor}
- */
- createEditor: function(options)
- {
- return new WebInspector.CodeMirrorTextEditor(options);
- }
-};
-

Powered by Google App Engine
This is Rietveld 408576698