| Index: third_party/WebKit/Source/devtools/front_end/source_frame/SourceFrame.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/source_frame/SourceFrame.js b/third_party/WebKit/Source/devtools/front_end/source_frame/SourceFrame.js
|
| index 0a75cb7ed41c56c956da30d8e3cc3827c56af974..7f5db78d5ee2f71c8a55be132d8ca8ec024258cd 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/source_frame/SourceFrame.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/source_frame/SourceFrame.js
|
| @@ -27,19 +27,19 @@
|
| * (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
|
| - * @extends {WebInspector.SimpleView}
|
| * @implements {WebInspector.Searchable}
|
| * @implements {WebInspector.Replaceable}
|
| * @implements {WebInspector.SourcesTextEditorDelegate}
|
| - * @param {string} url
|
| - * @param {function(): !Promise<?string>} lazyContent
|
| + * @unrestricted
|
| */
|
| -WebInspector.SourceFrame = function(url, lazyContent)
|
| -{
|
| - WebInspector.SimpleView.call(this, WebInspector.UIString("Source"));
|
| +WebInspector.SourceFrame = class extends WebInspector.SimpleView {
|
| + /**
|
| + * @param {string} url
|
| + * @param {function(): !Promise<?string>} lazyContent
|
| + */
|
| + constructor(url, lazyContent) {
|
| + super(WebInspector.UIString('Source'));
|
|
|
| this._url = url;
|
| this._lazyContent = lazyContent;
|
| @@ -49,12 +49,16 @@ WebInspector.SourceFrame = function(url, lazyContent)
|
| this._currentSearchResultIndex = -1;
|
| this._searchResults = [];
|
|
|
| - this._textEditor.addEventListener(WebInspector.SourcesTextEditor.Events.EditorFocused, this._resetCurrentSearchResultIndex, this);
|
| - this._textEditor.addEventListener(WebInspector.SourcesTextEditor.Events.SelectionChanged, this._updateSourcePosition, this);
|
| - this._textEditor.addEventListener(WebInspector.SourcesTextEditor.Events.TextChanged, event => this.onTextChanged(event.data.oldRange, event.data.newRange));
|
| + this._textEditor.addEventListener(
|
| + WebInspector.SourcesTextEditor.Events.EditorFocused, this._resetCurrentSearchResultIndex, this);
|
| + this._textEditor.addEventListener(
|
| + WebInspector.SourcesTextEditor.Events.SelectionChanged, this._updateSourcePosition, this);
|
| + this._textEditor.addEventListener(
|
| + WebInspector.SourcesTextEditor.Events.TextChanged,
|
| + event => this.onTextChanged(event.data.oldRange, event.data.newRange));
|
|
|
| this._shortcuts = {};
|
| - this.element.addEventListener("keydown", this._handleKeyDown.bind(this), false);
|
| + this.element.addEventListener('keydown', this._handleKeyDown.bind(this), false);
|
|
|
| this._sourcePosition = new WebInspector.ToolbarText();
|
|
|
| @@ -63,553 +67,512 @@ WebInspector.SourceFrame = function(url, lazyContent)
|
| */
|
| this._searchableView = null;
|
| this._editable = false;
|
| -};
|
| -
|
| -WebInspector.SourceFrame.prototype = {
|
| - /**
|
| - * @param {boolean} editable
|
| - */
|
| - setEditable: function(editable)
|
| - {
|
| - this._editable = editable;
|
| - this._textEditor.setReadOnly(editable);
|
| - },
|
| -
|
| - /**
|
| - * @param {number} key
|
| - * @param {function():boolean} handler
|
| - */
|
| - addShortcut: function(key, handler)
|
| - {
|
| - this._shortcuts[key] = handler;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - wasShown: function()
|
| - {
|
| - this._ensureContentLoaded();
|
| - this._textEditor.show(this.element);
|
| - this._editorAttached = true;
|
| - this._wasShownOrLoaded();
|
| - },
|
| -
|
| - /**
|
| - * @return {boolean}
|
| - */
|
| - isEditorShowing: function()
|
| - {
|
| - return this.isShowing() && this._editorAttached;
|
| - },
|
| -
|
| - willHide: function()
|
| - {
|
| - WebInspector.Widget.prototype.willHide.call(this);
|
| -
|
| - this._clearPositionToReveal();
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!Array<!WebInspector.ToolbarItem>}
|
| - */
|
| - syncToolbarItems: function()
|
| - {
|
| - return [this._sourcePosition];
|
| - },
|
| -
|
| - get loaded()
|
| - {
|
| - return this._loaded;
|
| - },
|
| -
|
| - get textEditor()
|
| - {
|
| - return this._textEditor;
|
| - },
|
| -
|
| - _ensureContentLoaded: function()
|
| - {
|
| - if (!this._contentRequested) {
|
| - this._contentRequested = true;
|
| - this._lazyContent().then(this.setContent.bind(this));
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {number} line 0-based
|
| - * @param {number=} column
|
| - * @param {boolean=} shouldHighlight
|
| - */
|
| - revealPosition: function(line, column, shouldHighlight)
|
| - {
|
| - this._clearLineToScrollTo();
|
| - this._clearSelectionToSet();
|
| - this._positionToReveal = { line: line, column: column, shouldHighlight: shouldHighlight };
|
| - this._innerRevealPositionIfNeeded();
|
| - },
|
| -
|
| - _innerRevealPositionIfNeeded: function()
|
| - {
|
| - if (!this._positionToReveal)
|
| - return;
|
| -
|
| - if (!this.loaded || !this.isEditorShowing())
|
| - return;
|
| -
|
| - this._textEditor.revealPosition(this._positionToReveal.line, this._positionToReveal.column, this._positionToReveal.shouldHighlight);
|
| - delete this._positionToReveal;
|
| - },
|
| -
|
| - _clearPositionToReveal: function()
|
| - {
|
| - this._textEditor.clearPositionHighlight();
|
| - delete this._positionToReveal;
|
| - },
|
| -
|
| - /**
|
| - * @param {number} line
|
| - */
|
| - scrollToLine: function(line)
|
| - {
|
| - this._clearPositionToReveal();
|
| - this._lineToScrollTo = line;
|
| - this._innerScrollToLineIfNeeded();
|
| - },
|
| -
|
| - _innerScrollToLineIfNeeded: function()
|
| - {
|
| - if (typeof this._lineToScrollTo === "number") {
|
| - if (this.loaded && this.isEditorShowing()) {
|
| - this._textEditor.scrollToLine(this._lineToScrollTo);
|
| - delete this._lineToScrollTo;
|
| - }
|
| - }
|
| - },
|
| -
|
| - _clearLineToScrollTo: function()
|
| - {
|
| + }
|
| +
|
| + /**
|
| + * @param {boolean} editable
|
| + */
|
| + setEditable(editable) {
|
| + this._editable = editable;
|
| + this._textEditor.setReadOnly(editable);
|
| + }
|
| +
|
| + /**
|
| + * @param {number} key
|
| + * @param {function():boolean} handler
|
| + */
|
| + addShortcut(key, handler) {
|
| + this._shortcuts[key] = handler;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + wasShown() {
|
| + this._ensureContentLoaded();
|
| + this._textEditor.show(this.element);
|
| + this._editorAttached = true;
|
| + this._wasShownOrLoaded();
|
| + }
|
| +
|
| + /**
|
| + * @return {boolean}
|
| + */
|
| + isEditorShowing() {
|
| + return this.isShowing() && this._editorAttached;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + willHide() {
|
| + super.willHide();
|
| +
|
| + this._clearPositionToReveal();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!Array<!WebInspector.ToolbarItem>}
|
| + */
|
| + syncToolbarItems() {
|
| + return [this._sourcePosition];
|
| + }
|
| +
|
| + get loaded() {
|
| + return this._loaded;
|
| + }
|
| +
|
| + get textEditor() {
|
| + return this._textEditor;
|
| + }
|
| +
|
| + _ensureContentLoaded() {
|
| + if (!this._contentRequested) {
|
| + this._contentRequested = true;
|
| + this._lazyContent().then(this.setContent.bind(this));
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {number} line 0-based
|
| + * @param {number=} column
|
| + * @param {boolean=} shouldHighlight
|
| + */
|
| + revealPosition(line, column, shouldHighlight) {
|
| + this._clearLineToScrollTo();
|
| + this._clearSelectionToSet();
|
| + this._positionToReveal = {line: line, column: column, shouldHighlight: shouldHighlight};
|
| + this._innerRevealPositionIfNeeded();
|
| + }
|
| +
|
| + _innerRevealPositionIfNeeded() {
|
| + if (!this._positionToReveal)
|
| + return;
|
| +
|
| + if (!this.loaded || !this.isEditorShowing())
|
| + return;
|
| +
|
| + this._textEditor.revealPosition(
|
| + this._positionToReveal.line, this._positionToReveal.column, this._positionToReveal.shouldHighlight);
|
| + delete this._positionToReveal;
|
| + }
|
| +
|
| + _clearPositionToReveal() {
|
| + this._textEditor.clearPositionHighlight();
|
| + delete this._positionToReveal;
|
| + }
|
| +
|
| + /**
|
| + * @param {number} line
|
| + */
|
| + scrollToLine(line) {
|
| + this._clearPositionToReveal();
|
| + this._lineToScrollTo = line;
|
| + this._innerScrollToLineIfNeeded();
|
| + }
|
| +
|
| + _innerScrollToLineIfNeeded() {
|
| + if (typeof this._lineToScrollTo === 'number') {
|
| + if (this.loaded && this.isEditorShowing()) {
|
| + this._textEditor.scrollToLine(this._lineToScrollTo);
|
| delete this._lineToScrollTo;
|
| - },
|
| -
|
| - /**
|
| - * @return {!WebInspector.TextRange}
|
| - */
|
| - selection: function()
|
| - {
|
| - return this.textEditor.selection();
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.TextRange} textRange
|
| - */
|
| - setSelection: function(textRange)
|
| - {
|
| - this._selectionToSet = textRange;
|
| - this._innerSetSelectionIfNeeded();
|
| - },
|
| -
|
| - _innerSetSelectionIfNeeded: function()
|
| - {
|
| - if (this._selectionToSet && this.loaded && this.isEditorShowing()) {
|
| - this._textEditor.setSelection(this._selectionToSet);
|
| - delete this._selectionToSet;
|
| - }
|
| - },
|
| -
|
| - _clearSelectionToSet: function()
|
| - {
|
| - delete this._selectionToSet;
|
| - },
|
| -
|
| - _wasShownOrLoaded: function()
|
| - {
|
| - this._innerRevealPositionIfNeeded();
|
| - this._innerSetSelectionIfNeeded();
|
| - this._innerScrollToLineIfNeeded();
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.TextRange} oldRange
|
| - * @param {!WebInspector.TextRange} newRange
|
| - */
|
| - onTextChanged: function(oldRange, newRange)
|
| - {
|
| - if (this._searchConfig && this._searchableView)
|
| - this.performSearch(this._searchConfig, false, false);
|
| - },
|
| -
|
| - /**
|
| - * @param {string} content
|
| - * @param {string} mimeType
|
| - * @return {string}
|
| - */
|
| - _simplifyMimeType: function(content, mimeType)
|
| - {
|
| - if (!mimeType)
|
| - return "";
|
| - if (mimeType.indexOf("javascript") >= 0 ||
|
| - mimeType.indexOf("jscript") >= 0 ||
|
| - mimeType.indexOf("ecmascript") >= 0)
|
| - return "text/javascript";
|
| - // A hack around the fact that files with "php" extension might be either standalone or html embedded php scripts.
|
| - if (mimeType === "text/x-php" && content.match(/\<\?.*\?\>/g))
|
| - return "application/x-httpd-php";
|
| - return mimeType;
|
| - },
|
| -
|
| - /**
|
| - * @param {string} highlighterType
|
| - */
|
| - setHighlighterType: function(highlighterType)
|
| - {
|
| - this._highlighterType = highlighterType;
|
| - this._updateHighlighterType("");
|
| - },
|
| -
|
| - /**
|
| - * @param {string} content
|
| - */
|
| - _updateHighlighterType: function(content)
|
| - {
|
| - this._textEditor.setMimeType(this._simplifyMimeType(content, this._highlighterType));
|
| - },
|
| -
|
| - /**
|
| - * @param {?string} content
|
| - */
|
| - setContent: function(content)
|
| - {
|
| - if (!this._loaded) {
|
| - this._loaded = true;
|
| - this._textEditor.setText(content || "");
|
| - this._textEditor.markClean();
|
| - } else {
|
| - var scrollTop = this._textEditor.scrollTop();
|
| - var selection = this._textEditor.selection();
|
| - this._textEditor.setText(content || "");
|
| - this._textEditor.setScrollTop(scrollTop);
|
| - this._textEditor.setSelection(selection);
|
| - }
|
| -
|
| - this._updateHighlighterType(content || "");
|
| - this._wasShownOrLoaded();
|
| -
|
| - if (this._delayedFindSearchMatches) {
|
| - this._delayedFindSearchMatches();
|
| - delete this._delayedFindSearchMatches;
|
| - }
|
| - this.onTextEditorContentSet();
|
| - },
|
| -
|
| - onTextEditorContentSet: function() {},
|
| -
|
| - /**
|
| - * @param {?WebInspector.SearchableView} view
|
| - */
|
| - setSearchableView: function(view)
|
| - {
|
| - this._searchableView = view;
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.SearchableView.SearchConfig} searchConfig
|
| - * @param {boolean} shouldJump
|
| - * @param {boolean} jumpBackwards
|
| - */
|
| - _doFindSearchMatches: function(searchConfig, shouldJump, jumpBackwards)
|
| - {
|
| - this._currentSearchResultIndex = -1;
|
| - this._searchResults = [];
|
| -
|
| - var regex = searchConfig.toSearchRegex();
|
| - this._searchRegex = regex;
|
| - this._searchResults = this._collectRegexMatches(regex);
|
| -
|
| - if (this._searchableView)
|
| - this._searchableView.updateSearchMatchesCount(this._searchResults.length);
|
| -
|
| - if (!this._searchResults.length)
|
| - this._textEditor.cancelSearchResultsHighlight();
|
| - else if (shouldJump && jumpBackwards)
|
| - this.jumpToPreviousSearchResult();
|
| - else if (shouldJump)
|
| - this.jumpToNextSearchResult();
|
| - else
|
| - this._textEditor.highlightSearchResults(regex, null);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.SearchableView.SearchConfig} searchConfig
|
| - * @param {boolean} shouldJump
|
| - * @param {boolean=} jumpBackwards
|
| - */
|
| - performSearch: function(searchConfig, shouldJump, jumpBackwards)
|
| - {
|
| - if (this._searchableView)
|
| - this._searchableView.updateSearchMatchesCount(0);
|
| -
|
| - this._resetSearch();
|
| - this._searchConfig = searchConfig;
|
| - if (this.loaded)
|
| - this._doFindSearchMatches(searchConfig, shouldJump, !!jumpBackwards);
|
| - else
|
| - this._delayedFindSearchMatches = this._doFindSearchMatches.bind(this, searchConfig, shouldJump, !!jumpBackwards);
|
| -
|
| - this._ensureContentLoaded();
|
| - },
|
| -
|
| - _resetCurrentSearchResultIndex: function()
|
| - {
|
| - if (!this._searchResults.length)
|
| - return;
|
| - this._currentSearchResultIndex = -1;
|
| - if (this._searchableView)
|
| - this._searchableView.updateCurrentMatchIndex(this._currentSearchResultIndex);
|
| - this._textEditor.highlightSearchResults(this._searchRegex, null);
|
| - },
|
| -
|
| - _resetSearch: function()
|
| - {
|
| - delete this._searchConfig;
|
| - delete this._delayedFindSearchMatches;
|
| - this._currentSearchResultIndex = -1;
|
| - this._searchResults = [];
|
| - delete this._searchRegex;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - searchCanceled: function()
|
| - {
|
| - var range = this._currentSearchResultIndex !== -1 ? this._searchResults[this._currentSearchResultIndex] : null;
|
| - this._resetSearch();
|
| - if (!this.loaded)
|
| - return;
|
| - this._textEditor.cancelSearchResultsHighlight();
|
| - if (range)
|
| - this.setSelection(range);
|
| - },
|
| -
|
| - /**
|
| - * @return {boolean}
|
| - */
|
| - hasSearchResults: function()
|
| - {
|
| - return this._searchResults.length > 0;
|
| - },
|
| -
|
| - jumpToFirstSearchResult: function()
|
| - {
|
| - this.jumpToSearchResult(0);
|
| - },
|
| -
|
| - jumpToLastSearchResult: function()
|
| - {
|
| - this.jumpToSearchResult(this._searchResults.length - 1);
|
| - },
|
| -
|
| - /**
|
| - * @return {number}
|
| - */
|
| - _searchResultIndexForCurrentSelection: function()
|
| - {
|
| - return this._searchResults.lowerBound(this._textEditor.selection().collapseToEnd(), WebInspector.TextRange.comparator);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - jumpToNextSearchResult: function()
|
| - {
|
| - var currentIndex = this._searchResultIndexForCurrentSelection();
|
| - var nextIndex = this._currentSearchResultIndex === -1 ? currentIndex : currentIndex + 1;
|
| - this.jumpToSearchResult(nextIndex);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - jumpToPreviousSearchResult: function()
|
| - {
|
| - var currentIndex = this._searchResultIndexForCurrentSelection();
|
| - this.jumpToSearchResult(currentIndex - 1);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {boolean}
|
| - */
|
| - supportsCaseSensitiveSearch: function()
|
| - {
|
| - return true;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {boolean}
|
| - */
|
| - supportsRegexSearch: function()
|
| - {
|
| - return true;
|
| - },
|
| -
|
| - get currentSearchResultIndex()
|
| - {
|
| - return this._currentSearchResultIndex;
|
| - },
|
| -
|
| - jumpToSearchResult: function(index)
|
| - {
|
| - if (!this.loaded || !this._searchResults.length)
|
| - return;
|
| - this._currentSearchResultIndex = (index + this._searchResults.length) % this._searchResults.length;
|
| - if (this._searchableView)
|
| - this._searchableView.updateCurrentMatchIndex(this._currentSearchResultIndex);
|
| - this._textEditor.highlightSearchResults(this._searchRegex, this._searchResults[this._currentSearchResultIndex]);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.SearchableView.SearchConfig} searchConfig
|
| - * @param {string} replacement
|
| - */
|
| - replaceSelectionWith: function(searchConfig, replacement)
|
| - {
|
| - var range = this._searchResults[this._currentSearchResultIndex];
|
| - if (!range)
|
| - return;
|
| - this._textEditor.highlightSearchResults(this._searchRegex, null);
|
| -
|
| - var oldText = this._textEditor.text(range);
|
| - var regex = searchConfig.toSearchRegex();
|
| - var text;
|
| - if (regex.__fromRegExpQuery)
|
| - text = oldText.replace(regex, replacement);
|
| - else
|
| - text = oldText.replace(regex, function() { return replacement; });
|
| -
|
| - var newRange = this._textEditor.editRange(range, text);
|
| - this._textEditor.setSelection(newRange.collapseToEnd());
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.SearchableView.SearchConfig} searchConfig
|
| - * @param {string} replacement
|
| - */
|
| - replaceAllWith: function(searchConfig, replacement)
|
| - {
|
| - this._resetCurrentSearchResultIndex();
|
| -
|
| - var text = this._textEditor.text();
|
| - var range = this._textEditor.fullRange();
|
| -
|
| - var regex = searchConfig.toSearchRegex(true);
|
| - if (regex.__fromRegExpQuery)
|
| - text = text.replace(regex, replacement);
|
| - else
|
| - text = text.replace(regex, function() { return replacement; });
|
| -
|
| - var ranges = this._collectRegexMatches(regex);
|
| - if (!ranges.length)
|
| - return;
|
| -
|
| - // Calculate the position of the end of the last range to be edited.
|
| - var currentRangeIndex = ranges.lowerBound(this._textEditor.selection(), WebInspector.TextRange.comparator);
|
| - var lastRangeIndex = mod(currentRangeIndex - 1, ranges.length);
|
| - var lastRange = ranges[lastRangeIndex];
|
| - var replacementLineEndings = replacement.computeLineEndings();
|
| - var replacementLineCount = replacementLineEndings.length;
|
| - var lastLineNumber = lastRange.startLine + replacementLineEndings.length - 1;
|
| - var lastColumnNumber = lastRange.startColumn;
|
| - if (replacementLineEndings.length > 1)
|
| - lastColumnNumber = replacementLineEndings[replacementLineCount - 1] - replacementLineEndings[replacementLineCount - 2] - 1;
|
| -
|
| - this._textEditor.editRange(range, text);
|
| - this._textEditor.revealPosition(lastLineNumber, lastColumnNumber);
|
| - this._textEditor.setSelection(WebInspector.TextRange.createFromLocation(lastLineNumber, lastColumnNumber));
|
| - },
|
| -
|
| - _collectRegexMatches: function(regexObject)
|
| - {
|
| - var ranges = [];
|
| - for (var i = 0; i < this._textEditor.linesCount; ++i) {
|
| - var line = this._textEditor.line(i);
|
| - var offset = 0;
|
| - do {
|
| - var match = regexObject.exec(line);
|
| - if (match) {
|
| - var matchEndIndex = match.index + Math.max(match[0].length, 1);
|
| - if (match[0].length)
|
| - ranges.push(new WebInspector.TextRange(i, offset + match.index, i, offset + matchEndIndex));
|
| - offset += matchEndIndex;
|
| - line = line.substring(matchEndIndex);
|
| - }
|
| - } while (match && line);
|
| - }
|
| - return ranges;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!Promise}
|
| - */
|
| - populateLineGutterContextMenu: function(contextMenu, lineNumber)
|
| - {
|
| - return Promise.resolve();
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!Promise}
|
| - */
|
| - populateTextAreaContextMenu: function(contextMenu, lineNumber, columnNumber)
|
| - {
|
| - return Promise.resolve();
|
| - },
|
| + }
|
| + }
|
| + }
|
| +
|
| + _clearLineToScrollTo() {
|
| + delete this._lineToScrollTo;
|
| + }
|
| +
|
| + /**
|
| + * @return {!WebInspector.TextRange}
|
| + */
|
| + selection() {
|
| + return this.textEditor.selection();
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.TextRange} textRange
|
| + */
|
| + setSelection(textRange) {
|
| + this._selectionToSet = textRange;
|
| + this._innerSetSelectionIfNeeded();
|
| + }
|
| +
|
| + _innerSetSelectionIfNeeded() {
|
| + if (this._selectionToSet && this.loaded && this.isEditorShowing()) {
|
| + this._textEditor.setSelection(this._selectionToSet);
|
| + delete this._selectionToSet;
|
| + }
|
| + }
|
| +
|
| + _clearSelectionToSet() {
|
| + delete this._selectionToSet;
|
| + }
|
| +
|
| + _wasShownOrLoaded() {
|
| + this._innerRevealPositionIfNeeded();
|
| + this._innerSetSelectionIfNeeded();
|
| + this._innerScrollToLineIfNeeded();
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.TextRange} oldRange
|
| + * @param {!WebInspector.TextRange} newRange
|
| + */
|
| + onTextChanged(oldRange, newRange) {
|
| + if (this._searchConfig && this._searchableView)
|
| + this.performSearch(this._searchConfig, false, false);
|
| + }
|
| +
|
| + /**
|
| + * @param {string} content
|
| + * @param {string} mimeType
|
| + * @return {string}
|
| + */
|
| + _simplifyMimeType(content, mimeType) {
|
| + if (!mimeType)
|
| + return '';
|
| + if (mimeType.indexOf('javascript') >= 0 || mimeType.indexOf('jscript') >= 0 || mimeType.indexOf('ecmascript') >= 0)
|
| + return 'text/javascript';
|
| + // A hack around the fact that files with "php" extension might be either standalone or html embedded php scripts.
|
| + if (mimeType === 'text/x-php' && content.match(/\<\?.*\?\>/g))
|
| + return 'application/x-httpd-php';
|
| + return mimeType;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} highlighterType
|
| + */
|
| + setHighlighterType(highlighterType) {
|
| + this._highlighterType = highlighterType;
|
| + this._updateHighlighterType('');
|
| + }
|
| +
|
| + /**
|
| + * @param {string} content
|
| + */
|
| + _updateHighlighterType(content) {
|
| + this._textEditor.setMimeType(this._simplifyMimeType(content, this._highlighterType));
|
| + }
|
| +
|
| + /**
|
| + * @param {?string} content
|
| + */
|
| + setContent(content) {
|
| + if (!this._loaded) {
|
| + this._loaded = true;
|
| + this._textEditor.setText(content || '');
|
| + this._textEditor.markClean();
|
| + } else {
|
| + var scrollTop = this._textEditor.scrollTop();
|
| + var selection = this._textEditor.selection();
|
| + this._textEditor.setText(content || '');
|
| + this._textEditor.setScrollTop(scrollTop);
|
| + this._textEditor.setSelection(selection);
|
| + }
|
| +
|
| + this._updateHighlighterType(content || '');
|
| + this._wasShownOrLoaded();
|
| +
|
| + if (this._delayedFindSearchMatches) {
|
| + this._delayedFindSearchMatches();
|
| + delete this._delayedFindSearchMatches;
|
| + }
|
| + this.onTextEditorContentSet();
|
| + }
|
| +
|
| + onTextEditorContentSet() {
|
| + }
|
| +
|
| + /**
|
| + * @param {?WebInspector.SearchableView} view
|
| + */
|
| + setSearchableView(view) {
|
| + this._searchableView = view;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.SearchableView.SearchConfig} searchConfig
|
| + * @param {boolean} shouldJump
|
| + * @param {boolean} jumpBackwards
|
| + */
|
| + _doFindSearchMatches(searchConfig, shouldJump, jumpBackwards) {
|
| + this._currentSearchResultIndex = -1;
|
| + this._searchResults = [];
|
|
|
| - /**
|
| - * @return {boolean}
|
| - */
|
| - canEditSource: function()
|
| - {
|
| - return this._editable;
|
| - },
|
| -
|
| - _updateSourcePosition: function()
|
| - {
|
| - var selections = this._textEditor.selections();
|
| - if (!selections.length)
|
| - return;
|
| - if (selections.length > 1) {
|
| - this._sourcePosition.setText(WebInspector.UIString("%d selection regions", selections.length));
|
| - return;
|
| - }
|
| - var textRange = selections[0];
|
| - if (textRange.isEmpty()) {
|
| - this._sourcePosition.setText(WebInspector.UIString("Line %d, Column %d", textRange.endLine + 1, textRange.endColumn + 1));
|
| - return;
|
| + var regex = searchConfig.toSearchRegex();
|
| + this._searchRegex = regex;
|
| + this._searchResults = this._collectRegexMatches(regex);
|
| +
|
| + if (this._searchableView)
|
| + this._searchableView.updateSearchMatchesCount(this._searchResults.length);
|
| +
|
| + if (!this._searchResults.length)
|
| + this._textEditor.cancelSearchResultsHighlight();
|
| + else if (shouldJump && jumpBackwards)
|
| + this.jumpToPreviousSearchResult();
|
| + else if (shouldJump)
|
| + this.jumpToNextSearchResult();
|
| + else
|
| + this._textEditor.highlightSearchResults(regex, null);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.SearchableView.SearchConfig} searchConfig
|
| + * @param {boolean} shouldJump
|
| + * @param {boolean=} jumpBackwards
|
| + */
|
| + performSearch(searchConfig, shouldJump, jumpBackwards) {
|
| + if (this._searchableView)
|
| + this._searchableView.updateSearchMatchesCount(0);
|
| +
|
| + this._resetSearch();
|
| + this._searchConfig = searchConfig;
|
| + if (this.loaded)
|
| + this._doFindSearchMatches(searchConfig, shouldJump, !!jumpBackwards);
|
| + else
|
| + this._delayedFindSearchMatches = this._doFindSearchMatches.bind(this, searchConfig, shouldJump, !!jumpBackwards);
|
| +
|
| + this._ensureContentLoaded();
|
| + }
|
| +
|
| + _resetCurrentSearchResultIndex() {
|
| + if (!this._searchResults.length)
|
| + return;
|
| + this._currentSearchResultIndex = -1;
|
| + if (this._searchableView)
|
| + this._searchableView.updateCurrentMatchIndex(this._currentSearchResultIndex);
|
| + this._textEditor.highlightSearchResults(this._searchRegex, null);
|
| + }
|
| +
|
| + _resetSearch() {
|
| + delete this._searchConfig;
|
| + delete this._delayedFindSearchMatches;
|
| + this._currentSearchResultIndex = -1;
|
| + this._searchResults = [];
|
| + delete this._searchRegex;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + searchCanceled() {
|
| + var range = this._currentSearchResultIndex !== -1 ? this._searchResults[this._currentSearchResultIndex] : null;
|
| + this._resetSearch();
|
| + if (!this.loaded)
|
| + return;
|
| + this._textEditor.cancelSearchResultsHighlight();
|
| + if (range)
|
| + this.setSelection(range);
|
| + }
|
| +
|
| + /**
|
| + * @return {boolean}
|
| + */
|
| + hasSearchResults() {
|
| + return this._searchResults.length > 0;
|
| + }
|
| +
|
| + jumpToFirstSearchResult() {
|
| + this.jumpToSearchResult(0);
|
| + }
|
| +
|
| + jumpToLastSearchResult() {
|
| + this.jumpToSearchResult(this._searchResults.length - 1);
|
| + }
|
| +
|
| + /**
|
| + * @return {number}
|
| + */
|
| + _searchResultIndexForCurrentSelection() {
|
| + return this._searchResults.lowerBound(
|
| + this._textEditor.selection().collapseToEnd(), WebInspector.TextRange.comparator);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + jumpToNextSearchResult() {
|
| + var currentIndex = this._searchResultIndexForCurrentSelection();
|
| + var nextIndex = this._currentSearchResultIndex === -1 ? currentIndex : currentIndex + 1;
|
| + this.jumpToSearchResult(nextIndex);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + jumpToPreviousSearchResult() {
|
| + var currentIndex = this._searchResultIndexForCurrentSelection();
|
| + this.jumpToSearchResult(currentIndex - 1);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {boolean}
|
| + */
|
| + supportsCaseSensitiveSearch() {
|
| + return true;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {boolean}
|
| + */
|
| + supportsRegexSearch() {
|
| + return true;
|
| + }
|
| +
|
| + get currentSearchResultIndex() {
|
| + return this._currentSearchResultIndex;
|
| + }
|
| +
|
| + jumpToSearchResult(index) {
|
| + if (!this.loaded || !this._searchResults.length)
|
| + return;
|
| + this._currentSearchResultIndex = (index + this._searchResults.length) % this._searchResults.length;
|
| + if (this._searchableView)
|
| + this._searchableView.updateCurrentMatchIndex(this._currentSearchResultIndex);
|
| + this._textEditor.highlightSearchResults(this._searchRegex, this._searchResults[this._currentSearchResultIndex]);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.SearchableView.SearchConfig} searchConfig
|
| + * @param {string} replacement
|
| + */
|
| + replaceSelectionWith(searchConfig, replacement) {
|
| + var range = this._searchResults[this._currentSearchResultIndex];
|
| + if (!range)
|
| + return;
|
| + this._textEditor.highlightSearchResults(this._searchRegex, null);
|
| +
|
| + var oldText = this._textEditor.text(range);
|
| + var regex = searchConfig.toSearchRegex();
|
| + var text;
|
| + if (regex.__fromRegExpQuery)
|
| + text = oldText.replace(regex, replacement);
|
| + else
|
| + text = oldText.replace(regex, function() {
|
| + return replacement;
|
| + });
|
| +
|
| + var newRange = this._textEditor.editRange(range, text);
|
| + this._textEditor.setSelection(newRange.collapseToEnd());
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.SearchableView.SearchConfig} searchConfig
|
| + * @param {string} replacement
|
| + */
|
| + replaceAllWith(searchConfig, replacement) {
|
| + this._resetCurrentSearchResultIndex();
|
| +
|
| + var text = this._textEditor.text();
|
| + var range = this._textEditor.fullRange();
|
| +
|
| + var regex = searchConfig.toSearchRegex(true);
|
| + if (regex.__fromRegExpQuery)
|
| + text = text.replace(regex, replacement);
|
| + else
|
| + text = text.replace(regex, function() {
|
| + return replacement;
|
| + });
|
| +
|
| + var ranges = this._collectRegexMatches(regex);
|
| + if (!ranges.length)
|
| + return;
|
| +
|
| + // Calculate the position of the end of the last range to be edited.
|
| + var currentRangeIndex = ranges.lowerBound(this._textEditor.selection(), WebInspector.TextRange.comparator);
|
| + var lastRangeIndex = mod(currentRangeIndex - 1, ranges.length);
|
| + var lastRange = ranges[lastRangeIndex];
|
| + var replacementLineEndings = replacement.computeLineEndings();
|
| + var replacementLineCount = replacementLineEndings.length;
|
| + var lastLineNumber = lastRange.startLine + replacementLineEndings.length - 1;
|
| + var lastColumnNumber = lastRange.startColumn;
|
| + if (replacementLineEndings.length > 1)
|
| + lastColumnNumber =
|
| + replacementLineEndings[replacementLineCount - 1] - replacementLineEndings[replacementLineCount - 2] - 1;
|
| +
|
| + this._textEditor.editRange(range, text);
|
| + this._textEditor.revealPosition(lastLineNumber, lastColumnNumber);
|
| + this._textEditor.setSelection(WebInspector.TextRange.createFromLocation(lastLineNumber, lastColumnNumber));
|
| + }
|
| +
|
| + _collectRegexMatches(regexObject) {
|
| + var ranges = [];
|
| + for (var i = 0; i < this._textEditor.linesCount; ++i) {
|
| + var line = this._textEditor.line(i);
|
| + var offset = 0;
|
| + do {
|
| + var match = regexObject.exec(line);
|
| + if (match) {
|
| + var matchEndIndex = match.index + Math.max(match[0].length, 1);
|
| + if (match[0].length)
|
| + ranges.push(new WebInspector.TextRange(i, offset + match.index, i, offset + matchEndIndex));
|
| + offset += matchEndIndex;
|
| + line = line.substring(matchEndIndex);
|
| }
|
| - textRange = textRange.normalize();
|
| -
|
| - var selectedText = this._textEditor.text(textRange);
|
| - if (textRange.startLine === textRange.endLine)
|
| - this._sourcePosition.setText(WebInspector.UIString("%d characters selected", selectedText.length));
|
| - else
|
| - this._sourcePosition.setText(WebInspector.UIString("%d lines, %d characters selected", textRange.endLine - textRange.startLine + 1, selectedText.length));
|
| - },
|
| -
|
| - _handleKeyDown: function(e)
|
| - {
|
| - var shortcutKey = WebInspector.KeyboardShortcut.makeKeyFromEvent(e);
|
| - var handler = this._shortcuts[shortcutKey];
|
| - if (handler && handler())
|
| - e.consume(true);
|
| - },
|
| -
|
| - __proto__: WebInspector.SimpleView.prototype
|
| + } while (match && line);
|
| + }
|
| + return ranges;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!Promise}
|
| + */
|
| + populateLineGutterContextMenu(contextMenu, lineNumber) {
|
| + return Promise.resolve();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!Promise}
|
| + */
|
| + populateTextAreaContextMenu(contextMenu, lineNumber, columnNumber) {
|
| + return Promise.resolve();
|
| + }
|
| +
|
| + /**
|
| + * @return {boolean}
|
| + */
|
| + canEditSource() {
|
| + return this._editable;
|
| + }
|
| +
|
| + _updateSourcePosition() {
|
| + var selections = this._textEditor.selections();
|
| + if (!selections.length)
|
| + return;
|
| + if (selections.length > 1) {
|
| + this._sourcePosition.setText(WebInspector.UIString('%d selection regions', selections.length));
|
| + return;
|
| + }
|
| + var textRange = selections[0];
|
| + if (textRange.isEmpty()) {
|
| + this._sourcePosition.setText(
|
| + WebInspector.UIString('Line %d, Column %d', textRange.endLine + 1, textRange.endColumn + 1));
|
| + return;
|
| + }
|
| + textRange = textRange.normalize();
|
| +
|
| + var selectedText = this._textEditor.text(textRange);
|
| + if (textRange.startLine === textRange.endLine)
|
| + this._sourcePosition.setText(WebInspector.UIString('%d characters selected', selectedText.length));
|
| + else
|
| + this._sourcePosition.setText(WebInspector.UIString(
|
| + '%d lines, %d characters selected', textRange.endLine - textRange.startLine + 1, selectedText.length));
|
| + }
|
| +
|
| + _handleKeyDown(e) {
|
| + var shortcutKey = WebInspector.KeyboardShortcut.makeKeyFromEvent(e);
|
| + var handler = this._shortcuts[shortcutKey];
|
| + if (handler && handler())
|
| + e.consume(true);
|
| + }
|
| };
|
|
|