1 /* 2 * Copyright (C) 2011 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 * @extends {WebInspector.Object} 34 */ 35 WebInspector.TimelineManager = function() 36 { 37 WebInspector.Object.call(this); 38 this._dispatcher = new WebInspector.TimelineDispatcher(this); 39 this._enablementCount = 0; 40 TimelineAgent.enable(); 41 } 42 43 WebInspector.TimelineManager.EventTypes = { 44 TimelineStarted: "TimelineStarted", 45 TimelineStopped: "TimelineStopped", 46 TimelineEventRecorded: "TimelineEventRecorded" 47 } 48 49 WebInspector.TimelineManager.prototype = { 50 /** 51 * @return {boolean} 52 */ 53 isStarted: function() 54 { 55 return this._dispatcher.isStarted(); 56 }, 57 58 /** 59 * @param {number=} maxCallStackDepth 60 * @param {boolean=} includeDomCounters 61 * @param {boolean=} includeGPUEvents 62 * @param {function(?Protocol.Error)=} callback 63 */ 64 start: function(maxCallStackDepth, includeDomCounters, includeGPUEvents, callback) 65 { 66 this._enablementCount++; 67 if (this._enablementCount === 1) 68 TimelineAgent.start(maxCallStackDepth, /* bufferEvents */false, includeDomCounters, includeGPUEvents, callback); 69 else if (callback) 70 callback(null); 71 }, 72 73 /** 74 * @param {function(?Protocol.Error)=} callback 75 */ 76 stop: function(callback) 77 { 78 this._enablementCount--; 79 if (this._enablementCount < 0) { 80 console.error("WebInspector.TimelineManager start/stop calls are unbalanced " + new Error().stack); 81 return; 82 } 83 if (!this._enablementCount) 84 TimelineAgent.stop(callback); 85 else if (callback) 86 callback(null); 87 }, 88 89 __proto__: WebInspector.Object.prototype 90 } 91 92 /** 93 * @constructor 94 * @implements {TimelineAgent.Dispatcher} 95 */ 96 WebInspector.TimelineDispatcher = function(manager) 97 { 98 this._manager = manager; 99 InspectorBackend.registerTimelineDispatcher(this); 100 } 101 102 WebInspector.TimelineDispatcher.prototype = { 103 /** 104 * @param {!TimelineAgent.TimelineEvent} record 105 */ 106 eventRecorded: function(record) 107 { 108 this._manager.dispatchEventToListeners(WebInspector.TimelineManager.EventTypes.TimelineEventRecorded, record); 109 }, 110 111 /** 112 * @return {boolean} 113 */ 114 isStarted: function() 115 { 116 return !!this._started; 117 }, 118 119 /** 120 * @param {boolean=} consoleTimeline 121 */ 122 started: function(consoleTimeline) 123 { 124 if (consoleTimeline) { 125 // Wake up timeline panel module. 126 WebInspector.panel("timeline"); 127 } 128 this._started = true; 129 this._manager.dispatchEventToListeners(WebInspector.TimelineManager.EventTypes.TimelineStarted, consoleTimeline); 130 }, 131 132 /** 133 * @param {boolean=} consoleTimeline 134 */ 135 stopped: function(consoleTimeline) 136 { 137 this._started = false; 138 this._manager.dispatchEventToListeners(WebInspector.TimelineManager.EventTypes.TimelineStopped, consoleTimeline); 139 } 140 } 141 142 /** 143 * @type {!WebInspector.TimelineManager} 144 */ 145 WebInspector.timelineManager; 146