Changeset 117751 in webkit


Ignore:
Timestamp:
May 21, 2012 2:30:02 AM (12 years ago)
Author:
pfeldman@chromium.org
Message:

Web Inspector: move sources panel out of experimental.
https://bugs.webkit.org/show_bug.cgi?id=86997

Reviewed by Yury Semikhatsky.

This change moves sources panel out of experimental, removes revision support from the resources panel.

  • English.lproj/localizedStrings.js:
  • inspector/front-end/JavaScriptSourceFrame.js:

(WebInspector.JavaScriptSourceFrame.prototype._onContentChanged):
(WebInspector.JavaScriptSourceFrame.prototype._continueToLine):

  • inspector/front-end/ResourceView.js:
  • inspector/front-end/ResourcesPanel.js:

(WebInspector.ResourcesPanel.prototype._showResourceView):
(WebInspector.FrameTreeElement.prototype.appendResource):
(WebInspector.FrameResourceTreeElement):
(WebInspector.FrameResourceTreeElement.prototype.sourceView):

  • inspector/front-end/ScriptsNavigator.js:

(WebInspector.ScriptsNavigator):

  • inspector/front-end/ScriptsPanel.js:

(WebInspector.ScriptsPanel.prototype.get toolbarItemLabel):
(WebInspector.ScriptsPanel.prototype.appendApplicableItems):

  • inspector/front-end/Settings.js:

(WebInspector.ExperimentsSettings):

  • inspector/front-end/SourceFrame.js:

(WebInspector.SourceFrame.prototype._setTextViewerDecorations):

  • inspector/front-end/textViewer.css:
  • inspector/front-end/utilities.js:
