Changeset 83718 in webkit


Ignore:
Timestamp:
Apr 13, 2011 4:35:00 AM (13 years ago)
Author:
mnaganov@chromium.org
Message:

2011-04-13 Mikhail Naganov <mnaganov@chromium.org>

Reviewed by Pavel Feldman.

Web Inspector: [Chromium] Prepare to move detailed heap snapshots storage and processing into workers.
https://bugs.webkit.org/show_bug.cgi?id=58320

Introduce a proxy object that emulates worker behavior and change UI code to cope with it.

  • inspector/profiler/detailed-heapshots-test.js: (initialize_DetailedHeapshotTest):

2011-04-13 Mikhail Naganov <mnaganov@chromium.org>

Reviewed by Pavel Feldman.

Web Inspector: [Chromium] Prepare to move detailed heap snapshots storage and processing into workers.
https://bugs.webkit.org/show_bug.cgi?id=58320

Introduce a proxy object that emulates worker behavior and change UI code to cope with it.

  • WebCore.gypi:
  • WebCore.vcproj/WebCore.vcproj:
  • inspector/front-end/DetailedHeapshotGridNodes.js: (WebInspector.HeapSnapshotGridNode.prototype._populate.doPopulate.sorted): (WebInspector.HeapSnapshotGridNode.prototype._populate.doPopulate): (WebInspector.HeapSnapshotGridNode.prototype._populate): (WebInspector.HeapSnapshotGridNode.prototype.populateChildren.childrenRetrieved.notify): (WebInspector.HeapSnapshotGridNode.prototype.populateChildren.childrenRetrieved): (WebInspector.HeapSnapshotGridNode.prototype.populateChildren): (WebInspector.HeapSnapshotGridNode.prototype.sort.doSort.afterSort.afterPopulate): (WebInspector.HeapSnapshotGridNode.prototype.sort.doSort.afterSort): (WebInspector.HeapSnapshotGridNode.prototype.sort): (WebInspector.HeapSnapshotGenericObjectNode): (WebInspector.HeapSnapshotGenericObjectNode.prototype.get _shallowSizePercent): (WebInspector.HeapSnapshotGenericObjectNode.prototype._updateHasChildren): (WebInspector.HeapSnapshotObjectNode): (WebInspector.HeapSnapshotObjectNode.prototype._createChildNode): (WebInspector.HeapSnapshotObjectNode.prototype._createProvider): (WebInspector.HeapSnapshotInstanceNode): (WebInspector.HeapSnapshotInstanceNode.prototype._createChildNode): (WebInspector.HeapSnapshotInstanceNode.prototype._createProvider): (WebInspector.HeapSnapshotConstructorNode.prototype._createChildNode): (WebInspector.HeapSnapshotConstructorNode.prototype._createNodesProvider): (WebInspector.HeapSnapshotIteratorsTuple.prototype.sortAndRewind): (WebInspector.HeapSnapshotDiffNode.prototype._calculateDiff): (WebInspector.HeapSnapshotDiffNode.prototype._createChildNode): (WebInspector.HeapSnapshotDiffNode.prototype._createNodesProvider.createProvider): (WebInspector.HeapSnapshotDiffNode.prototype._createNodesProvider): (WebInspector.HeapSnapshotDiffNode.prototype._childHashForEntity): (WebInspector.HeapSnapshotDiffNode.prototype._childHashForNode): (WebInspector.HeapSnapshotDiffNode.prototype.populateChildren.firstProviderPopulated): (WebInspector.HeapSnapshotDiffNode.prototype.populateChildren.else.firstProviderPopulated): (WebInspector.HeapSnapshotDiffNode.prototype.populateChildren): (WebInspector.HeapSnapshotDominatorObjectNode): (WebInspector.HeapSnapshotDominatorObjectNode.prototype._createChildNode): (WebInspector.HeapSnapshotDominatorObjectNode.prototype._createProvider):
  • inspector/front-end/DetailedHeapshotView.js: (WebInspector.HeapSnapshotSortableDataGrid.prototype.sortingChanged): (WebInspector.HeapSnapshotSortableDataGrid.prototype._performSorting): (WebInspector.HeapSnapshotConstructorsDataGrid.prototype.setDataSource): (WebInspector.HeapSnapshotConstructorsDataGrid.prototype.populateChildren): (WebInspector.HeapSnapshotDiffDataGrid.prototype.setBaseDataSource.baseSnapshotNodeIdsReceived): (WebInspector.HeapSnapshotDiffDataGrid.prototype.setBaseDataSource.pushBaseSnapshotNodeIds): (WebInspector.HeapSnapshotDiffDataGrid.prototype.setBaseDataSource.snapshotNodeIdsReceived): (WebInspector.HeapSnapshotDiffDataGrid.prototype.setBaseDataSource): (WebInspector.HeapSnapshotDiffDataGrid.prototype.populateChildren.baseAggregatesReceived.aggregatesReceived): (WebInspector.HeapSnapshotDiffDataGrid.prototype.populateChildren): (WebInspector.HeapSnapshotRetainingPathsList): (WebInspector.HeapSnapshotRetainingPathsList.prototype._resetPaths): (WebInspector.HeapSnapshotRetainingPathsList.prototype.setDataSource): (WebInspector.HeapSnapshotRetainingPathsList.prototype.refresh): (WebInspector.HeapSnapshotRetainingPathsList.prototype.showNext.pathFound): (WebInspector.HeapSnapshotRetainingPathsList.prototype.showNext.startSearching): (WebInspector.HeapSnapshotRetainingPathsList.prototype.showNext): (WebInspector.DetailedHeapshotView.profileCallback): (WebInspector.DetailedHeapshotView): (WebInspector.DetailedHeapshotView.prototype.get profileWrapper): (WebInspector.DetailedHeapshotView.prototype.get baseProfileWrapper): (WebInspector.DetailedHeapshotView.prototype.show.profileCallback1): (WebInspector.DetailedHeapshotView.prototype.show.profileCallback2): (WebInspector.DetailedHeapshotView.prototype.show): (WebInspector.DetailedHeapshotView.prototype._changeBase.baseProfileLoaded):
  • inspector/front-end/HeapSnapshot.js:
  • inspector/front-end/HeapSnapshotProxy.js: Added.
  • inspector/front-end/PleaseWaitMessage.js:
  • inspector/front-end/ProfilesPanel.js: (WebInspector.ProfilesPanel.prototype._reset): (WebInspector.ProfilesPanel.prototype.loadHeapSnapshot): (WebInspector.ProfilesPanel.prototype._addHeapSnapshotChunk): (WebInspector.ProfilesPanel.prototype._finishHeapSnapshot.doParse): (WebInspector.ProfilesPanel.prototype._finishHeapSnapshot.else.parsed): (WebInspector.ProfilesPanel.prototype._finishHeapSnapshot):
  • inspector/front-end/WebKit.qrc:
  • inspector/front-end/inspector.html:
