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

Side by Side Diff: Source/devtools/front_end/source_frame/SourceFrame.js

Issue 658403002: DevTools: Support regex search and case sensitive search in sources panel (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fixed tests Created 6 years, 2 months 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 // First try creating regex if user knows the / / hint. 75 // First try creating regex if user knows the / / hint.
76 try { 76 try {
77 if (/^\/.+\/$/.test(query)) { 77 if (/^\/.+\/$/.test(query)) {
78 regex = new RegExp(query.substring(1, query.length - 1), modifiers); 78 regex = new RegExp(query.substring(1, query.length - 1), modifiers);
79 regex.__fromRegExpQuery = true; 79 regex.__fromRegExpQuery = true;
80 } 80 }
81 } catch (e) { 81 } catch (e) {
82 // Silent catch. 82 // Silent catch.
83 } 83 }
84 84
85 // Otherwise just do case-insensitive search. 85 // Otherwise just do a plain text search.
86 if (!regex) 86 if (!regex)
87 regex = createPlainTextSearchRegex(query, "i" + modifiers); 87 regex = createPlainTextSearchRegex(query, modifiers);
88 88
89 return regex; 89 return regex;
90 } 90 }
91 91
92 WebInspector.SourceFrame.Events = { 92 WebInspector.SourceFrame.Events = {
93 ScrollChanged: "ScrollChanged", 93 ScrollChanged: "ScrollChanged",
94 SelectionChanged: "SelectionChanged", 94 SelectionChanged: "SelectionChanged",
95 JumpHappened: "JumpHappened" 95 JumpHappened: "JumpHappened"
96 } 96 }
97 97
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 389
390 _setTextEditorDecorations: function() 390 _setTextEditorDecorations: function()
391 { 391 {
392 this._rowMessageBuckets = {}; 392 this._rowMessageBuckets = {};
393 393
394 this._textEditor.beginUpdates(); 394 this._textEditor.beginUpdates();
395 this._addExistingMessagesToSource(); 395 this._addExistingMessagesToSource();
396 this._textEditor.endUpdates(); 396 this._textEditor.endUpdates();
397 }, 397 },
398 398
399 _doFindSearchMatches: function(searchConfig, shouldJump, jumpBackwards, sear chFinishedCallback)
400 {
401 this._currentSearchResultIndex = -1;
402 this._searchResults = [];
403
404 var modifiers = searchConfig.caseSensitive ? "" : "i";
405 var query = searchConfig.isRegex ? "/" + searchConfig.query + "/" : sear chConfig.query;
406 var regex = WebInspector.SourceFrame.createSearchRegex(query, modifiers) ;
407 this._searchRegex = regex;
408 this._searchResults = this._collectRegexMatches(regex);
409 if (!this._searchResults.length)
410 this._textEditor.cancelSearchResultsHighlight();
411 else if (shouldJump && jumpBackwards)
412 this.jumpToPreviousSearchResult();
413 else if (shouldJump)
414 this.jumpToNextSearchResult();
415 else
416 this._textEditor.highlightSearchResults(regex, null);
417 searchFinishedCallback(this, this._searchResults.length);
418 },
419
399 /** 420 /**
400 * @param {string} query 421 * @param {!WebInspector.SearchableView.SearchConfig} searchConfig
401 * @param {boolean} shouldJump 422 * @param {boolean} shouldJump
402 * @param {boolean} jumpBackwards 423 * @param {boolean} jumpBackwards
403 * @param {function(!WebInspector.View, number)} callback 424 * @param {function(!WebInspector.View, number)} searchFinishedCallback
404 * @param {function(number)} currentMatchChangedCallback 425 * @param {function(number)} currentMatchChangedCallback
405 * @param {function()} searchResultsChangedCallback 426 * @param {function()} searchResultsChangedCallback
406 */ 427 */
407 performSearch: function(query, shouldJump, jumpBackwards, callback, currentM atchChangedCallback, searchResultsChangedCallback) 428 performSearch: function(searchConfig, shouldJump, jumpBackwards, searchFinis hedCallback, currentMatchChangedCallback, searchResultsChangedCallback)
408 { 429 {
409 /**
410 * @param {string} query
411 * @this {WebInspector.SourceFrame}
412 */
413 function doFindSearchMatches(query)
414 {
415 this._currentSearchResultIndex = -1;
416 this._searchResults = [];
417
418 var regex = WebInspector.SourceFrame.createSearchRegex(query);
419 this._searchRegex = regex;
420 this._searchResults = this._collectRegexMatches(regex);
421 if (!this._searchResults.length)
422 this._textEditor.cancelSearchResultsHighlight();
423 else if (shouldJump && jumpBackwards)
424 this.jumpToPreviousSearchResult();
425 else if (shouldJump)
426 this.jumpToNextSearchResult();
427 else
428 this._textEditor.highlightSearchResults(regex, null);
429 callback(this, this._searchResults.length);
430 }
431
432 this._resetSearch(); 430 this._resetSearch();
433 this._currentSearchMatchChangedCallback = currentMatchChangedCallback; 431 this._currentSearchMatchChangedCallback = currentMatchChangedCallback;
434 this._searchResultsChangedCallback = searchResultsChangedCallback; 432 this._searchResultsChangedCallback = searchResultsChangedCallback;
433 var searchFunction = this._doFindSearchMatches.bind(this, searchConfig, shouldJump, jumpBackwards, searchFinishedCallback);
435 if (this.loaded) 434 if (this.loaded)
436 doFindSearchMatches.call(this, query); 435 searchFunction.call(this);
437 else 436 else
438 this._delayedFindSearchMatches = doFindSearchMatches.bind(this, quer y); 437 this._delayedFindSearchMatches = searchFunction;
439 438
440 this._ensureContentLoaded(); 439 this._ensureContentLoaded();
441 }, 440 },
442 441
443 _editorFocused: function() 442 _editorFocused: function()
444 { 443 {
445 this._resetCurrentSearchResultIndex(); 444 this._resetCurrentSearchResultIndex();
446 }, 445 },
447 446
448 _resetCurrentSearchResultIndex: function() 447 _resetCurrentSearchResultIndex: function()
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
540 { 539 {
541 if (!this.loaded || !this._searchResults.length) 540 if (!this.loaded || !this._searchResults.length)
542 return; 541 return;
543 this._currentSearchResultIndex = (index + this._searchResults.length) % this._searchResults.length; 542 this._currentSearchResultIndex = (index + this._searchResults.length) % this._searchResults.length;
544 if (this._currentSearchMatchChangedCallback) 543 if (this._currentSearchMatchChangedCallback)
545 this._currentSearchMatchChangedCallback(this._currentSearchResultInd ex); 544 this._currentSearchMatchChangedCallback(this._currentSearchResultInd ex);
546 this._textEditor.highlightSearchResults(this._searchRegex, this._searchR esults[this._currentSearchResultIndex]); 545 this._textEditor.highlightSearchResults(this._searchRegex, this._searchR esults[this._currentSearchResultIndex]);
547 }, 546 },
548 547
549 /** 548 /**
550 * @param {string} text 549 * @param {string} replacement
551 */ 550 */
552 replaceSelectionWith: function(text) 551 replaceSelectionWith: function(replacement)
553 { 552 {
554 var range = this._searchResults[this._currentSearchResultIndex]; 553 var range = this._searchResults[this._currentSearchResultIndex];
555 if (!range) 554 if (!range)
556 return; 555 return;
557 this._textEditor.highlightSearchResults(this._searchRegex, null); 556 this._textEditor.highlightSearchResults(this._searchRegex, null);
558 var newRange = this._textEditor.editRange(range, text); 557 var newRange = this._textEditor.editRange(range, replacement);
559 this._textEditor.setSelection(newRange.collapseToEnd()); 558 this._textEditor.setSelection(newRange.collapseToEnd());
560 }, 559 },
561 560
562 /** 561 /**
563 * @param {string} query 562 * @param {!WebInspector.SearchableView.SearchConfig} searchConfig
564 * @param {string} replacement 563 * @param {string} replacement
565 */ 564 */
566 replaceAllWith: function(query, replacement) 565 replaceAllWith: function(searchConfig, replacement)
567 { 566 {
568 this._resetCurrentSearchResultIndex(); 567 this._resetCurrentSearchResultIndex();
569 568
570 var text = this._textEditor.text(); 569 var text = this._textEditor.text();
571 var range = this._textEditor.range(); 570 var range = this._textEditor.range();
572 var regex = WebInspector.SourceFrame.createSearchRegex(query, "g"); 571
572 var modifiers = searchConfig.caseSensitive ? "" : "i";
573 var query = searchConfig.isRegex ? "/" + searchConfig.query + "/" : sear chConfig.query;
574 var regex = WebInspector.SourceFrame.createSearchRegex(query, "g" + modi fiers);
573 if (regex.__fromRegExpQuery) 575 if (regex.__fromRegExpQuery)
574 text = text.replace(regex, replacement); 576 text = text.replace(regex, replacement);
575 else 577 else
576 text = text.replace(regex, function() { return replacement; }); 578 text = text.replace(regex, function() { return replacement; });
577 579
578 var ranges = this._collectRegexMatches(regex); 580 var ranges = this._collectRegexMatches(regex);
579 if (!ranges.length) 581 if (!ranges.length)
580 return; 582 return;
581 583
582 // Calculate the position of the end of the last range to be edited. 584 // Calculate the position of the end of the last range to be edited.
(...skipping 14 matching lines...) Expand all
597 599
598 _collectRegexMatches: function(regexObject) 600 _collectRegexMatches: function(regexObject)
599 { 601 {
600 var ranges = []; 602 var ranges = [];
601 for (var i = 0; i < this._textEditor.linesCount; ++i) { 603 for (var i = 0; i < this._textEditor.linesCount; ++i) {
602 var line = this._textEditor.line(i); 604 var line = this._textEditor.line(i);
603 var offset = 0; 605 var offset = 0;
604 do { 606 do {
605 var match = regexObject.exec(line); 607 var match = regexObject.exec(line);
606 if (match) { 608 if (match) {
609 var matchEndIndex = match.index + Math.max(match[0].length, 1);
607 if (match[0].length) 610 if (match[0].length)
608 ranges.push(new WebInspector.TextRange(i, offset + match .index, i, offset + match.index + match[0].length)); 611 ranges.push(new WebInspector.TextRange(i, offset + match .index, i, offset + matchEndIndex));
609 offset += match.index + 1; 612 offset += matchEndIndex;
610 line = line.substring(match.index + 1); 613 line = line.substring(matchEndIndex);
611 } 614 }
612 } while (match && line); 615 } while (match && line);
613 } 616 }
614 return ranges; 617 return ranges;
615 }, 618 },
616 619
617 _addExistingMessagesToSource: function() 620 _addExistingMessagesToSource: function()
618 { 621 {
619 var length = this._messages.length; 622 var length = this._messages.length;
620 for (var i = 0; i < length; ++i) 623 for (var i = 0; i < length; ++i)
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after
1006 1009
1007 /** 1010 /**
1008 * @param {?WebInspector.TextRange} from 1011 * @param {?WebInspector.TextRange} from
1009 * @param {?WebInspector.TextRange} to 1012 * @param {?WebInspector.TextRange} to
1010 */ 1013 */
1011 onJumpToPosition: function(from, to) 1014 onJumpToPosition: function(from, to)
1012 { 1015 {
1013 this._sourceFrame.onJumpToPosition(from, to); 1016 this._sourceFrame.onJumpToPosition(from, to);
1014 } 1017 }
1015 } 1018 }
OLDNEW
« no previous file with comments | « Source/devtools/front_end/profiler/ProfilesPanel.js ('k') | Source/devtools/front_end/sources/SourcesView.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698