Location:
trunk/Source/WebCore
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r117750 r117751  
     12012-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
    1322012-05-21  Pavel Feldman  <pfeldman@chromium.org>
    233
  • trunk/Source/WebCore/inspector/front-end/JavaScriptSourceFrame.js

    r117750 r117751  
    116116                breakpointLocations[i].breakpoint.remove();
    117117            this.setContent(content, false, this._uiSourceCode.mimeType());
    118             this._updateBreakpointsAfterLiveEdit(oldContent, content, breakpointLocations);
    119118        }
    120119    },
     
    551550        var rawLocation = this._uiSourceCode.uiLocationToRawLocation(lineNumber, 0);
    552551        WebInspector.debuggerModel.continueToLocation(rawLocation);
    553     },
    554 
    555     /**
    556      * @param {string} oldSource
    557      * @param {string} newSource
    558      * @param {Array.<Object>} breakpointLocations
    559      */
    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         }
    585552    }
    586553}
  • trunk/Source/WebCore/inspector/front-end/ResourceView.js

    r117598 r117751  
    101101
    102102WebInspector.ResourceSourceFrame.prototype.__proto__ = WebInspector.SourceFrame.prototype;
    103 
    104 /**
    105  * @constructor
    106  * @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} text
    129      */
    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  
    373373        if (view.searchCanceled)
    374374            view.searchCanceled();
    375         this._fetchAndApplyDiffMarkup(view, resource);
    376375        this._innerShowView(view);
    377376    },
     
    386385        }
    387386        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=} revision
    405      */
    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);
    431387    },
    432388
     
    834790    },
    835791
    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 
    851792    showView: function(view)
    852793    {
     
    11261067        var resourceTreeElement = new WebInspector.FrameResourceTreeElement(this._storagePanel, resource);
    11271068        this._insertInPresentationOrder(categoryElement, resourceTreeElement);
    1128         resourceTreeElement._populateRevisions();
    1129 
    11301069        this._treeElementForResource[resource.url] = resourceTreeElement;
    11311070    },
     
    11941133    this._resource.addEventListener(WebInspector.Resource.Events.MessageAdded, this._consoleMessageAdded, this);
    11951134    this._resource.addEventListener(WebInspector.Resource.Events.MessagesCleared, this._consoleMessagesCleared, this);
    1196     this._resource.addEventListener(WebInspector.Resource.Events.RevisionAdded, this._revisionAdded, this);
    11971135    this.tooltip = resource.url;
    11981136}
     
    13751313    },
    13761314
    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 
    13961315    sourceView: function()
    13971316    {
    13981317        if (!this._sourceView) {
    1399             this._sourceView = new WebInspector.EditableResourceSourceFrame(this._resource);
     1318            this._sourceView = new WebInspector.ResourceSourceFrame(this._resource);
    14001319            if (this._resource.messages) {
    14011320                for (var i = 0; i < this._resource.messages.length; i++)
    14021321                    this._sourceView.addMessage(this._resource.messages[i]);
    14031322            }
    1404             this._sourceView.addEventListener(WebInspector.EditableResourceSourceFrame.Events.TextEdited, this._sourceViewTextEdited, this);
    14051323        }
    14061324        return this._sourceView;
    1407     },
    1408 
    1409     _sourceViewTextEdited: function(event)
    1410     {
    1411         var sourceFrame = event.data;
    1412         this.subtitleText = sourceFrame.isDirty() ? "*" : "";
    14131325    }
    14141326}
     
    20021914/**
    20031915 * @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  * @constructor
    20801916 * @extends {WebInspector.View}
    20811917 */
  • trunk/Source/WebCore/inspector/front-end/ScriptsNavigator.js

    r117452 r117751  
    5050    this._snippetsView.addEventListener(WebInspector.SnippetsNavigatorView.Events.SnippetCreationRequested, this._snippetCreationRequested, this);
    5151
    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);
    5453    this._tabbedPane.selectTab(WebInspector.ScriptsNavigator.ScriptsTab);
    5554    this._tabbedPane.appendTab(WebInspector.ScriptsNavigator.ContentScriptsTab, WebInspector.UIString("Content scripts"), this._contentScriptsView);
  • trunk/Source/WebCore/inspector/front-end/ScriptsPanel.js

    r117750 r117751  
    4343    var scriptMapping = new WebInspector.DebuggerScriptMapping();
    4444    var providers = scriptMapping.uiSourceCodeProviders();
    45     if (WebInspector.experimentsSettings.sourceCodePanel.isEnabled())
    46         providers = providers.concat(new WebInspector.StylesUISourceCodeProvider());
     45    providers = providers.concat(new WebInspector.StylesUISourceCodeProvider());
    4746    this._uiSourceCodeProvider = uiSourceCodeProviderForTest || new WebInspector.CompositeUISourceCodeProvider(providers);
    4847
     
    5655    WebInspector.GoToLineDialog.install(this, viewGetter.bind(this));
    5756
    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"));
    5958    this.debugToolbar = this._createDebugToolbar(helpSection);
    6059
     
    201200    get toolbarItemLabel()
    202201    {
    203         if (WebInspector.experimentsSettings.sourceCodePanel.isEnabled())
    204             return WebInspector.UIString("Source Code");
    205         return WebInspector.UIString("Scripts");
     202        return WebInspector.UIString("Sources");
    206203    },
    207204
     
    10661063    appendApplicableItems: function(contextMenu, target)
    10671064    {
    1068         if (WebInspector.experimentsSettings.sourceCodePanel.isEnabled() && target instanceof WebInspector.UISourceCode) {
     1065        if (target instanceof WebInspector.UISourceCode) {
    10691066            contextMenu.appendSeparator();
    10701067            contextMenu.appendItem(WebInspector.UIString("Revision history..."), this._showLocalHistory.bind(this, /** @type {WebInspector.UISourceCode} */ target));
  • trunk/Source/WebCore/inspector/front-end/Settings.js

    r117452 r117751  
    183183    this.showShadowDOM = this._createExperiment("showShadowDOM", "Show shadow DOM");
    184184    this.snippetsSupport = this._createExperiment("snippetsSupport", "Snippets support");
    185     this.sourceCodePanel = this._createExperiment("sourceCodePanel", "Source Code panel");
    186185
    187186    this._cleanUpSetting();
  • trunk/Source/WebCore/inspector/front-end/SourceFrame.js

    r117455 r117751  
    121121    },
    122122
    123     /**
    124      * @param {TextDiff} diffData
    125      */
    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 
    136123    addMessage: function(msg)
    137124    {
     
    252239
    253240        this._addExistingMessagesToSource();
    254         this._updateDiffDecorations();
    255241
    256242        this._textViewer.doResize();
     
    361347    },
    362348
    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 
    390349    _addExistingMessagesToSource: function()
    391350    {
  • trunk/Source/WebCore/inspector/front-end/textViewer.css

    r117750 r117751  
    176176}
    177177
    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 
    193178.webkit-highlighted-line.webkit-line-content {
    194179    -webkit-animation: "fadeout" 2s 0s;
  • trunk/Source/WebCore/inspector/front-end/utilities.js

    r116847 r117751  
    2626 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
    2727 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    28  *
    29  * Contains diff method based on Javascript Diff Algorithm By John Resig
    30  * http://ejohn.org/files/jsdiff.js (released under the MIT license).
    3128 */
    3229
     
    374371}
    375372
    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 
    421373Array.convert = function(list)
    422374{
     
    672624 * @constructor
    673625 */
    674 function TextDiff()
    675 {
    676     this.added = [];
    677     this.removed = [];
    678     this.changed = [];
    679 }
    680 
    681 /**
    682  * @param {string} baseContent
    683  * @param {string} newContent
    684  * @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         } else
    706             offset = i - right[i].row;
    707     }
    708     return diffData;
    709 }
    710 
    711 /**
    712  * @constructor
    713  */
    714626var Map = function()
    715627{
Note: See TracChangeset for help on using the changeset viewer.