Location:
trunk
Files:
1 added
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r83717 r83718  
     12011-04-13  Mikhail Naganov  <mnaganov@chromium.org>
     2
     3        Reviewed by Pavel Feldman.
     4
     5        Web Inspector: [Chromium] Prepare to move detailed heap snapshots storage and processing into workers.
     6        https://bugs.webkit.org/show_bug.cgi?id=58320
     7
     8        Introduce a proxy object that emulates worker behavior and change UI code to cope with it.
     9
     10        * inspector/profiler/detailed-heapshots-test.js:
     11        (initialize_DetailedHeapshotTest):
     12
    1132011-04-13  Csaba Osztrogonác  <ossy@webkit.org>
    214
  • trunk/LayoutTests/inspector/profiler/detailed-heapshots-test.js

    r83581 r83718  
    170170    function sortingComplete()
    171171    {
    172         this._currentGrid().removeEventListener("sorting complete", sortingComplete, this);
    173172        InspectorTest.assertEquals(column.identifier, this._currentGrid().sortColumnIdentifier, "unexpected sorting");
    174173        column.sort = this._currentGrid().sortOrder;
     
    179178        setTimeout(callCallback, 0);
    180179    }
    181     this._currentGrid().addEventListener("sorting complete", sortingComplete, this);
     180    InspectorTest._prepareForRecursiveSort(sortingComplete.bind(this));
    182181    this._currentGrid()._clickInHeaderCell(event);
    183182};
     
    360359        return;
    361360    }
    362     function sortingComplete()
    363     {
    364         view.views[index].grid.removeEventListener("sorting complete", sortingComplete, this);
    365         setTimeout(callback, 0);
    366     }
    367     view.views[index].grid.addEventListener("sorting complete", sortingComplete, this);
     361    InspectorTest._prepareForRecursiveSort(callback, view.views[index].grid);
    368362    view._changeView({target: {selectedIndex: index}});
    369363};
     
    399393};
    400394
     395InspectorTest._prepareForRecursiveSort = function(callback, grid)
     396{
     397    if (InspectorTest._recursiveSortCallback)
     398        console.error("Didn't finished with previous sorting");
     399    InspectorTest._recursiveSortCallback = callback;
     400    InspectorTest._recursiveSortDepth = 0;
     401    grid = grid || InspectorTest._currentGrid();
     402    grid.addEventListener("start sorting", InspectorTest._recursiveSortEnter, InspectorTest);
     403    grid.addEventListener("sorting complete", InspectorTest._recursiveSortLeave, InspectorTest);
     404    InspectorTest._recursiveSortGrid = grid;
     405};
     406
     407InspectorTest._recursiveSortEnter = function()
     408{
     409    ++InspectorTest._recursiveSortDepth;
     410    if (isNaN(InspectorTest._recursiveSortDepth))
     411        console.error("Wasn't prepared to track sorting");
     412};
     413
     414InspectorTest._recursiveSortLeave = function()
     415{
     416    if (!--InspectorTest._recursiveSortDepth) {
     417        var callback = InspectorTest._recursiveSortCallback;
     418        delete InspectorTest._recursiveSortCallback;
     419        InspectorTest._recursiveSortGrid.removeEventListener("start sorting", InspectorTest._recursiveSortEnter, InspectorTest);
     420        InspectorTest._recursiveSortGrid.removeEventListener("sorting complete", InspectorTest._recursiveSortLeave, InspectorTest);
     421        setTimeout(callback, 0);
     422    }
     423    if (!(InspectorTest._recursiveSortDepth >= 0))
     424        console.error("Bad sort nesting");
     425};
     426
    401427InspectorTest._snapshotViewShown = function()
    402428{
  • trunk/Source/WebCore/ChangeLog

    r83716 r83718  
     12011-04-13  Mikhail Naganov  <mnaganov@chromium.org>
     2
     3        Reviewed by Pavel Feldman.
     4
     5        Web Inspector: [Chromium] Prepare to move detailed heap snapshots storage and processing into workers.
     6        https://bugs.webkit.org/show_bug.cgi?id=58320
     7
     8        Introduce a proxy object that emulates worker behavior and change UI code to cope with it.
     9
     10        * WebCore.gypi:
     11        * WebCore.vcproj/WebCore.vcproj:
     12        * inspector/front-end/DetailedHeapshotGridNodes.js:
     13        (WebInspector.HeapSnapshotGridNode.prototype._populate.doPopulate.sorted):
     14        (WebInspector.HeapSnapshotGridNode.prototype._populate.doPopulate):
     15        (WebInspector.HeapSnapshotGridNode.prototype._populate):
     16        (WebInspector.HeapSnapshotGridNode.prototype.populateChildren.childrenRetrieved.notify):
     17        (WebInspector.HeapSnapshotGridNode.prototype.populateChildren.childrenRetrieved):
     18        (WebInspector.HeapSnapshotGridNode.prototype.populateChildren):
     19        (WebInspector.HeapSnapshotGridNode.prototype.sort.doSort.afterSort.afterPopulate):
     20        (WebInspector.HeapSnapshotGridNode.prototype.sort.doSort.afterSort):
     21        (WebInspector.HeapSnapshotGridNode.prototype.sort):
     22        (WebInspector.HeapSnapshotGenericObjectNode):
     23        (WebInspector.HeapSnapshotGenericObjectNode.prototype.get _shallowSizePercent):
     24        (WebInspector.HeapSnapshotGenericObjectNode.prototype._updateHasChildren):
     25        (WebInspector.HeapSnapshotObjectNode):
     26        (WebInspector.HeapSnapshotObjectNode.prototype._createChildNode):
     27        (WebInspector.HeapSnapshotObjectNode.prototype._createProvider):
     28        (WebInspector.HeapSnapshotInstanceNode):
     29        (WebInspector.HeapSnapshotInstanceNode.prototype._createChildNode):
     30        (WebInspector.HeapSnapshotInstanceNode.prototype._createProvider):
     31        (WebInspector.HeapSnapshotConstructorNode.prototype._createChildNode):
     32        (WebInspector.HeapSnapshotConstructorNode.prototype._createNodesProvider):
     33        (WebInspector.HeapSnapshotIteratorsTuple.prototype.sortAndRewind):
     34        (WebInspector.HeapSnapshotDiffNode.prototype._calculateDiff):
     35        (WebInspector.HeapSnapshotDiffNode.prototype._createChildNode):
     36        (WebInspector.HeapSnapshotDiffNode.prototype._createNodesProvider.createProvider):
     37        (WebInspector.HeapSnapshotDiffNode.prototype._createNodesProvider):
     38        (WebInspector.HeapSnapshotDiffNode.prototype._childHashForEntity):
     39        (WebInspector.HeapSnapshotDiffNode.prototype._childHashForNode):
     40        (WebInspector.HeapSnapshotDiffNode.prototype.populateChildren.firstProviderPopulated):
     41        (WebInspector.HeapSnapshotDiffNode.prototype.populateChildren.else.firstProviderPopulated):
     42        (WebInspector.HeapSnapshotDiffNode.prototype.populateChildren):
     43        (WebInspector.HeapSnapshotDominatorObjectNode):
     44        (WebInspector.HeapSnapshotDominatorObjectNode.prototype._createChildNode):
     45        (WebInspector.HeapSnapshotDominatorObjectNode.prototype._createProvider):
     46        * inspector/front-end/DetailedHeapshotView.js:
     47        (WebInspector.HeapSnapshotSortableDataGrid.prototype.sortingChanged):
     48        (WebInspector.HeapSnapshotSortableDataGrid.prototype._performSorting):
     49        (WebInspector.HeapSnapshotConstructorsDataGrid.prototype.setDataSource):
     50        (WebInspector.HeapSnapshotConstructorsDataGrid.prototype.populateChildren):
     51        (WebInspector.HeapSnapshotDiffDataGrid.prototype.setBaseDataSource.baseSnapshotNodeIdsReceived):
     52        (WebInspector.HeapSnapshotDiffDataGrid.prototype.setBaseDataSource.pushBaseSnapshotNodeIds):
     53        (WebInspector.HeapSnapshotDiffDataGrid.prototype.setBaseDataSource.snapshotNodeIdsReceived):
     54        (WebInspector.HeapSnapshotDiffDataGrid.prototype.setBaseDataSource):
     55        (WebInspector.HeapSnapshotDiffDataGrid.prototype.populateChildren.baseAggregatesReceived.aggregatesReceived):
     56        (WebInspector.HeapSnapshotDiffDataGrid.prototype.populateChildren):
     57        (WebInspector.HeapSnapshotRetainingPathsList):
     58        (WebInspector.HeapSnapshotRetainingPathsList.prototype._resetPaths):
     59        (WebInspector.HeapSnapshotRetainingPathsList.prototype.setDataSource):
     60        (WebInspector.HeapSnapshotRetainingPathsList.prototype.refresh):
     61        (WebInspector.HeapSnapshotRetainingPathsList.prototype.showNext.pathFound):
     62        (WebInspector.HeapSnapshotRetainingPathsList.prototype.showNext.startSearching):
     63        (WebInspector.HeapSnapshotRetainingPathsList.prototype.showNext):
     64        (WebInspector.DetailedHeapshotView.profileCallback):
     65        (WebInspector.DetailedHeapshotView):
     66        (WebInspector.DetailedHeapshotView.prototype.get profileWrapper):
     67        (WebInspector.DetailedHeapshotView.prototype.get baseProfileWrapper):
     68        (WebInspector.DetailedHeapshotView.prototype.show.profileCallback1):
     69        (WebInspector.DetailedHeapshotView.prototype.show.profileCallback2):
     70        (WebInspector.DetailedHeapshotView.prototype.show):
     71        (WebInspector.DetailedHeapshotView.prototype._changeBase.baseProfileLoaded):
     72        * inspector/front-end/HeapSnapshot.js:
     73        * inspector/front-end/HeapSnapshotProxy.js: Added.
     74        * inspector/front-end/PleaseWaitMessage.js:
     75        * inspector/front-end/ProfilesPanel.js:
     76        (WebInspector.ProfilesPanel.prototype._reset):
     77        (WebInspector.ProfilesPanel.prototype.loadHeapSnapshot):
     78        (WebInspector.ProfilesPanel.prototype._addHeapSnapshotChunk):
     79        (WebInspector.ProfilesPanel.prototype._finishHeapSnapshot.doParse):
     80        (WebInspector.ProfilesPanel.prototype._finishHeapSnapshot.else.parsed):
     81        (WebInspector.ProfilesPanel.prototype._finishHeapSnapshot):
     82        * inspector/front-end/WebKit.qrc:
     83        * inspector/front-end/inspector.html:
     84
    1852011-04-13  Alexander Pavlov  <apavlov@chromium.org>
    286
  • trunk/Source/WebCore/WebCore.gypi

    r83641 r83718  
    61836183            'inspector/front-end/HAREntry.js',
    61846184            'inspector/front-end/HeapSnapshot.js',
     6185            'inspector/front-end/HeapSnapshotProxy.js',
    61856186            'inspector/front-end/HeapSnapshotView.js',
    61866187            'inspector/front-end/HelpScreen.js',
  • trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj

    r83636 r83718  
    6706667066                                </File>
    6706767067                                <File
     67068                                        RelativePath="..\inspector\front-end\HeapSnapshotProxy.js"
     67069                                        >
     67070                                </File>
     67071                                <File
    6706867072                                        RelativePath="..\inspector\front-end\HeapSnapshotView.js"
    6706967073                                        >
  • trunk/Source/WebCore/inspector/front-end/DetailedHeapshotGridNodes.js

    r83286 r83718  
    5353        {
    5454            this.removeEventListener("populate", this._populate, this);
    55             this._provider.sort(this.comparator());
    56             this._provider.first();
    57             this.populateChildren();
    58         }
    59     },
    60 
    61     populateChildren: function(provider, howMany, atIndex, suppressNotifyAboutCompletion)
     55            function sorted(ignored)
     56            {
     57                this.populateChildren();
     58            }
     59            this._provider.sortAndRewind(this.comparator(), sorted.bind(this));
     60        }
     61    },
     62
     63    populateChildren: function(provider, howMany, atIndex, afterPopulate, suppressNotifyAboutCompletion)
    6264    {
    6365        if (!howMany && provider) {
     
    7880            }
    7981        }
    80         for ( ; howMany > 0 && provider.hasNext(); provider.next(), ++provider.instanceCount, --howMany) {
    81             var item = provider.item;
    82             if (haveSavedChildren) {
    83                 var hash = this._childHashForEntity(item);
    84                 if (hash in this._savedChildren) {
    85                     this.insertChild(this._savedChildren[hash], atIndex++);
    86                     continue;
     82       
     83        function childrenRetrieved(items, hasNext, length)
     84        {
     85            for (var i = 0, l = items.length; i < l; ++i) {
     86                var item = items[i];
     87                if (haveSavedChildren) {
     88                    var hash = this._childHashForEntity(item);
     89                    if (hash in this._savedChildren) {
     90                        this.insertChild(this._savedChildren[hash], atIndex++);
     91                        continue;
     92                    }
    8793                }
     94                this.insertChild(this._createChildNode(item, provider), atIndex++);
    8895            }
    89             this.insertChild(this._createChildNode(provider), atIndex++);
    90         }
    91         if (provider.hasNext())
    92             this.insertChild(new WebInspector.ShowMoreDataGridNode(this.populateChildren.bind(this, provider), this._defaultPopulateCount, provider.length), atIndex++);
    93         if (!suppressNotifyAboutCompletion)
    94             this.dispatchEventToListeners("populate complete");
     96            provider.instanceCount += items.length;
     97
     98            if (hasNext)
     99                this.insertChild(new WebInspector.ShowMoreDataGridNode(this.populateChildren.bind(this, provider), this._defaultPopulateCount, length), atIndex++);
     100            if (afterPopulate)
     101                afterPopulate();
     102            if (!suppressNotifyAboutCompletion) {
     103                function notify()
     104                {
     105                    this.dispatchEventToListeners("populate complete");
     106                }
     107                setTimeout(notify.bind(this), 0);
     108            }
     109        }
     110        provider.getNextItems(howMany, childrenRetrieved.bind(this));
    95111    },
    96112
     
    107123    sort: function()
    108124    {
    109         var comparator = this.comparator();
    110         WebInspector.PleaseWaitMessage.prototype.startAction(this.dataGrid.element, doSort.bind(this));
    111 
    112125        function doSort()
    113126        {
    114             if (this._provider.sort(comparator)) {
     127            function afterSort(sorted)
     128            {
     129                if (!sorted)
     130                    return;
    115131                this._saveChildren();
    116132                this.removeChildren();
    117                 this._provider.first();
    118                 this.populateChildren(this._provider);
    119                 for (var i = 0, l = this.children.length; i < l; ++i) {
    120                     var child = this.children[i];
    121                     if (child.expanded)
    122                         child.sort();
     133     
     134                function afterPopulate()
     135                {
     136                    for (var i = 0, l = this.children.length; i < l; ++i) {
     137                        var child = this.children[i];
     138                        if (child.expanded)
     139                            child.sort();
     140                    }
     141                    this.dataGrid.dispatchEventToListeners("sorting complete");
    123142                }
     143                this.populateChildren(this._provider, null, null, afterPopulate.bind(this));
    124144            }
    125             if (this.dataGrid === this)
    126                 this.dispatchEventToListeners("sorting complete");
    127         }
     145            this._provider.sortAndRewind(this.comparator(), afterSort.bind(this));
     146        }
     147        this.dataGrid.dispatchEventToListeners("start sorting");
     148        WebInspector.PleaseWaitMessage.prototype.startAction(this.dataGrid.element, doSort.bind(this));
    128149    }
    129150};
     
    131152WebInspector.HeapSnapshotGridNode.prototype.__proto__ = WebInspector.DataGridNode.prototype;
    132153
    133 WebInspector.HeapSnapshotGenericObjectNode = function(tree, node, hasChildren)
    134 {
    135     WebInspector.HeapSnapshotGridNode.call(this, tree, hasChildren);
     154WebInspector.HeapSnapshotGenericObjectNode = function(tree, node)
     155{
     156    WebInspector.HeapSnapshotGridNode.call(this, tree, false);
    136157    this._name = node.name;
    137158    this._type = node.type;
     
    223244    {
    224245        return this._shallowSize / this.dataGrid.snapshot.totalSize * 100.0;
     246    },
     247
     248    _updateHasChildren: function()
     249    {
     250        function isEmptyCallback(isEmpty)
     251        {
     252            this.hasChildren = !isEmpty;
     253        }
     254        this._provider.isEmpty(isEmptyCallback.bind(this));
    225255    }
    226256}
     
    230260WebInspector.HeapSnapshotObjectNode = function(tree, edge)
    231261{
    232     var provider = this._createProvider(tree.snapshot, edge.nodeIndex);
    233     WebInspector.HeapSnapshotGenericObjectNode.call(this, tree, edge.node, !provider.isEmpty);
     262    WebInspector.HeapSnapshotGenericObjectNode.call(this, tree, edge.node);
    234263    this._referenceName = edge.name;
    235264    this._referenceType = edge.type;
    236     this._provider = provider;
     265    this._provider = this._createProvider(tree.snapshot, edge.nodeIndex);
     266    this._updateHasChildren();
    237267}
    238268
    239269WebInspector.HeapSnapshotObjectNode.prototype = {
    240     _createChildNode: function(provider)
    241     {
    242         return new WebInspector.HeapSnapshotObjectNode(this.dataGrid, provider.item);
     270    _createChildNode: function(item)
     271    {
     272        return new WebInspector.HeapSnapshotObjectNode(this.dataGrid, item);
    243273    },
    244274
     
    246276    {
    247277        var showHiddenData = WebInspector.DetailedHeapshotView.prototype.showHiddenData;
    248         return new WebInspector.HeapSnapshotEdgesProvider(
    249             snapshot,
     278        return snapshot.createEdgesProvider(
    250279            nodeIndex,
    251280            function(edge) {
     
    319348WebInspector.HeapSnapshotInstanceNode = function(tree, baseSnapshot, snapshot, node)
    320349{
    321     var provider = this._createProvider(baseSnapshot || snapshot, node.nodeIndex); 
    322     WebInspector.HeapSnapshotGenericObjectNode.call(this, tree, node, !provider.isEmpty);
     350    WebInspector.HeapSnapshotGenericObjectNode.call(this, tree, node);
    323351    this._isDeletedNode = !!baseSnapshot;
    324     this._provider = provider;   
     352    this._provider = this._createProvider(baseSnapshot || snapshot, node.nodeIndex);
     353    this._updateHasChildren();
    325354};
    326355
    327356WebInspector.HeapSnapshotInstanceNode.prototype = {
    328     _createChildNode: function(provider)
    329     {
    330         return new WebInspector.HeapSnapshotObjectNode(this.dataGrid, provider.item);
     357    _createChildNode: function(item)
     358    {
     359        return new WebInspector.HeapSnapshotObjectNode(this.dataGrid, item);
    331360    },
    332361
     
    334363    {
    335364        var showHiddenData = WebInspector.DetailedHeapshotView.prototype.showHiddenData;
    336         return new WebInspector.HeapSnapshotEdgesProvider(
    337             snapshot,
     365        return snapshot.createEdgesProvider(
    338366            nodeIndex,
    339367            function(edge) {
     
    403431
    404432WebInspector.HeapSnapshotConstructorNode.prototype = {
    405     _createChildNode: function(provider)
    406     {
    407         return new WebInspector.HeapSnapshotInstanceNode(this.dataGrid, null, this.dataGrid.snapshot, provider.item);
     433    _createChildNode: function(item)
     434    {
     435        return new WebInspector.HeapSnapshotInstanceNode(this.dataGrid, null, this.dataGrid.snapshot, item);
    408436    },
    409437
    410438    _createNodesProvider: function(snapshot, nodeType, nodeClassName)
    411439    {
    412         return new WebInspector.HeapSnapshotNodesProvider(
    413             snapshot,
     440        return snapshot.createNodesProvider(
    414441            function (node) {
    415442                 return node.type === nodeType
     
    476503
    477504WebInspector.HeapSnapshotIteratorsTuple.prototype = {
    478     first: function()
    479     {
    480         this._it1.first();
    481         this._it2.first();
    482     },
    483 
    484     sort: function(comparator)
    485     {
    486         this._it1.sort(comparator);
    487         this._it2.sort(comparator);
     505    sortAndRewind: function(comparator, callback)
     506    {
     507        function afterSort(ignored)
     508        {
     509            this._it2.sortAndRewind(comparator, callback);
     510        }
     511        this._it1.sortAndRewind(comparator, afterSort.bind(this));
    488512    }
    489513};
     
    510534        this._addedSize = 0;
    511535        this._removedSize = 0;
    512         var nodeA = new WebInspector.HeapSnapshotNode(baseSnapshot);
    513         var nodeB = new WebInspector.HeapSnapshotNode(snapshot);
     536        var nodeA = new WebInspector.HeapSnapshotNode(baseSnapshot._snapshot);
     537        var nodeB = new WebInspector.HeapSnapshotNode(snapshot._snapshot);
    514538        nodeA.nodeIndex = baseIndexes[i];
    515539        nodeB.nodeIndex = currentIndexes[j];
     
    536560            this._addedCount++;
    537561            this._addedSize += nodeB.selfSize;
    538             nodeB.nodeIndex = currentIndexes[++j];               
     562            nodeB.nodeIndex = currentIndexes[++j];
    539563        }
    540564        this._countDelta = this._addedCount - this._removedCount;
     
    542566    },
    543567
    544     _createChildNode: function(provider)
     568    _createChildNode: function(item, provider)
    545569    {
    546570        if (provider === this._provider._it1)
    547             return new WebInspector.HeapSnapshotInstanceNode(this.dataGrid, null, provider.snapshot, provider.item);
     571            return new WebInspector.HeapSnapshotInstanceNode(this.dataGrid, null, provider.snapshot, item);
    548572        else
    549             return new WebInspector.HeapSnapshotInstanceNode(this.dataGrid, provider.snapshot, null, provider.item);
     573            return new WebInspector.HeapSnapshotInstanceNode(this.dataGrid, provider.snapshot, null, item);
    550574    },
    551575
     
    557581        function createProvider(snapshot, otherSnapshot)
    558582        {
    559             return new WebInspector.HeapSnapshotNodesProvider(
    560                 snapshot,
     583            var otherSnapshotId = otherSnapshot.uid;
     584            var provider = snapshot.createNodesProvider(
    561585                function (node) {
    562586                     return node.type === nodeType
    563587                         && (nodeClassName === null || node.className === nodeClassName)
    564                          && !otherSnapshot.hasId(node.id);
     588                         && !this.snapshotHasNodeWithId(otherSnapshotId, node.id);
    565589                });
    566         }
     590            provider.snapshot = snapshot;
     591            return provider;
     592        }
     593    },
     594
     595    _childHashForEntity: function(node)
     596    {
     597        return node.id;
     598    },
     599
     600    _childHashForNode: function(childNode)
     601    {
     602        return childNode.snapshotNodeId;
    567603    },
    568604
     
    583619    },
    584620
    585     populateChildren: function(provider, howMany, atIndex)
     621    populateChildren: function(provider, howMany, atIndex, afterPopulate)
    586622    {
    587623        if (!provider && !howMany) {
    588             WebInspector.HeapSnapshotGridNode.prototype.populateChildren.call(this, this._provider._it1, this._defaultPopulateCount, null, true);
    589             WebInspector.HeapSnapshotGridNode.prototype.populateChildren.call(this, this._provider._it2, this._defaultPopulateCount);
     624            var firstProviderPopulated = function()
     625            {
     626                WebInspector.HeapSnapshotGridNode.prototype.populateChildren.call(this, this._provider._it2, this._defaultPopulateCount, atIndex, afterPopulate);
     627            };
     628            WebInspector.HeapSnapshotGridNode.prototype.populateChildren.call(this, this._provider._it1, this._defaultPopulateCount, atIndex, firstProviderPopulated.bind(this), true);
    590629        } else if (!howMany) {
    591             WebInspector.HeapSnapshotGridNode.prototype.populateChildren.call(this, this._provider._it1, null, null, true);
    592             WebInspector.HeapSnapshotGridNode.prototype.populateChildren.call(this, this._provider._it2);
     630            var firstProviderPopulated = function()
     631            {
     632                WebInspector.HeapSnapshotGridNode.prototype.populateChildren.call(this, this._provider._it2, null, atIndex, afterPopulate);
     633            };
     634            WebInspector.HeapSnapshotGridNode.prototype.populateChildren.call(this, this._provider._it1, null, atIndex, firstProviderPopulated.bind(this), true);
    593635        } else
    594             WebInspector.HeapSnapshotGridNode.prototype.populateChildren.call(this, provider, howMany, atIndex);
     636            WebInspector.HeapSnapshotGridNode.prototype.populateChildren.call(this, provider, howMany, atIndex, afterPopulate);
    595637    },
    596638
     
    629671WebInspector.HeapSnapshotDominatorObjectNode = function(tree, node)
    630672{
    631     var provider = this._createProvider(tree.snapshot, node.nodeIndex);
    632     WebInspector.HeapSnapshotGenericObjectNode.call(this, tree, node, !provider.isEmpty);
    633     this._provider = provider;
     673    WebInspector.HeapSnapshotGenericObjectNode.call(this, tree, node);
     674    this._provider = this._createProvider(tree.snapshot, node.nodeIndex);
     675    this._updateHasChildren();
    634676};
    635677
    636678WebInspector.HeapSnapshotDominatorObjectNode.prototype = {
    637     _createChildNode: function(provider)
    638     {
    639         return new WebInspector.HeapSnapshotDominatorObjectNode(this.dataGrid, provider.item);
     679    _createChildNode: function(item)
     680    {
     681        return new WebInspector.HeapSnapshotDominatorObjectNode(this.dataGrid, item);
    640682    },
    641683
     
    643685    {
    644686        var showHiddenData = WebInspector.DetailedHeapshotView.prototype.showHiddenData;
    645         return new WebInspector.HeapSnapshotNodesProvider(
    646             snapshot,
     687        return snapshot.createNodesProvider(
    647688            function (node) {
    648689                 var dominatorIndex = node.dominatorIndex;
  • trunk/Source/WebCore/inspector/front-end/DetailedHeapshotView.js

    r83581 r83718  
    6767        var sortAscending = this.sortOrder === "ascending";
    6868        var sortColumnIdentifier = this.sortColumnIdentifier;
     69        if (this._lastSortColumnIdentifier === sortColumnIdentifier && this._lastSortAscending === sortAscending)
     70            return;
     71        this._lastSortColumnIdentifier = sortColumnIdentifier;
     72        this._lastSortAscending = sortAscending;
    6973        var sortFields = this._sortFields(sortColumnIdentifier, sortAscending);
    7074
     
    8791
    8892        this._performSorting(SortByTwoFields);
    89         this.dispatchEventToListeners("sorting complete");
    9093    },
    9194
    9295    _performSorting: function(sortFunction)
    9396    {
     97        this.dispatchEventToListeners("start sorting");
    9498        var children = this.children;
    9599        this.removeChildren();
     
    101105                child.sort();
    102106        }
     107        this.dispatchEventToListeners("sorting complete");
    103108    }
    104109};
     
    135140        this.snapshot = snapshot;
    136141        this.populateChildren();
    137         this.sortingChanged();
    138142    },
    139143
    140144    populateChildren: function()
    141145    {
    142         var aggregates = this.snapshot.aggregates();
    143         for (var constructor in aggregates)
    144             this.appendChild(new WebInspector.HeapSnapshotConstructorNode(this, constructor, aggregates[constructor]));
     146        function aggregatesReceived(aggregates)
     147        {
     148            for (var constructor in aggregates)
     149                this.appendChild(new WebInspector.HeapSnapshotConstructorNode(this, constructor, aggregates[constructor]));
     150            this.sortingChanged();
     151        }
     152        this.snapshot.aggregates(false, aggregatesReceived.bind(this));
    145153    }
    146154};
     
    189197        this.baseSnapshot = baseSnapshot;
    190198        this.removeChildren();
    191         if (this.baseSnapshot !== this.snapshot) {
     199        if (this.baseSnapshot === this.snapshot)
     200            return;
     201
     202        function baseSnapshotNodeIdsReceived(nodeIds)
     203        {
     204            this.snapshot.pushSnapshotNodeIds(this.baseSnapshot.uid, nodeIds);
    192205            this.populateChildren();
    193             this.sortingChanged();
    194         }
     206        }
     207        function pushBaseSnapshotNodeIds()
     208        {
     209            if (!this.snapshot.hasSnapshotNodeIds(this.baseSnapshot.uid))
     210                this.baseSnapshot.nodeIds(baseSnapshotNodeIdsReceived.bind(this));
     211            else
     212                this.populateChildren();       
     213        }
     214        function snapshotNodeIdsReceived(nodeIds)
     215        {
     216            this.baseSnapshot.pushSnapshotNodeIds(this.snapshot.uid, nodeIds);
     217            pushBaseSnapshotNodeIds.call(this);
     218        }
     219        if (!this.baseSnapshot.hasSnapshotNodeIds(this.snapshot.uid))
     220            this.snapshot.nodeIds(snapshotNodeIdsReceived.bind(this));
     221        else
     222            pushBaseSnapshotNodeIds.call(this);
    195223    },
    196224
    197225    populateChildren: function()
    198226    {
    199         var baseClasses = this.baseSnapshot.aggregates(true);
    200         var classes = this.snapshot.aggregates(true);
    201         for (var clss in baseClasses) {
    202             var node = new WebInspector.HeapSnapshotDiffNode(this, clss, baseClasses[clss], classes[clss]);
    203             if (!node.zeroDiff)
    204                 this.appendChild(node);
    205         }
    206         for (clss in classes) {
    207             if (!(clss in baseClasses)) {
    208                 var node = new WebInspector.HeapSnapshotDiffNode(this, clss, null, classes[clss]);
    209                 if (!node.zeroDiff)
    210                     this.appendChild(node);
     227        function baseAggregatesReceived(baseClasses)
     228        {
     229            function aggregatesReceived(classes)
     230            {
     231                for (var clss in baseClasses) {
     232                    var node = new WebInspector.HeapSnapshotDiffNode(this, clss, baseClasses[clss], classes[clss]);
     233                    if (!node.zeroDiff)
     234                        this.appendChild(node);
     235                }
     236                for (clss in classes) {
     237                    if (!(clss in baseClasses)) {
     238                        var node = new WebInspector.HeapSnapshotDiffNode(this, clss, null, classes[clss]);
     239                        if (!node.zeroDiff)
     240                            this.appendChild(node);
     241                    }
     242                }
     243                this.sortingChanged();
    211244            }
    212         }
     245            this.snapshot.aggregates(true, aggregatesReceived.bind(this));
     246        }
     247        this.baseSnapshot.aggregates(true, baseAggregatesReceived.bind(this));
    213248    }
    214249};
     
    250285    };
    251286    WebInspector.HeapSnapshotSortableDataGrid.call(this, columns);
     287    this._defaultPopulateCount = 100;
    252288}
    253289
     
    261297    },
    262298
     299    _resetPaths: function()
     300    {
     301        this._setRootChildrenForFinder();
     302        this.removeChildren();
     303        this._counter = 0;
     304        this.showNext(this._defaultPopulateCount);
     305    },
     306
    263307    setDataSource: function(snapshotView, snapshot, nodeIndex, prefix)
    264308    {
     
    268312        if (this.pathFinder)
    269313            this.searchCancelled();
    270 
    271         this.pathFinder = new WebInspector.HeapSnapshotPathFinder(snapshot, nodeIndex);
    272         this._setRootChildrenForFinder();
    273 
    274         this.removeChildren();
    275 
    276         this._counter = 0;
    277         this.showNext(100);
     314        this.pathFinder = snapshot.createPathFinder(nodeIndex);
     315        this._resetPaths();
    278316    },
    279317
    280318    refresh: function()
    281319    {
    282         this.removeChildren();
    283         this._counter = 0;
    284320        delete this._cancel;
    285         this._setRootChildrenForFinder();
    286         this.showNext(100);
     321        this._resetPaths();
    287322    },
    288323
     
    290325    {
    291326        WebInspector.PleaseWaitMessage.prototype.show(this.element, this.searchCancelled.bind(this, pathsCount));
    292         window.setTimeout(startSearching.bind(this), 500);
     327
     328        function pathFound(result)
     329        {
     330            if (result === null) {
     331                WebInspector.PleaseWaitMessage.prototype.hide();
     332                if (!this.children.length)
     333                    this.appendChild(new WebInspector.DataGridNode({path:WebInspector.UIString("Can't find any paths."), len:""}, false));
     334                return;
     335            } else if (result !== false) {
     336                if (this._prefix)
     337                    result.path = this._prefix + result.path;
     338                this.appendChild(new WebInspector.DataGridNode(result, false));
     339                ++this._counter;
     340            }
     341            setTimeout(startSearching.bind(this), 0);
     342        }
    293343
    294344        function startSearching()
    295345        {
    296             if (this._cancel !== this.pathFinder) {
    297                 if (this._counter < pathsCount) {
    298                     var result = this.pathFinder.findNext();
    299                     if (result === null) {
    300                         WebInspector.PleaseWaitMessage.prototype.hide();
    301                         if (!this.children.length)
    302                             this.appendChild(new WebInspector.DataGridNode({path:WebInspector.UIString("Can't find any paths."), len:""}, false));
    303                         return;
    304                     } else if (result !== false) {
    305                         if (this._prefix)
    306                             result.path = this._prefix + result.path;
    307                         this.appendChild(new WebInspector.DataGridNode(result, false));
    308                         ++this._counter;
    309                     }
    310                     window.setTimeout(startSearching.bind(this), 0);
    311                     return;
    312                 } else
    313                     this.searchCancelled.call(this, pathsCount);
     346            if (this._cancel === this.pathFinder)
     347                return;
     348            delete this._cancel;
     349            if (this._counter < pathsCount)
     350                this.pathFinder.findNext(pathFound.bind(this));
     351            else {
     352                this.searchCancelled.call(this, pathsCount);
     353                delete this._cancel;
    314354            }
    315             this._cancel = false;
    316         }
     355        }
     356        setTimeout(startSearching.bind(this), 0);
    317357    },
    318358
     
    454494    this._loadProfile(this._profileUid, profileCallback.bind(this));
    455495
    456     function profileCallback(profile)
     496    function profileCallback()
    457497    {
    458498        var list = this._profiles();
    459499        var profileIndex;
    460500        for (var i = 0; i < list.length; ++i)
    461             if (list[i].uid === profile.uid) {
     501            if (list[i].uid === this._profileUid) {
    462502                profileIndex = i;
    463503                break;
     
    494534    {
    495535        if (!this._profileWrapper)
    496             this._profileWrapper = new WebInspector.HeapSnapshot(this.profile);
     536            this._profileWrapper = this.profile.proxy;
    497537        return this._profileWrapper;
    498538    },
     
    505545    get baseProfileWrapper()
    506546    {
    507         if (!this._baseProfileWrapper) {
    508             if (this.baseProfile !== this.profile)
    509                 this._baseProfileWrapper = new WebInspector.HeapSnapshot(this.baseProfile);
    510             else
    511                 this._baseProfileWrapper = this.profileWrapper;
    512         }
     547        if (!this._baseProfileWrapper)
     548            this._baseProfileWrapper = this.baseProfile.proxy;
    513549        return this._baseProfileWrapper;
    514550    },
     
    517553    {
    518554        WebInspector.View.prototype.show.call(this, parentElement);
    519         if (!this.profile._loaded)
     555        if (!this.profileWrapper.loaded)
    520556            this._loadProfile(this._profileUid, profileCallback1.bind(this));
    521557        else
    522             profileCallback1.call(this, this.profile);
    523 
    524         function profileCallback1(profile) {
    525             this.profileWrapper.restore(profile);
    526             if (this.baseProfile && !this.baseProfile._loaded)
     558            profileCallback1.call(this);
     559
     560        function profileCallback1() {
     561            if (this.baseProfile && !this.baseProfileWrapper.loaded)
    527562                this._loadProfile(this._baseProfileUid, profileCallback2.bind(this));
    528563            else
    529                 profileCallback2.call(this, this.baseProfile);
    530         }
    531 
    532         function profileCallback2(profile) {
    533             if (profile)
    534                 this.baseProfileWrapper.restore(profile);
     564                profileCallback2.call(this);
     565        }
     566
     567        function profileCallback2() {
    535568            this.currentView.show();
    536569            this.dataGrid.updateWidths();
     
    701734        this._loadProfile(this._baseProfileUid, baseProfileLoaded.bind(this));
    702735
    703         function baseProfileLoaded(profile)
     736        function baseProfileLoaded()
    704737        {
    705738            delete this._baseProfileWrapper;
  • trunk/Source/WebCore/inspector/front-end/HeapSnapshot.js

    r82230 r83718  
    551551            ++this._nodeCount;
    552552        return this._nodeCount;
    553     },
    554 
    555     restore: function(profile)
    556     {
    557         this._nodes = profile.nodes;
    558         this._strings = profile.strings;
    559553    },
    560554
  • trunk/Source/WebCore/inspector/front-end/PleaseWaitMessage.js

    r78700 r83718  
    8787        var message = instance.element;
    8888        if (message.parentNode === element) {
    89             actionCallback();
     89            setTimeout(actionCallback, 0);
    9090            return;
    9191        }
  • trunk/Source/WebCore/inspector/front-end/ProfilesPanel.js

    r83031 r83718  
    212212                view.dispose();
    213213            delete this._profiles[i]._profileView;
    214             var profile = this._profiles[i];
    215             if (profile.nodes) {
    216                 delete profile.nodes;
    217                 delete profile.strings;
    218             }
    219214        }
    220215        delete this.visibleView;
     
    451446            return;
    452447
    453         if (profile._loaded)
    454             callback(profile);
    455         else if (profile._is_loading)
    456             profile._callbacks.push(callback);
    457         else {
    458             profile._is_loading = true;
    459             profile._callbacks = [callback];
    460             profile._json = "";
    461             profile.sideBarElement.subtitle = WebInspector.UIString("Loading…");
    462             ProfilerAgent.getProfile(profile.typeId, profile.uid);
     448        if (!Preferences.detailedHeapProfiles) {
     449            if (profile._loaded)
     450                callback(profile);
     451            else if (profile._is_loading)
     452                profile._callbacks.push(callback);
     453            else {
     454                profile._is_loading = true;
     455                profile._callbacks = [callback];
     456                profile._json = "";
     457                profile.sideBarElement.subtitle = WebInspector.UIString("Loading\u2026");
     458                ProfilerAgent.getProfile(profile.typeId, profile.uid);
     459            }
     460        } else {
     461            if (!profile.proxy)
     462                profile.proxy = new WebInspector.HeapSnapshotProxy();
     463            var proxy = profile.proxy;
     464            if (proxy.startLoading(callback)) {
     465                profile.sideBarElement.subtitle = WebInspector.UIString("Loading\u2026");
     466                ProfilerAgent.getProfile(profile.typeId, profile.uid);
     467            }
    463468        }
    464469    },
     
    467472    {
    468473        var profile = this._profilesIdMap[this._makeKey(uid, WebInspector.HeapSnapshotProfileType.TypeId)];
    469         if (!profile || profile._loaded || !profile._is_loading)
    470             return;
    471 
    472         profile._json += chunk;
     474        if (!profile)
     475            return;
     476        if (!Preferences.detailedHeapProfiles) {
     477            if (profile._loaded || !profile._is_loading)
     478                return;
     479            profile._json += chunk;
     480        } else {
     481            if (!profile.proxy)
     482                return;
     483            profile.proxy.pushJSONChunk(chunk);
     484        }
    473485    },
    474486
     
    476488    {
    477489        var profile = this._profilesIdMap[this._makeKey(uid, WebInspector.HeapSnapshotProfileType.TypeId)];
    478         if (!profile || profile._loaded || !profile._is_loading)
    479             return;
    480 
    481         profile.sideBarElement.subtitle = WebInspector.UIString("Parsing…");
    482         window.setTimeout(doParse, 0);
    483 
    484         function doParse()
    485         {
    486             var loadedSnapshot = JSON.parse(profile._json);
    487             delete profile._json;
    488             delete profile._is_loading;
    489             var callbacks = profile._callbacks;
    490             delete profile._callbacks;
    491             profile._loaded = true;
    492             profile.sideBarElement.subtitle = "";
    493 
    494             if (!Preferences.detailedHeapProfiles && WebInspector.DetailedHeapshotView.prototype.isDetailedSnapshot(loadedSnapshot)) {
    495                 WebInspector.panels.profiles._enableDetailedHeapProfiles(false);
     490        if (!profile)
     491            return;
     492        if (!Preferences.detailedHeapProfiles) {
     493            if (profile._loaded || !profile._is_loading)
    496494                return;
     495            profile.sideBarElement.subtitle = WebInspector.UIString("Parsing\u2026");
     496            function doParse()
     497            {
     498                var loadedSnapshot = JSON.parse(profile._json);
     499                var callbacks = profile._callbacks;
     500                delete profile._callbacks;
     501                delete profile._json;
     502                delete profile._is_loading;
     503                profile._loaded = true;
     504                profile.sideBarElement.subtitle = "";
     505
     506                if (WebInspector.DetailedHeapshotView.prototype.isDetailedSnapshot(loadedSnapshot)) {
     507                    WebInspector.panels.profiles._enableDetailedHeapProfiles(false);
     508                    return;
     509                }
     510
     511                WebInspector.HeapSnapshotView.prototype.processLoadedSnapshot(profile, loadedSnapshot);
     512                for (var i = 0; i < callbacks.length; ++i)
     513                    callbacks[i](profile);
    497514            }
    498 
    499             if (!Preferences.detailedHeapProfiles)
    500                 WebInspector.HeapSnapshotView.prototype.processLoadedSnapshot(profile, loadedSnapshot);
    501             else
    502                 WebInspector.DetailedHeapshotView.prototype.processLoadedSnapshot(profile, loadedSnapshot);
    503             for (var i = 0; i < callbacks.length; ++i)
    504                 callbacks[i](profile);
     515            setTimeout(doParse, 0);
     516        } else {
     517            if (!profile.proxy)
     518                return;
     519            var proxy = profile.proxy;
     520            function parsed()
     521            {
     522                profile.sideBarElement.subtitle = Number.bytesToString(proxy.totalSize);
     523            }
     524            if (proxy.finishLoading(parsed))
     525                profile.sideBarElement.subtitle = WebInspector.UIString("Parsing\u2026");
    505526        }
    506527    },
  • trunk/Source/WebCore/inspector/front-end/WebKit.qrc

    r83176 r83718  
    5151    <file>HAREntry.js</file>
    5252    <file>HeapSnapshot.js</file>
     53    <file>HeapSnapshotProxy.js</file>
    5354    <file>HeapSnapshotView.js</file>
    5455    <file>HelpScreen.js</file>
  • trunk/Source/WebCore/inspector/front-end/inspector.html

    r83288 r83718  
    141141    <script type="text/javascript" src="ProfileView.js"></script>
    142142    <script type="text/javascript" src="HeapSnapshot.js"></script>
     143    <script type="text/javascript" src="HeapSnapshotProxy.js"></script>
    143144    <script type="text/javascript" src="HeapSnapshotView.js"></script>
    144145    <script type="text/javascript" src="DetailedHeapshotGridNodes.js"></script>
Note: See TracChangeset for help on using the changeset viewer.