Diff
Modified: trunk/LayoutTests/ChangeLog (134381 => 134382)
--- trunk/LayoutTests/ChangeLog 2012-11-13 08:42:47 UTC (rev 134381)
+++ trunk/LayoutTests/ChangeLog 2012-11-13 08:48:42 UTC (rev 134382)
@@ -1,3 +1,12 @@
+2012-11-13 Pavel Feldman <pfeld...@chromium.org>
+
+ Web Inspector: move indentation logic into TextEditorModel
+ https://bugs.webkit.org/show_bug.cgi?id=101842
+
+ Reviewed by Vsevolod Vlasov.
+
+ * inspector/editor/indentation.html:
+
2012-11-13 Takashi Sakamoto <ta...@google.com>
Crash when replacing parts of text inputs with content: url(...)
Modified: trunk/LayoutTests/inspector/editor/indentation.html (134381 => 134382)
--- trunk/LayoutTests/inspector/editor/indentation.html 2012-11-13 08:42:47 UTC (rev 134381)
+++ trunk/LayoutTests/inspector/editor/indentation.html 2012-11-13 08:48:42 UTC (rev 134382)
@@ -11,8 +11,6 @@
var model = new WebInspector.TextEditorModel();
model.setText(src);
- function noop() {}
- var textEditorMainPanel = new WebInspector.TextEditorMainPanel(null, model, '', noop, noop, noop, noop);
var selection;
function dumpTextModel(msg)
@@ -22,19 +20,19 @@
InspectorTest.addResult('Selection ' + selection.startLine + ',' + selection.startColumn + ' ' + selection.endLine + ',' + selection.endColumn + '\n');
}
- selection = textEditorMainPanel._indentLines(new WebInspector.TextRange(0, 0, 1, 0));
+ selection = model.indentLines(new WebInspector.TextRange(0, 0, 1, 0));
dumpTextModel("After indenting first fully selected line");
- selection = textEditorMainPanel._indentLines(new WebInspector.TextRange(0, 5, 1, 0));
+ selection = model.indentLines(new WebInspector.TextRange(0, 5, 1, 0));
dumpTextModel("After indenting first partially selected line");
- selection = textEditorMainPanel._unindentLines(new WebInspector.TextRange(0, 0, 2, 0));
+ selection = model.unindentLines(new WebInspector.TextRange(0, 0, 2, 0));
dumpTextModel("After unindenting two fully selected lines");
- selection = textEditorMainPanel._unindentLines(new WebInspector.TextRange(0, 5, 1, 6));
+ selection = model.unindentLines(new WebInspector.TextRange(0, 5, 1, 6));
dumpTextModel("After unindenting two partially selected lines (bug 97462)");
- selection = textEditorMainPanel._unindentLines(new WebInspector.TextRange(0, 0, 2, 3));
+ selection = model.unindentLines(new WebInspector.TextRange(0, 0, 2, 3));
dumpTextModel("After unindenting three partially selected lines");
InspectorTest.completeTest();
Modified: trunk/Source/WebCore/ChangeLog (134381 => 134382)
--- trunk/Source/WebCore/ChangeLog 2012-11-13 08:42:47 UTC (rev 134381)
+++ trunk/Source/WebCore/ChangeLog 2012-11-13 08:48:42 UTC (rev 134382)
@@ -1,3 +1,28 @@
+2012-11-13 Pavel Feldman <pfeld...@chromium.org>
+
+ Web Inspector: move indentation logic into TextEditorModel
+ https://bugs.webkit.org/show_bug.cgi?id=101842
+
+ Reviewed by Vsevolod Vlasov.
+
+ I'd like to move as much headless logic into the TextEditorModel as possible.
+ Drive by: removed some dead code, converted getter into function and moved undo
+ mark state into the model as well.
+
+ * inspector/front-end/DefaultTextEditor.js:
+ (WebInspector.DefaultTextEditor.prototype.editRange):
+ (WebInspector.DefaultTextEditor.prototype._syncDecorationsForLine):
+ (WebInspector.TextEditorChunkedPanel.prototype._splitChunkOnALine):
+ (WebInspector.TextEditorMainPanel.prototype.handleEnterKey.get var):
+ (WebInspector.TextEditorMainPanel.prototype.handleEnterKey):
+ (WebInspector.TextEditorMainPanel.prototype._applyDomUpdates):
+ (WebInspector.TextEditorMainPanel.prototype._updateChunksForRanges):
+ (WebInspector.TextEditorMainChunk):
+ (WebInspector.TextEditorMainChunk.prototype.isDecorated):
+ (WebInspector.TextEditorMainChunk.prototype.set expanded):
+ * inspector/front-end/TextEditorModel.js:
+ (WebInspector.TextEditorModel.endsWithBracketRegex.):
+
2012-11-13 Hayato Ito <hay...@chromium.org>
Unreviewed attempt to fix the chromium mac-build after r134348.
Modified: trunk/Source/WebCore/inspector/front-end/DefaultTextEditor.js (134381 => 134382)
--- trunk/Source/WebCore/inspector/front-end/DefaultTextEditor.js 2012-11-13 08:42:47 UTC (rev 134381)
+++ trunk/Source/WebCore/inspector/front-end/DefaultTextEditor.js 2012-11-13 08:48:42 UTC (rev 134382)
@@ -321,7 +321,6 @@
editRange: function(range, text)
{
this._enterInternalTextChangeMode();
- this._textModel.markUndoableState();
var newRange = this._textModel.editRange(range, text);
this._exitInternalTextChangeMode(range, newRange);
return newRange;
@@ -369,7 +368,7 @@
return;
var mainChunk = this._mainPanel.chunkForLine(lineNumber);
- if (mainChunk.linesCount === 1 && mainChunk.decorated) {
+ if (mainChunk.linesCount === 1 && mainChunk.isDecorated()) {
var gutterChunk = this._gutterPanel.makeLineAChunk(lineNumber);
var height = mainChunk.height;
if (height)
@@ -731,7 +730,6 @@
// Prefix chunk.
if (lineNumber > oldChunk.startLine) {
var prefixChunk = this._createNewChunk(oldChunk.startLine, lineNumber);
- prefixChunk.readOnly = oldChunk.readOnly;
this._textChunks.splice(insertIndex++, 0, prefixChunk);
this._container.insertBefore(prefixChunk.element, oldChunk.element);
}
@@ -739,14 +737,12 @@
// Line chunk.
var endLine = createSuffixChunk ? lineNumber + 1 : oldChunk.startLine + oldChunk.linesCount;
var lineChunk = this._createNewChunk(lineNumber, endLine);
- lineChunk.readOnly = oldChunk.readOnly;
this._textChunks.splice(insertIndex++, 0, lineChunk);
this._container.insertBefore(lineChunk.element, oldChunk.element);
// Suffix chunk.
if (oldChunk.startLine + oldChunk.linesCount > endLine) {
var suffixChunk = this._createNewChunk(endLine, oldChunk.startLine + oldChunk.linesCount);
- suffixChunk.readOnly = oldChunk.readOnly;
this._textChunks.splice(insertIndex, 0, suffixChunk);
this._container.insertBefore(suffixChunk.element, oldChunk.element);
}
@@ -1364,47 +1360,6 @@
},
/**
- * @param {number} startLine
- * @param {number} endLine
- */
- setEditableRange: function(startLine, endLine)
- {
- this.beginDomUpdates();
-
- var firstChunkNumber = this._chunkNumberForLine(startLine);
- var firstChunk = this._textChunks[firstChunkNumber];
- if (firstChunk.startLine !== startLine) {
- this._splitChunkOnALine(startLine, firstChunkNumber);
- firstChunkNumber += 1;
- }
-
- var lastChunkNumber = this._textChunks.length;
- if (endLine !== this._textModel.linesCount) {
- lastChunkNumber = this._chunkNumberForLine(endLine);
- var lastChunk = this._textChunks[lastChunkNumber];
- if (lastChunk && lastChunk.startLine !== endLine) {
- this._splitChunkOnALine(endLine, lastChunkNumber);
- lastChunkNumber += 1;
- }
- }
-
- for (var chunkNumber = 0; chunkNumber < firstChunkNumber; ++chunkNumber)
- this._textChunks[chunkNumber].readOnly = true;
- for (var chunkNumber = firstChunkNumber; chunkNumber < lastChunkNumber; ++chunkNumber)
- this._textChunks[chunkNumber].readOnly = false;
- for (var chunkNumber = lastChunkNumber; chunkNumber < this._textChunks.length; ++chunkNumber)
- this._textChunks[chunkNumber].readOnly = true;
-
- this.endDomUpdates();
- },
-
- clearEditableRange: function()
- {
- for (var chunkNumber = 0; chunkNumber < this._textChunks.length; ++chunkNumber)
- this._textChunks[chunkNumber].readOnly = false;
- },
-
- /**
* @param {WebInspector.TextRange} range
*/
markAndRevealRange: function(range)
@@ -1514,12 +1469,12 @@
var newRange;
var rangeWasEmpty = range.isEmpty();
if (shiftKey)
- newRange = this._unindentLines(range);
+ newRange = this._textModel.unindentLines(range);
else {
if (rangeWasEmpty)
- newRange = this._editRange(range, WebInspector.settings.textEditorIndent.get());
+ newRange = this._textModel.editRange(range, WebInspector.settings.textEditorIndent.get());
else
- newRange = this._indentLines(range);
+ newRange = this._textModel.indentLines(range);
}
this._exitTextChangeMode(range, newRange);
@@ -1530,78 +1485,6 @@
return true;
},
- /**
- * @param {WebInspector.TextRange} range
- */
- _indentLines: function(range)
- {
- var indent = WebInspector.settings.textEditorIndent.get();
-
- if (this._lastEditedRange)
- this._textModel.markUndoableState();
-
- var newRange = range.clone();
-
- // Do not change a selection start position when it is at the beginning of a line
- if (range.startColumn)
- newRange.startColumn += indent.length;
-
- var indentEndLine = range.endLine;
- if (range.endColumn)
- newRange.endColumn += indent.length;
- else
- indentEndLine--;
-
- for (var lineNumber = range.startLine; lineNumber <= indentEndLine; lineNumber++)
- this._textModel.editRange(WebInspector.TextRange.createFromLocation(lineNumber, 0), indent);
-
- this._lastEditedRange = newRange;
-
- return newRange;
- },
-
- /**
- * @param {WebInspector.TextRange} range
- */
- _unindentLines: function(range)
- {
- if (this._lastEditedRange)
- this._textModel.markUndoableState();
-
- var indent = WebInspector.settings.textEditorIndent.get();
- var indentLength = indent === WebInspector.TextEditorModel.Indent.TabCharacter ? 4 : indent.length;
- var lineIndentRegex = new RegExp("^ {1," + indentLength + "}");
- var newRange = range.clone();
-
- var indentEndLine = range.endLine;
- if (!range.endColumn)
- indentEndLine--;
-
- for (var lineNumber = range.startLine; lineNumber <= indentEndLine; lineNumber++) {
- var line = this._textModel.line(lineNumber);
- var firstCharacter = line.charAt(0);
- var lineIndentLength;
-
- if (firstCharacter === " ")
- lineIndentLength = line.match(lineIndentRegex)[0].length;
- else if (firstCharacter === "\t")
- lineIndentLength = 1;
- else
- continue;
-
- this._textModel.editRange(new WebInspector.TextRange(lineNumber, 0, lineNumber, lineIndentLength), "");
-
- if (lineNumber === range.startLine)
- newRange.startColumn = Math.max(0, newRange.startColumn - lineIndentLength);
- if (lineNumber === range.endLine)
- newRange.endColumn = Math.max(0, newRange.endColumn - lineIndentLength);
- }
-
- this._lastEditedRange = newRange;
-
- return newRange;
- },
-
handleEnterKey: function()
{
if (this.readOnly())
@@ -1638,11 +1521,11 @@
// {
// |
// }
- newRange = this._editRange(range, lineBreak + indent + lineBreak + currentIndent);
+ newRange = this._textModel.editRange(range, lineBreak + indent + lineBreak + currentIndent);
newRange.endLine--;
newRange.endColumn += textEditorIndent.length;
} else
- newRange = this._editRange(range, lineBreak + indent);
+ newRange = this._textModel.editRange(range, lineBreak + indent);
this._exitTextChangeMode(range, newRange);
this.endUpdates();
@@ -2334,7 +2217,7 @@
// This is a "foreign" call outside of this class. Should be before we delete the dirty lines flag.
this._enterTextChangeMode();
- var newRange = this._editRange(oldRange, newContent);
+ var newRange = this._textModel.editRange(oldRange, newContent);
this._paintScheduledLines(true);
this._restoreSelection(selection);
@@ -2389,22 +2272,7 @@
/**
* @param {WebInspector.TextRange} range
- * @param {string} text
*/
- _editRange: function(range, text)
- {
- if (this._lastEditedRange && (!text || text.indexOf("\n") !== -1 || this._lastEditedRange.endLine !== range.startLine || this._lastEditedRange.endColumn !== range.startColumn))
- this._textModel.markUndoableState();
-
- var newRange = this._textModel.editRange(range, text);
- this._lastEditedRange = newRange;
-
- return newRange;
- },
-
- /**
- * @param {WebInspector.TextRange} range
- */
_removeDecorationsInRange: function(range)
{
for (var i = this._chunkNumberForLine(range.startLine); i < this._textChunks.length; ++i) {
@@ -2475,7 +2343,7 @@
// Maybe merge with the next chunk, so that we should not create 1-sized chunks when appending new lines one by one.
var chunk = this._textChunks[lastChunkNumber + 1];
var linesInLastChunk = linesCount % this._defaultChunkSize;
- if (chunk && !chunk.decorated && linesInLastChunk > 0 && linesInLastChunk + chunk.linesCount <= this._defaultChunkSize) {
+ if (chunk && !chunk.isDecorated() && linesInLastChunk > 0 && linesInLastChunk + chunk.linesCount <= this._defaultChunkSize) {
++lastChunkNumber;
linesCount += chunk.linesCount;
}
@@ -2577,7 +2445,7 @@
* @param {WebInspector.TextEditorChunkedPanel} chunkedPanel
* @param {number} startLine
* @param {number} endLine
-*/
+ */
WebInspector.TextEditorMainChunk = function(chunkedPanel, startLine, endLine)
{
this._chunkedPanel = chunkedPanel;
@@ -2592,7 +2460,6 @@
this.linesCount = endLine - startLine;
this._expanded = false;
- this._readOnly = false;
this.updateCollapsedLineRow();
}
@@ -2641,7 +2508,7 @@
/**
* @return {boolean}
*/
- get decorated()
+ isDecorated: function()
{
return this.element.className !== "webkit-line-content" || !!(this.element.decorationsElement && this.element.decorationsElement.firstChild);
},
@@ -2692,7 +2559,6 @@
var parentElement = this.element.parentElement;
for (var i = this.startLine; i < this.startLine + this.linesCount; ++i) {
var lineRow = this._createRow(i);
- this._updateElementReadOnlyState(lineRow);
parentElement.insertBefore(lineRow, this.element);
this._expandedLineRows.push(lineRow);
}
@@ -2718,36 +2584,7 @@
this._chunkedPanel.endDomUpdates();
},
- set readOnly(readOnly)
- {
- if (this._readOnly === readOnly)
- return;
-
- this._readOnly = readOnly;
- this._updateElementReadOnlyState(this.element);
- if (this._expandedLineRows) {
- for (var i = 0; i < this._expandedLineRows.length; ++i)
- this._updateElementReadOnlyState(this._expandedLineRows[i]);
- }
- },
-
/**
- * @return {boolean}
- */
- get readOnly()
- {
- return this._readOnly;
- },
-
- _updateElementReadOnlyState: function(element)
- {
- if (this._readOnly)
- element.addStyleClass("text-editor-read-only");
- else
- element.removeStyleClass("text-editor-read-only");
- },
-
- /**
* @return {number}
*/
get height()
Modified: trunk/Source/WebCore/inspector/front-end/TextEditorModel.js (134381 => 134382)
--- trunk/Source/WebCore/inspector/front-end/TextEditorModel.js 2012-11-13 08:42:47 UTC (rev 134381)
+++ trunk/Source/WebCore/inspector/front-end/TextEditorModel.js 2012-11-13 08:48:42 UTC (rev 134382)
@@ -238,12 +238,25 @@
* @return {WebInspector.TextRange}
*/
editRange: function(range, text)
+ {
+ if (this._lastEditedRange && (!text || text.indexOf("\n") !== -1 || this._lastEditedRange.endLine !== range.startLine || this._lastEditedRange.endColumn !== range.startColumn))
+ this._markUndoableState();
+ return this._innerEditRange(range, text);
+ },
+
+ /**
+ * @param {WebInspector.TextRange} range
+ * @param {string} text
+ * @return {WebInspector.TextRange}
+ */
+ _innerEditRange: function(range, text)
{
var originalText = this.copyRange(range);
if (text === originalText)
return range; // Noop
var newRange = this._innerSetText(range, text);
+ this._lastEditedRange = newRange;
this._pushUndoableCommand(newRange, originalText);
this.dispatchEventToListeners(WebInspector.TextEditorModel.Events.TextChanged, { oldRange: range, newRange: newRange });
return newRange;
@@ -477,7 +490,7 @@
{
if (!this._redoStack || !this._redoStack.length)
return null;
- this.markUndoableState();
+ this._markUndoableState();
this._inRedo = true;
var range = this._doUndo(this._redoStack, beforeCallback, afterCallback);
@@ -502,7 +515,7 @@
if (beforeCallback)
beforeCallback();
- range = this.editRange(command.newRange, command.originalText);
+ range = this._innerEditRange(command.newRange, command.originalText);
if (afterCallback)
afterCallback(command.newRange, range);
@@ -513,7 +526,7 @@
return range;
},
- markUndoableState: function()
+ _markUndoableState: function()
{
if (this._undoStack.length)
this._undoStack[this._undoStack.length - 1].explicit = true;
@@ -530,5 +543,71 @@
this._undoStack = [];
},
+ /**
+ * @param {WebInspector.TextRange} range
+ * @return {WebInspector.TextRange}
+ */
+ indentLines: function(range)
+ {
+ this._markUndoableState();
+
+ var indent = WebInspector.settings.textEditorIndent.get();
+ var newRange = range.clone();
+ // Do not change a selection start position when it is at the beginning of a line
+ if (range.startColumn)
+ newRange.startColumn += indent.length;
+
+ var indentEndLine = range.endLine;
+ if (range.endColumn)
+ newRange.endColumn += indent.length;
+ else
+ indentEndLine--;
+
+ for (var lineNumber = range.startLine; lineNumber <= indentEndLine; lineNumber++)
+ this._innerEditRange(WebInspector.TextRange.createFromLocation(lineNumber, 0), indent);
+
+ return newRange;
+ },
+
+ /**
+ * @param {WebInspector.TextRange} range
+ * @return {WebInspector.TextRange}
+ */
+ unindentLines: function(range)
+ {
+ this._markUndoableState();
+
+ var indent = WebInspector.settings.textEditorIndent.get();
+ var indentLength = indent === WebInspector.TextEditorModel.Indent.TabCharacter ? 4 : indent.length;
+ var lineIndentRegex = new RegExp("^ {1," + indentLength + "}");
+ var newRange = range.clone();
+
+ var indentEndLine = range.endLine;
+ if (!range.endColumn)
+ indentEndLine--;
+
+ for (var lineNumber = range.startLine; lineNumber <= indentEndLine; lineNumber++) {
+ var line = this.line(lineNumber);
+ var firstCharacter = line.charAt(0);
+ var lineIndentLength;
+
+ if (firstCharacter === " ")
+ lineIndentLength = line.match(lineIndentRegex)[0].length;
+ else if (firstCharacter === "\t")
+ lineIndentLength = 1;
+ else
+ continue;
+
+ this._innerEditRange(new WebInspector.TextRange(lineNumber, 0, lineNumber, lineIndentLength), "");
+
+ if (lineNumber === range.startLine)
+ newRange.startColumn = Math.max(0, newRange.startColumn - lineIndentLength);
+ if (lineNumber === range.endLine)
+ newRange.endColumn = Math.max(0, newRange.endColumn - lineIndentLength);
+ }
+
+ return newRange;
+ },
+
__proto__: WebInspector.Object.prototype
}