Home | History | Annotate | Download | only in sdk
      1 /*
      2  * Copyright (C) 2013 Google Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are
      6  * met:
      7  *
      8  *     * Redistributions of source code must retain the above copyright
      9  * notice, this list of conditions and the following disclaimer.
     10  *     * Redistributions in binary form must reproduce the above
     11  * copyright notice, this list of conditions and the following disclaimer
     12  * in the documentation and/or other materials provided with the
     13  * distribution.
     14  *     * Neither the name of Google Inc. nor the names of its
     15  * contributors may be used to endorse or promote products derived from
     16  * this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 
     31 /**
     32  * @constructor
     33  * @param {!WebInspector.Target} target
     34  * @param {string} snapshotId
     35  */
     36 WebInspector.PaintProfilerSnapshot = function(target, snapshotId)
     37 {
     38     this._target = target;
     39     this._id = snapshotId;
     40 }
     41 
     42 /**
     43  * @param {!WebInspector.Target} target
     44  * @param {string} encodedPicture
     45  * @param {function(?WebInspector.PaintProfilerSnapshot)} callback
     46  */
     47 WebInspector.PaintProfilerSnapshot.load = function(target, encodedPicture, callback)
     48 {
     49     var wrappedCallback = InspectorBackend.wrapClientCallback(callback, "LayerTreeAgent.loadSnapshot(): ", WebInspector.PaintProfilerSnapshot.bind(null, target));
     50     target.layerTreeAgent().loadSnapshot(encodedPicture, wrappedCallback);
     51 }
     52 
     53 /**
     54  * @param {!Array.<!WebInspector.RawPaintProfilerLogItem>} log
     55  * @return {!Array.<!WebInspector.PaintProfilerLogItem>}
     56  */
     57 WebInspector.PaintProfilerSnapshot._processAnnotations = function(log)
     58 {
     59     var result = [];
     60     /** @type {!Array.<!Object.<string, string>>} */
     61     var commentGroupStack = [];
     62 
     63     for (var i = 0; i < log.length; ++i) {
     64         var method = log[i].method;
     65         switch (method) {
     66         case "beginCommentGroup":
     67             commentGroupStack.push({});
     68             break;
     69         case "addComment":
     70             var group = commentGroupStack.peekLast();
     71             if (!group) {
     72                 console.assert(false, "Stray comment without a group");
     73                 break;
     74             }
     75             var key = String(log[i].params["key"]);
     76             var value = String(log[i].params["value"]);
     77             if (!key || typeof value === "undefined") {
     78                 console.assert(false, "Missing key or value in addComment() params");
     79                 break;
     80             }
     81             if (key in group) {
     82                 console.assert(false, "Duplicate key in comment group");
     83                 break;
     84             }
     85             group[key] = value;
     86             break;
     87         case "endCommentGroup":
     88             if (!commentGroupStack.length)
     89                 console.assert(false, "Unbalanced commentGroupEnd call");
     90             else
     91                 commentGroupStack.pop();
     92             break;
     93         default:
     94             result.push(new WebInspector.PaintProfilerLogItem(log[i], i, commentGroupStack.peekLast()));
     95         }
     96     }
     97     return result;
     98 }
     99 
    100 WebInspector.PaintProfilerSnapshot.prototype = {
    101     dispose: function()
    102     {
    103         this._target.layerTreeAgent().releaseSnapshot(this._id);
    104     },
    105 
    106     /**
    107      * @return {!WebInspector.Target}
    108      */
    109     target: function()
    110     {
    111         return this._target;
    112     },
    113 
    114     /**
    115      * @param {?number} firstStep
    116      * @param {?number} lastStep
    117      * @param {?number} scale
    118      * @param {function(string=)} callback
    119      */
    120     requestImage: function(firstStep, lastStep, scale, callback)
    121     {
    122         var wrappedCallback = InspectorBackend.wrapClientCallback(callback, "LayerTreeAgent.replaySnapshot(): ");
    123         this._target.layerTreeAgent().replaySnapshot(this._id, firstStep || undefined, lastStep || undefined, scale || 1.0, wrappedCallback);
    124     },
    125 
    126     /**
    127      * @param {function(!Array.<!LayerTreeAgent.PaintProfile>=)} callback
    128      */
    129     profile: function(callback)
    130     {
    131         var wrappedCallback = InspectorBackend.wrapClientCallback(callback, "LayerTreeAgent.profileSnapshot(): ");
    132         this._target.layerTreeAgent().profileSnapshot(this._id, 5, 1, wrappedCallback);
    133     },
    134 
    135     /**
    136      * @param {function(!Array.<!WebInspector.PaintProfilerLogItem>=)} callback
    137      */
    138     commandLog: function(callback)
    139     {
    140         /**
    141          * @param {?string} error
    142          * @param {!Array.<!WebInspector.RawPaintProfilerLogItem>} log
    143          */
    144         function callbackWrapper(error, log)
    145         {
    146             if (error) {
    147                 console.error("LayerTreeAgent.snapshotCommandLog(): " + error);
    148                 callback();
    149                 return;
    150             }
    151             callback(WebInspector.PaintProfilerSnapshot._processAnnotations(log));
    152         }
    153 
    154         this._target.layerTreeAgent().snapshotCommandLog(this._id, callbackWrapper);
    155     }
    156 };
    157 
    158 /**
    159  * @typedef {!{method: string, params: Array.<Object.<string, *>>}}
    160  */
    161 WebInspector.RawPaintProfilerLogItem;
    162 
    163 /**
    164  * @constructor
    165  * @param {!WebInspector.RawPaintProfilerLogItem} rawEntry
    166  * @param {number} commandIndex
    167  * @param {!Object.<string, string>=} annotations
    168  */
    169 WebInspector.PaintProfilerLogItem = function(rawEntry, commandIndex, annotations)
    170 {
    171     this.method = rawEntry.method;
    172     this.params = rawEntry.params;
    173     this.annotations = annotations;
    174     this.commandIndex = commandIndex;
    175 }
    176 
    177 WebInspector.PaintProfilerLogItem.prototype = {
    178     /**
    179      * @return {number}
    180      */
    181     nodeId: function()
    182     {
    183         if (!this.annotations)
    184             return 0;
    185         var inspectorId = this.annotations["INSPECTOR_ID"];
    186         return Number(inspectorId);
    187     }
    188 }
    189