Home | History | Annotate | Download | only in promises
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 /**
      6  * @constructor
      7  * @extends {WebInspector.VBox}
      8  */
      9 WebInspector.PromisesPanel = function()
     10 {
     11     WebInspector.VBox.call(this);
     12     this.registerRequiredCSS("promisesPanel.css");
     13     this.element.classList.add("promises");
     14 
     15     var buttonsBar = this.element.createChild("div");
     16     var enableButton = buttonsBar.createChild("button");
     17     enableButton.textContent = WebInspector.UIString("Enable Promises tracking");
     18     enableButton.addEventListener("click", this._enableButtonClicked.bind(this));
     19     var disableButton = buttonsBar.createChild("button");
     20     disableButton.textContent = WebInspector.UIString("Disable Promises tracking");
     21     disableButton.addEventListener("click", this._disableButtonClicked.bind(this));
     22     var refreshButton = buttonsBar.createChild("button");
     23     refreshButton.textContent = WebInspector.UIString("Refresh");
     24     refreshButton.addEventListener("click", this._refreshButtonClicked.bind(this));
     25     var clearButton = buttonsBar.createChild("button");
     26     clearButton.textContent = WebInspector.UIString("Clear");
     27     clearButton.addEventListener("click", this._clearButtonClicked.bind(this));
     28 
     29     this._dataGridContainer = new WebInspector.VBox();
     30     this._dataGridContainer.show(this.element);
     31     var columns = [
     32         { id: "promiseId", title: WebInspector.UIString("Promise ID"), disclosure: true },
     33         { id: "status", title: WebInspector.UIString("Status") },
     34         { id: "location", title: WebInspector.UIString("Location") }
     35     ];
     36     this._dataGrid = new WebInspector.DataGrid(columns);
     37     this._dataGrid.show(this._dataGridContainer.element);
     38 
     39     this._linkifier = new WebInspector.Linkifier();
     40 }
     41 
     42 WebInspector.PromisesPanel.prototype = {
     43     _refreshButtonClicked: function(event)
     44     {
     45         this._updateData();
     46     },
     47 
     48     _clearButtonClicked: function(event)
     49     {
     50         this._clear();
     51     },
     52 
     53     _enableButtonClicked: function(event)
     54     {
     55         var mainTarget = WebInspector.targetManager.mainTarget();
     56         if (mainTarget) {
     57             mainTarget.debuggerAgent().enablePromiseTracker();
     58             this._target = mainTarget;
     59         }
     60     },
     61 
     62     _disableButtonClicked: function(event)
     63     {
     64         if (this._target) {
     65             this._target.debuggerAgent().disablePromiseTracker();
     66             delete this._target;
     67         }
     68     },
     69 
     70     /**
     71      * @param {!DebuggerAgent.PromiseDetails} p1
     72      * @param {!DebuggerAgent.PromiseDetails} p2
     73      * @return {number}
     74      */
     75     _comparePromises: function(p1, p2) {
     76         if (p1.parentId < p2.parentId)
     77             return -1
     78         if (p1.parentId > p2.parentId)
     79             return 1
     80         if (p1.id < p2.id)
     81             return -1;
     82         if (p1.id > p2.id)
     83             return 1;
     84         return 0;
     85     },
     86 
     87     _updateData: function()
     88     {
     89         /**
     90          * @param {?Protocol.Error} error
     91          * @param {?Array.<!DebuggerAgent.PromiseDetails>} promiseData
     92          * @this {WebInspector.PromisesPanel}
     93          */
     94         function callback(error, promiseData)
     95         {
     96             if (error || !promiseData)
     97                 return;
     98 
     99             promiseData.sort(this._comparePromises);
    100             var nodesToInsert = { __proto__: null };
    101             for (var i = 0; i < promiseData.length; i++) {
    102                 var promise = promiseData[i];
    103                 var data = {
    104                     promiseId: promise.id,
    105                     status: promise.status
    106                 };
    107                 if (promise.callFrame)
    108                     data.location = this._linkifier.linkifyConsoleCallFrame(this._target, promise.callFrame);
    109                 var node = new WebInspector.DataGridNode(data, false);
    110                 nodesToInsert[promise.id] = { node: node, parentId: promise.parentId };
    111             }
    112 
    113             var rootNode = this._dataGrid.rootNode();
    114 
    115             for (var id in nodesToInsert) {
    116                 var node = nodesToInsert[id].node;
    117                 var parentId = nodesToInsert[id].parentId;
    118                 var parentNode = (parentId && nodesToInsert[parentId]) ? nodesToInsert[parentId].node : rootNode;
    119                 parentNode.appendChild(node);
    120             }
    121         }
    122 
    123         this._clear();
    124         if (this._target)
    125             this._target.debuggerAgent().getPromises(callback.bind(this));
    126     },
    127 
    128     _clear: function()
    129     {
    130         this._dataGrid.rootNode().removeChildren();
    131         this._linkifier.reset();
    132     },
    133 
    134     __proto__: WebInspector.VBox.prototype
    135 }
    136 
    137