Changeset 117751 in webkit
- Timestamp:
- May 21, 2012 2:30:02 AM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r117750 r117751 1 2012-05-21 Pavel Feldman <pfeldman@chromium.org> 2 3 Web Inspector: move sources panel out of experimental. 4 https://bugs.webkit.org/show_bug.cgi?id=86997 5 6 Reviewed by Yury Semikhatsky. 7 8 This change moves sources panel out of experimental, removes revision support from the resources panel. 9 10 * English.lproj/localizedStrings.js: 11 * inspector/front-end/JavaScriptSourceFrame.js: 12 (WebInspector.JavaScriptSourceFrame.prototype._onContentChanged): 13 (WebInspector.JavaScriptSourceFrame.prototype._continueToLine): 14 * inspector/front-end/ResourceView.js: 15 * inspector/front-end/ResourcesPanel.js: 16 (WebInspector.ResourcesPanel.prototype._showResourceView): 17 (WebInspector.FrameTreeElement.prototype.appendResource): 18 (WebInspector.FrameResourceTreeElement): 19 (WebInspector.FrameResourceTreeElement.prototype.sourceView): 20 * inspector/front-end/ScriptsNavigator.js: 21 (WebInspector.ScriptsNavigator): 22 * inspector/front-end/ScriptsPanel.js: 23 (WebInspector.ScriptsPanel.prototype.get toolbarItemLabel): 24 (WebInspector.ScriptsPanel.prototype.appendApplicableItems): 25 * inspector/front-end/Settings.js: 26 (WebInspector.ExperimentsSettings): 27 * inspector/front-end/SourceFrame.js: 28 (WebInspector.SourceFrame.prototype._setTextViewerDecorations): 29 * inspector/front-end/textViewer.css: 30 * inspector/front-end/utilities.js: 31 1 32 2012-05-21 Pavel Feldman <pfeldman@chromium.org> 2 33 -
trunk/Source/WebCore/inspector/front-end/JavaScriptSourceFrame.js
r117750 r117751 116 116 breakpointLocations[i].breakpoint.remove(); 117 117 this.setContent(content, false, this._uiSourceCode.mimeType()); 118 this._updateBreakpointsAfterLiveEdit(oldContent, content, breakpointLocations);119 118 } 120 119 }, … … 551 550 var rawLocation = this._uiSourceCode.uiLocationToRawLocation(lineNumber, 0); 552 551 WebInspector.debuggerModel.continueToLocation(rawLocation); 553 },554 555 /**556 * @param {string} oldSource557 * @param {string} newSource558 * @param {Array.<Object>} breakpointLocations559 */560 _updateBreakpointsAfterLiveEdit: function(oldSource, newSource, breakpointLocations)561 {562 // Clear and re-create breakpoints according to text diff.563 var diff = Array.diff(oldSource.split("\n"), newSource.split("\n"));564 for (var i = 0; i < breakpointLocations.length; ++i) {565 var lineNumber = breakpointLocations[i].uiLocation.lineNumber;566 var newLineNumber = diff.left[lineNumber].row;567 if (newLineNumber === undefined) {568 for (var i = lineNumber - 1; i >= 0; --i) {569 if (diff.left[i].row === undefined)570 continue;571 var shiftedLineNumber = diff.left[i].row + lineNumber - i;572 if (shiftedLineNumber < diff.right.length) {573 var originalLineNumber = diff.right[shiftedLineNumber].row;574 if (originalLineNumber === lineNumber || originalLineNumber === undefined)575 newLineNumber = shiftedLineNumber;576 }577 break;578 }579 }580 if (newLineNumber !== undefined) {581 var breakpoint = breakpointLocations[i].breakpoint;582 this._setBreakpoint(newLineNumber, breakpoint.condition(), breakpoint.enabled());583 }584 }585 552 } 586 553 } -
trunk/Source/WebCore/inspector/front-end/ResourceView.js
r117598 r117751 101 101 102 102 WebInspector.ResourceSourceFrame.prototype.__proto__ = WebInspector.SourceFrame.prototype; 103 104 /**105 * @constructor106 * @extends {WebInspector.ResourceSourceFrame}107 */108 WebInspector.EditableResourceSourceFrame = function(resource)109 {110 WebInspector.ResourceSourceFrame.call(this, resource);111 }112 113 WebInspector.EditableResourceSourceFrame.Events = {114 TextEdited: "TextEdited"115 }116 117 WebInspector.EditableResourceSourceFrame.prototype = {118 /**119 * @return {boolean}120 */121 canEditSource: function()122 {123 //FIXME: make live edit stop using resource content binding.124 return this._resource.isEditable() && this._resource.type === WebInspector.resourceTypes.Stylesheet;125 },126 127 /**128 * @param {string} text129 */130 commitEditing: function(text)131 {132 this._clearIncrementalUpdateTimer();133 var majorChange = true;134 this._settingContent = true;135 function callbackWrapper(text)136 {137 delete this._settingContent;138 this.dispatchEventToListeners(WebInspector.EditableResourceSourceFrame.Events.TextEdited, this);139 }140 this.resource.setContent(text, majorChange, callbackWrapper.bind(this));141 },142 143 afterTextChanged: function(oldRange, newRange)144 {145 function commitIncrementalEdit()146 {147 var majorChange = false;148 this.resource.setContent(this._textModel.text, majorChange, function() {});149 this.dispatchEventToListeners(WebInspector.EditableResourceSourceFrame.Events.TextEdited, this);150 }151 const updateTimeout = 200;152 this._incrementalUpdateTimer = setTimeout(commitIncrementalEdit.bind(this), updateTimeout);153 },154 155 _clearIncrementalUpdateTimer: function()156 {157 if (this._incrementalUpdateTimer)158 clearTimeout(this._incrementalUpdateTimer);159 delete this._incrementalUpdateTimer;160 },161 162 _contentChanged: function(event)163 {164 if (!this._settingContent)165 WebInspector.ResourceSourceFrame.prototype._contentChanged.call(this, event);166 },167 168 isDirty: function()169 {170 return this._resource.content !== this.textModel.text;171 }172 }173 174 WebInspector.EditableResourceSourceFrame.prototype.__proto__ = WebInspector.ResourceSourceFrame.prototype; -
trunk/Source/WebCore/inspector/front-end/ResourcesPanel.js
r117598 r117751 373 373 if (view.searchCanceled) 374 374 view.searchCanceled(); 375 this._fetchAndApplyDiffMarkup(view, resource);376 375 this._innerShowView(view); 377 376 }, … … 386 385 } 387 386 return WebInspector.ResourceView.nonSourceViewForResource(resource); 388 },389 390 _showRevisionView: function(revision)391 {392 var view = this._sourceViewForRevision(revision);393 this._fetchAndApplyDiffMarkup(view, revision.resource, revision);394 this._innerShowView(view);395 },396 397 _sourceViewForRevision: function(revision)398 {399 var treeElement = this._findTreeElementForRevision(revision);400 return treeElement.sourceView();401 },402 403 /**404 * @param {WebInspector.ResourceRevision=} revision405 */406 _fetchAndApplyDiffMarkup: function(view, resource, revision)407 {408 var baseRevision = resource.history[0];409 if (!baseRevision)410 return;411 if (!(view instanceof WebInspector.SourceFrame))412 return;413 414 baseRevision.requestContent(step1.bind(this));415 416 function step1(baseContent)417 {418 (revision ? revision : resource).requestContent(step2.bind(this, baseContent));419 }420 421 function step2(baseContent, revisionContent)422 {423 this._applyDiffMarkup(view, baseContent, revisionContent);424 }425 },426 427 _applyDiffMarkup: function(view, baseContent, newContent)428 {429 var diffData = TextDiff.compute(baseContent, newContent);430 view.markDiff(diffData);431 387 }, 432 388 … … 834 790 }, 835 791 836 _findTreeElementForRevision: function(revision)837 {838 function isAncestor(ancestor, object)839 {840 return false;841 }842 843 function getParent(object)844 {845 return null;846 }847 848 return this.sidebarTree.findTreeElement(revision, isAncestor, getParent);849 },850 851 792 showView: function(view) 852 793 { … … 1126 1067 var resourceTreeElement = new WebInspector.FrameResourceTreeElement(this._storagePanel, resource); 1127 1068 this._insertInPresentationOrder(categoryElement, resourceTreeElement); 1128 resourceTreeElement._populateRevisions();1129 1130 1069 this._treeElementForResource[resource.url] = resourceTreeElement; 1131 1070 }, … … 1194 1133 this._resource.addEventListener(WebInspector.Resource.Events.MessageAdded, this._consoleMessageAdded, this); 1195 1134 this._resource.addEventListener(WebInspector.Resource.Events.MessagesCleared, this._consoleMessagesCleared, this); 1196 this._resource.addEventListener(WebInspector.Resource.Events.RevisionAdded, this._revisionAdded, this);1197 1135 this.tooltip = resource.url; 1198 1136 } … … 1375 1313 }, 1376 1314 1377 _populateRevisions: function()1378 {1379 for (var i = 0; i < this._resource.history.length; ++i)1380 this._appendRevision(this._resource.history[i]);1381 },1382 1383 _revisionAdded: function(event)1384 {1385 this._appendRevision(event.data);1386 },1387 1388 _appendRevision: function(revision)1389 {1390 this.subtitleText = "";1391 this.insertChild(new WebInspector.ResourceRevisionTreeElement(this._storagePanel, revision), 0);1392 if (this._sourceView === this._storagePanel.visibleView)1393 this._storagePanel._showResourceView(this._resource);1394 },1395 1396 1315 sourceView: function() 1397 1316 { 1398 1317 if (!this._sourceView) { 1399 this._sourceView = new WebInspector. EditableResourceSourceFrame(this._resource);1318 this._sourceView = new WebInspector.ResourceSourceFrame(this._resource); 1400 1319 if (this._resource.messages) { 1401 1320 for (var i = 0; i < this._resource.messages.length; i++) 1402 1321 this._sourceView.addMessage(this._resource.messages[i]); 1403 1322 } 1404 this._sourceView.addEventListener(WebInspector.EditableResourceSourceFrame.Events.TextEdited, this._sourceViewTextEdited, this);1405 1323 } 1406 1324 return this._sourceView; 1407 },1408 1409 _sourceViewTextEdited: function(event)1410 {1411 var sourceFrame = event.data;1412 this.subtitleText = sourceFrame.isDirty() ? "*" : "";1413 1325 } 1414 1326 } … … 2002 1914 /** 2003 1915 * @constructor 2004 * @extends {WebInspector.BaseStorageTreeElement}2005 */2006 WebInspector.ResourceRevisionTreeElement = function(storagePanel, revision)2007 {2008 var title = revision.timestamp ? revision.timestamp.toLocaleTimeString() : WebInspector.UIString("(original)");2009 WebInspector.BaseStorageTreeElement.call(this, storagePanel, revision, title, ["resource-sidebar-tree-item", "resources-type-" + revision.resource.type.name()]);2010 if (revision.timestamp)2011 this.tooltip = revision.timestamp.toLocaleString();2012 this._revision = revision;2013 }2014 2015 WebInspector.ResourceRevisionTreeElement.prototype = {2016 get itemURL()2017 {2018 return this._revision.resource.url;2019 },2020 2021 onattach: function()2022 {2023 WebInspector.BaseStorageTreeElement.prototype.onattach.call(this);2024 this.listItemElement.draggable = true;2025 this.listItemElement.addEventListener("dragstart", this._ondragstart.bind(this), false);2026 this.listItemElement.addEventListener("contextmenu", this._handleContextMenuEvent.bind(this), true);2027 },2028 2029 onselect: function()2030 {2031 WebInspector.BaseStorageTreeElement.prototype.onselect.call(this);2032 this._storagePanel._showRevisionView(this._revision);2033 },2034 2035 _ondragstart: function(event)2036 {2037 if (this._revision.content) {2038 event.dataTransfer.setData("text/plain", this._revision.content);2039 event.dataTransfer.effectAllowed = "copy";2040 return true;2041 }2042 },2043 2044 _handleContextMenuEvent: function(event)2045 {2046 var contextMenu = new WebInspector.ContextMenu();2047 contextMenu.appendItem(WebInspector.UIString("Revert to this revision"), this._revision.revertToThis.bind(this._revision));2048 2049 if (InspectorFrontendHost.canSave()) {2050 function doSave(forceSaveAs, content)2051 {2052 WebInspector.fileManager.save(this._revision.resource.url, content, forceSaveAs);2053 }2054 2055 function save(forceSaveAs)2056 {2057 this._revision.requestContent(doSave.bind(this, forceSaveAs));2058 }2059 2060 contextMenu.appendSeparator();2061 contextMenu.appendItem(WebInspector.UIString("Save"), save.bind(this, false));2062 contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Save as..." : "Save As..."), save.bind(this, true));2063 }2064 2065 contextMenu.show(event);2066 },2067 2068 sourceView: function()2069 {2070 if (!this._sourceView)2071 this._sourceView = new WebInspector.SourceFrame(this._revision);2072 return this._sourceView;2073 }2074 }2075 2076 WebInspector.ResourceRevisionTreeElement.prototype.__proto__ = WebInspector.BaseStorageTreeElement.prototype;2077 2078 /**2079 * @constructor2080 1916 * @extends {WebInspector.View} 2081 1917 */ -
trunk/Source/WebCore/inspector/front-end/ScriptsNavigator.js
r117452 r117751 50 50 this._snippetsView.addEventListener(WebInspector.SnippetsNavigatorView.Events.SnippetCreationRequested, this._snippetCreationRequested, this); 51 51 52 var sourcesTitle = WebInspector.experimentsSettings.sourceCodePanel.isEnabled() ? WebInspector.UIString("Sources") : WebInspector.UIString("Scripts"); 53 this._tabbedPane.appendTab(WebInspector.ScriptsNavigator.ScriptsTab, sourcesTitle, this._scriptsView); 52 this._tabbedPane.appendTab(WebInspector.ScriptsNavigator.ScriptsTab, WebInspector.UIString("Sources"), this._scriptsView); 54 53 this._tabbedPane.selectTab(WebInspector.ScriptsNavigator.ScriptsTab); 55 54 this._tabbedPane.appendTab(WebInspector.ScriptsNavigator.ContentScriptsTab, WebInspector.UIString("Content scripts"), this._contentScriptsView); -
trunk/Source/WebCore/inspector/front-end/ScriptsPanel.js
r117750 r117751 43 43 var scriptMapping = new WebInspector.DebuggerScriptMapping(); 44 44 var providers = scriptMapping.uiSourceCodeProviders(); 45 if (WebInspector.experimentsSettings.sourceCodePanel.isEnabled()) 46 providers = providers.concat(new WebInspector.StylesUISourceCodeProvider()); 45 providers = providers.concat(new WebInspector.StylesUISourceCodeProvider()); 47 46 this._uiSourceCodeProvider = uiSourceCodeProviderForTest || new WebInspector.CompositeUISourceCodeProvider(providers); 48 47 … … 56 55 WebInspector.GoToLineDialog.install(this, viewGetter.bind(this)); 57 56 58 var helpSection = WebInspector.shortcutsScreen.section(WebInspector.UIString( WebInspector.experimentsSettings.sourceCodePanel.isEnabled() ? "Source Code Panel" : "Scripts Panel"));57 var helpSection = WebInspector.shortcutsScreen.section(WebInspector.UIString("Sources Panel")); 59 58 this.debugToolbar = this._createDebugToolbar(helpSection); 60 59 … … 201 200 get toolbarItemLabel() 202 201 { 203 if (WebInspector.experimentsSettings.sourceCodePanel.isEnabled()) 204 return WebInspector.UIString("Source Code"); 205 return WebInspector.UIString("Scripts"); 202 return WebInspector.UIString("Sources"); 206 203 }, 207 204 … … 1066 1063 appendApplicableItems: function(contextMenu, target) 1067 1064 { 1068 if ( WebInspector.experimentsSettings.sourceCodePanel.isEnabled() &&target instanceof WebInspector.UISourceCode) {1065 if (target instanceof WebInspector.UISourceCode) { 1069 1066 contextMenu.appendSeparator(); 1070 1067 contextMenu.appendItem(WebInspector.UIString("Revision history..."), this._showLocalHistory.bind(this, /** @type {WebInspector.UISourceCode} */ target)); -
trunk/Source/WebCore/inspector/front-end/Settings.js
r117452 r117751 183 183 this.showShadowDOM = this._createExperiment("showShadowDOM", "Show shadow DOM"); 184 184 this.snippetsSupport = this._createExperiment("snippetsSupport", "Snippets support"); 185 this.sourceCodePanel = this._createExperiment("sourceCodePanel", "Source Code panel");186 185 187 186 this._cleanUpSetting(); -
trunk/Source/WebCore/inspector/front-end/SourceFrame.js
r117455 r117751 121 121 }, 122 122 123 /**124 * @param {TextDiff} diffData125 */126 markDiff: function(diffData)127 {128 if (this._diffLines && this.loaded)129 this._removeDiffDecorations();130 131 this._diffLines = diffData;132 if (this.loaded)133 this._updateDiffDecorations();134 },135 136 123 addMessage: function(msg) 137 124 { … … 252 239 253 240 this._addExistingMessagesToSource(); 254 this._updateDiffDecorations();255 241 256 242 this._textViewer.doResize(); … … 361 347 }, 362 348 363 _updateDiffDecorations: function()364 {365 if (!this._diffLines)366 return;367 368 function addDecorations(textViewer, lines, className)369 {370 for (var i = 0; i < lines.length; ++i)371 textViewer.addDecoration(lines[i], className);372 }373 addDecorations(this._textViewer, this._diffLines.added, "webkit-added-line");374 addDecorations(this._textViewer, this._diffLines.removed, "webkit-removed-line");375 addDecorations(this._textViewer, this._diffLines.changed, "webkit-changed-line");376 },377 378 _removeDiffDecorations: function()379 {380 function removeDecorations(textViewer, lines, className)381 {382 for (var i = 0; i < lines.length; ++i)383 textViewer.removeDecoration(lines[i], className);384 }385 removeDecorations(this._textViewer, this._diffLines.added, "webkit-added-line");386 removeDecorations(this._textViewer, this._diffLines.removed, "webkit-removed-line");387 removeDecorations(this._textViewer, this._diffLines.changed, "webkit-changed-line");388 },389 390 349 _addExistingMessagesToSource: function() 391 350 { -
trunk/Source/WebCore/inspector/front-end/textViewer.css
r117750 r117751 176 176 } 177 177 178 .webkit-added-line.webkit-line-number {179 background-color: rgb(170, 255, 170);180 color: #333;181 }182 183 .webkit-removed-line.webkit-line-number {184 background-color: rgb(255, 220, 220);185 text-decoration: line-through;186 }187 188 .webkit-changed-line.webkit-line-number {189 background-color: rgb(170, 170, 255);190 color: #333;191 }192 193 178 .webkit-highlighted-line.webkit-line-content { 194 179 -webkit-animation: "fadeout" 2s 0s; -
trunk/Source/WebCore/inspector/front-end/utilities.js
r116847 r117751 26 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 *29 * Contains diff method based on Javascript Diff Algorithm By John Resig30 * http://ejohn.org/files/jsdiff.js (released under the MIT license).31 28 */ 32 29 … … 374 371 } 375 372 376 Array.diff = function(left, right)377 {378 var o = left;379 var n = right;380 381 var ns = {};382 var os = {};383 384 for (var i = 0; i < n.length; i++) {385 if (ns[n[i]] == null)386 ns[n[i]] = { rows: [], o: null };387 ns[n[i]].rows.push(i);388 }389 390 for (var i = 0; i < o.length; i++) {391 if (os[o[i]] == null)392 os[o[i]] = { rows: [], n: null };393 os[o[i]].rows.push(i);394 }395 396 for (var i in ns) {397 if (ns[i].rows.length == 1 && typeof(os[i]) != "undefined" && os[i].rows.length == 1) {398 n[ns[i].rows[0]] = { text: n[ns[i].rows[0]], row: os[i].rows[0] };399 o[os[i].rows[0]] = { text: o[os[i].rows[0]], row: ns[i].rows[0] };400 }401 }402 403 for (var i = 0; i < n.length - 1; i++) {404 if (n[i].text != null && n[i + 1].text == null && n[i].row + 1 < o.length && o[n[i].row + 1].text == null && n[i + 1] == o[n[i].row + 1]) {405 n[i + 1] = { text: n[i + 1], row: n[i].row + 1 };406 o[n[i].row + 1] = { text: o[n[i].row + 1], row: i + 1 };407 }408 }409 410 for (var i = n.length - 1; i > 0; i--) {411 if (n[i].text != null && n[i - 1].text == null && n[i].row > 0 && o[n[i].row - 1].text == null &&412 n[i - 1] == o[n[i].row - 1]) {413 n[i - 1] = { text: n[i - 1], row: n[i].row - 1 };414 o[n[i].row - 1] = { text: o[n[i].row - 1], row: i - 1 };415 }416 }417 418 return { left: o, right: n };419 }420 421 373 Array.convert = function(list) 422 374 { … … 672 624 * @constructor 673 625 */ 674 function TextDiff()675 {676 this.added = [];677 this.removed = [];678 this.changed = [];679 }680 681 /**682 * @param {string} baseContent683 * @param {string} newContent684 * @return {TextDiff}685 */686 TextDiff.compute = function(baseContent, newContent)687 {688 var oldLines = baseContent.split(/\r?\n/);689 var newLines = newContent.split(/\r?\n/);690 691 var diff = Array.diff(oldLines, newLines);692 693 var diffData = new TextDiff();694 695 var offset = 0;696 var right = diff.right;697 for (var i = 0; i < right.length; ++i) {698 if (typeof right[i] === "string") {699 if (right.length > i + 1 && right[i + 1].row === i + 1 - offset)700 diffData.changed.push(i);701 else {702 diffData.added.push(i);703 offset++;704 }705 } else706 offset = i - right[i].row;707 }708 return diffData;709 }710 711 /**712 * @constructor713 */714 626 var Map = function() 715 627 {
Note: See TracChangeset
for help on using the changeset viewer.