Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(374)

Side by Side Diff: Source/devtools/front_end/sdk/LayerTreeModel.js

Issue 402633002: DevTools: Remove redundant dependency on target from TimelineFrameModel (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Address caseq comments Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 */ 42 */
43 WebInspector.TracingLayerPayload; 43 WebInspector.TracingLayerPayload;
44 44
45 /** 45 /**
46 * @constructor 46 * @constructor
47 * @extends {WebInspector.SDKObject} 47 * @extends {WebInspector.SDKObject}
48 */ 48 */
49 WebInspector.LayerTreeModel = function(target) 49 WebInspector.LayerTreeModel = function(target)
50 { 50 {
51 WebInspector.SDKObject.call(this, target); 51 WebInspector.SDKObject.call(this, target);
52 InspectorBackend.registerLayerTreeDispatcher(new WebInspector.LayerTreeDispa tcher(this)); 52 target.registerLayerTreeDispatcher(new WebInspector.LayerTreeDispatcher(this ));
53 target.domModel.addEventListener(WebInspector.DOMModel.Events.DocumentUpdate d, this._onDocumentUpdated, this); 53 target.domModel.addEventListener(WebInspector.DOMModel.Events.DocumentUpdate d, this._onDocumentUpdated, this);
54 /** @type {?WebInspector.LayerTreeBase} */ 54 /** @type {?WebInspector.LayerTreeBase} */
55 this._layerTree = null; 55 this._layerTree = null;
56 } 56 }
57 57
58 WebInspector.LayerTreeModel.Events = { 58 WebInspector.LayerTreeModel.Events = {
59 LayerTreeChanged: "LayerTreeChanged", 59 LayerTreeChanged: "LayerTreeChanged",
60 LayerPainted: "LayerPainted", 60 LayerPainted: "LayerPainted",
61 } 61 }
62 62
63 WebInspector.LayerTreeModel.ScrollRectType = { 63 WebInspector.LayerTreeModel.ScrollRectType = {
64 NonFastScrollable: {name: "NonFastScrollable", description: "Non fast scroll able"}, 64 NonFastScrollable: {name: "NonFastScrollable", description: "Non fast scroll able"},
65 TouchEventHandler: {name: "TouchEventHandler", description: "Touch event han dler"}, 65 TouchEventHandler: {name: "TouchEventHandler", description: "Touch event han dler"},
66 WheelEventHandler: {name: "WheelEventHandler", description: "Wheel event han dler"}, 66 WheelEventHandler: {name: "WheelEventHandler", description: "Wheel event han dler"},
67 RepaintsOnScroll: {name: "RepaintsOnScroll", description: "Repaints on scrol l"} 67 RepaintsOnScroll: {name: "RepaintsOnScroll", description: "Repaints on scrol l"}
68 } 68 }
69 69
70 WebInspector.LayerTreeModel.prototype = { 70 WebInspector.LayerTreeModel.prototype = {
71 disable: function() 71 disable: function()
72 { 72 {
73 if (!this._enabled) 73 if (!this._enabled)
74 return; 74 return;
75 this._enabled = false; 75 this._enabled = false;
76 this._layerTree = null; 76 this._layerTree = null;
77 LayerTreeAgent.disable(); 77 this.target().layerTreeAgent().disable();
78 }, 78 },
79 79
80 enable: function() 80 enable: function()
81 { 81 {
82 if (this._enabled) 82 if (this._enabled)
83 return; 83 return;
84 this._enabled = true; 84 this._enabled = true;
85 this._layerTree = new WebInspector.AgentLayerTree(this.target().weakRefe rence()); 85 this._layerTree = new WebInspector.AgentLayerTree(this.target());
86 this._lastPaintRectByLayerId = {}; 86 this._lastPaintRectByLayerId = {};
87 LayerTreeAgent.enable(); 87 this.target().layerTreeAgent().enable();
88 }, 88 },
89 89
90 /** 90 /**
91 * @param {!WebInspector.LayerTreeBase} layerTree 91 * @param {!WebInspector.LayerTreeBase} layerTree
92 */ 92 */
93 setLayerTree: function(layerTree) 93 setLayerTree: function(layerTree)
94 { 94 {
95 this.disable(); 95 this.disable();
96 this._layerTree = layerTree; 96 this._layerTree = layerTree;
97 this.dispatchEventToListeners(WebInspector.LayerTreeModel.Events.LayerTr eeChanged); 97 this.dispatchEventToListeners(WebInspector.LayerTreeModel.Events.LayerTr eeChanged);
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 return; 156 return;
157 this.disable(); 157 this.disable();
158 this.enable(); 158 this.enable();
159 }, 159 },
160 160
161 __proto__: WebInspector.SDKObject.prototype 161 __proto__: WebInspector.SDKObject.prototype
162 } 162 }
163 163
164 /** 164 /**
165 * @constructor 165 * @constructor
166 * @param {!WeakReference.<!WebInspector.Target>} weakTarget 166 * @param {?WebInspector.Target} target
167 */ 167 */
168 WebInspector.LayerTreeBase = function(weakTarget) 168 WebInspector.LayerTreeBase = function(target)
169 { 169 {
170 this._weakTarget = weakTarget; 170 this._target = target;
171 this._layersById = {}; 171 this._layersById = {};
172 this._backendNodeIdToNodeId = {}; 172 this._backendNodeIdToNodeId = {};
173 this._reset(); 173 this._reset();
174 } 174 }
175 175
176 WebInspector.LayerTreeBase.prototype = { 176 WebInspector.LayerTreeBase.prototype = {
177 _reset: function() 177 _reset: function()
178 { 178 {
179 this._root = null; 179 this._root = null;
180 this._contentRoot = null; 180 this._contentRoot = null;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 { 219 {
220 return this._layersById[id] || null; 220 return this._layersById[id] || null;
221 }, 221 },
222 222
223 /** 223 /**
224 * @param {!Array.<number>} requestedNodeIds 224 * @param {!Array.<number>} requestedNodeIds
225 * @param {function()} callback 225 * @param {function()} callback
226 */ 226 */
227 _resolveBackendNodeIds: function(requestedNodeIds, callback) 227 _resolveBackendNodeIds: function(requestedNodeIds, callback)
228 { 228 {
229 var target = this._weakTarget.get(); 229 if (!requestedNodeIds.length || !this._target) {
230 if (!requestedNodeIds.length || !target) {
231 callback(); 230 callback();
232 return; 231 return;
233 } 232 }
234 233
235 target.domModel.pushNodesByBackendIdsToFrontend(requestedNodeIds, popula teBackendNodeIdMap.bind(this)); 234 this._target.domModel.pushNodesByBackendIdsToFrontend(requestedNodeIds, populateBackendNodeIdMap.bind(this));
236 235
237 /** 236 /**
238 * @this {WebInspector.LayerTreeBase} 237 * @this {WebInspector.LayerTreeBase}
239 * @param {?Array.<number>} nodeIds 238 * @param {?Array.<number>} nodeIds
240 */ 239 */
241 function populateBackendNodeIdMap(nodeIds) 240 function populateBackendNodeIdMap(nodeIds)
242 { 241 {
243 if (nodeIds) { 242 if (nodeIds) {
244 for (var i = 0; i < requestedNodeIds.length; ++i) { 243 for (var i = 0; i < requestedNodeIds.length; ++i) {
245 var nodeId = nodeIds[i]; 244 var nodeId = nodeIds[i];
(...skipping 20 matching lines...) Expand all
266 { 265 {
267 return this._viewportSize; 266 return this._viewportSize;
268 }, 267 },
269 268
270 /** 269 /**
271 * @param {number} id 270 * @param {number} id
272 * @return {?WebInspector.DOMNode} 271 * @return {?WebInspector.DOMNode}
273 */ 272 */
274 _nodeForId: function(id) 273 _nodeForId: function(id)
275 { 274 {
276 var target = this._weakTarget.get(); 275 return this._target ? this._target.domModel.nodeForId(id) : null;
277 return target ? target.domModel.nodeForId(id) : null;
278 } 276 }
279 }; 277 };
280 278
281 /** 279 /**
282 * @constructor 280 * @constructor
283 * @extends {WebInspector.LayerTreeBase} 281 * @extends {WebInspector.LayerTreeBase}
284 * @param {!WeakReference.<!WebInspector.Target>} weakTarget 282 * @param {?WebInspector.Target} target
285 */ 283 */
286 WebInspector.TracingLayerTree = function(weakTarget) 284 WebInspector.TracingLayerTree = function(target)
287 { 285 {
288 WebInspector.LayerTreeBase.call(this, weakTarget); 286 WebInspector.LayerTreeBase.call(this, target);
289 } 287 }
290 288
291 WebInspector.TracingLayerTree.prototype = { 289 WebInspector.TracingLayerTree.prototype = {
292 /** 290 /**
293 * @param {!WebInspector.TracingLayerPayload} root 291 * @param {!WebInspector.TracingLayerPayload} root
294 * @param {!function()} callback 292 * @param {!function()} callback
295 */ 293 */
296 setLayers: function(root, callback) 294 setLayers: function(root, callback)
297 { 295 {
298 var idsToResolve = []; 296 var idsToResolve = [];
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 } 348 }
351 for (var i = 0; payload.children && i < payload.children.length; ++i) 349 for (var i = 0; payload.children && i < payload.children.length; ++i)
352 this._extractNodeIdsToResolve(nodeIdsToResolve, seenNodeIds, payload .children[i]); 350 this._extractNodeIdsToResolve(nodeIdsToResolve, seenNodeIds, payload .children[i]);
353 }, 351 },
354 352
355 __proto__: WebInspector.LayerTreeBase.prototype 353 __proto__: WebInspector.LayerTreeBase.prototype
356 } 354 }
357 355
358 /** 356 /**
359 * @constructor 357 * @constructor
360 * @param {!WeakReference.<!WebInspector.Target>} weakTarget 358 * @param {?WebInspector.Target} target
361 * @extends {WebInspector.LayerTreeBase} 359 * @extends {WebInspector.LayerTreeBase}
362 */ 360 */
363 WebInspector.AgentLayerTree = function(weakTarget) 361 WebInspector.AgentLayerTree = function(target)
364 { 362 {
365 WebInspector.LayerTreeBase.call(this, weakTarget); 363 WebInspector.LayerTreeBase.call(this, target);
366 } 364 }
367 365
368 WebInspector.AgentLayerTree.prototype = { 366 WebInspector.AgentLayerTree.prototype = {
369 /** 367 /**
370 * @param {?Array.<!LayerTreeAgent.Layer>} payload 368 * @param {?Array.<!LayerTreeAgent.Layer>} payload
371 * @param {function()} callback 369 * @param {function()} callback
372 */ 370 */
373 setLayers: function(payload, callback) 371 setLayers: function(payload, callback)
374 { 372 {
375 if (!payload) { 373 if (!payload) {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 if (!layers) 408 if (!layers)
411 return; 409 return;
412 var oldLayersById = this._layersById; 410 var oldLayersById = this._layersById;
413 this._layersById = {}; 411 this._layersById = {};
414 for (var i = 0; i < layers.length; ++i) { 412 for (var i = 0; i < layers.length; ++i) {
415 var layerId = layers[i].layerId; 413 var layerId = layers[i].layerId;
416 var layer = oldLayersById[layerId]; 414 var layer = oldLayersById[layerId];
417 if (layer) 415 if (layer)
418 layer._reset(layers[i]); 416 layer._reset(layers[i]);
419 else 417 else
420 layer = new WebInspector.AgentLayer(this._weakTarget, layers[i]) ; 418 layer = new WebInspector.AgentLayer(this._target, layers[i]);
421 this._layersById[layerId] = layer; 419 this._layersById[layerId] = layer;
422 if (layers[i].backendNodeId) { 420 if (layers[i].backendNodeId) {
423 layer._setNode(this._nodeForId(this._backendNodeIdToNodeId[layer s[i].backendNodeId])); 421 layer._setNode(this._nodeForId(this._backendNodeIdToNodeId[layer s[i].backendNodeId]));
424 if (!this._contentRoot) 422 if (!this._contentRoot)
425 this._contentRoot = layer; 423 this._contentRoot = layer;
426 } 424 }
427 var parentId = layer.parentId(); 425 var parentId = layer.parentId();
428 if (parentId) { 426 if (parentId) {
429 var parent = this._layersById[parentId]; 427 var parent = this._layersById[parentId];
430 if (!parent) 428 if (!parent)
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
553 551
554 /** 552 /**
555 * @param {function(!WebInspector.PaintProfilerSnapshot=)} callback 553 * @param {function(!WebInspector.PaintProfilerSnapshot=)} callback
556 */ 554 */
557 requestSnapshot: function(callback) { }, 555 requestSnapshot: function(callback) { },
558 } 556 }
559 557
560 /** 558 /**
561 * @constructor 559 * @constructor
562 * @implements {WebInspector.Layer} 560 * @implements {WebInspector.Layer}
563 * @param {!WeakReference.<!WebInspector.Target>} weakTarget 561 * @param {?WebInspector.Target} target
564 * @param {!LayerTreeAgent.Layer} layerPayload 562 * @param {!LayerTreeAgent.Layer} layerPayload
565 */ 563 */
566 WebInspector.AgentLayer = function(weakTarget, layerPayload) 564 WebInspector.AgentLayer = function(target, layerPayload)
567 { 565 {
568 this._weakTarget = weakTarget; 566 this._target = target;
569 this._reset(layerPayload); 567 this._reset(layerPayload);
570 } 568 }
571 569
572 WebInspector.AgentLayer.prototype = { 570 WebInspector.AgentLayer.prototype = {
573 /** 571 /**
574 * @return {string} 572 * @return {string}
575 */ 573 */
576 id: function() 574 id: function()
577 { 575 {
578 return this._layerPayload.layerId; 576 return this._layerPayload.layerId;
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 scrollRects: function() 737 scrollRects: function()
740 { 738 {
741 return this._scrollRects; 739 return this._scrollRects;
742 }, 740 },
743 741
744 /** 742 /**
745 * @param {function(!Array.<string>)} callback 743 * @param {function(!Array.<string>)} callback
746 */ 744 */
747 requestCompositingReasons: function(callback) 745 requestCompositingReasons: function(callback)
748 { 746 {
747 if (!this._target) {
748 callback([]);
749 return;
750 }
751
749 var wrappedCallback = InspectorBackend.wrapClientCallback(callback, "Lay erTreeAgent.reasonsForCompositingLayer(): ", undefined, []); 752 var wrappedCallback = InspectorBackend.wrapClientCallback(callback, "Lay erTreeAgent.reasonsForCompositingLayer(): ", undefined, []);
750 LayerTreeAgent.compositingReasons(this.id(), wrappedCallback); 753 this._target.layerTreeAgent().compositingReasons(this.id(), wrappedCallb ack);
751 }, 754 },
752 755
753 /** 756 /**
754 * @param {function(!WebInspector.PaintProfilerSnapshot=)} callback 757 * @param {function(!WebInspector.PaintProfilerSnapshot=)} callback
755 */ 758 */
756 requestSnapshot: function(callback) 759 requestSnapshot: function(callback)
757 { 760 {
758 var wrappedCallback = InspectorBackend.wrapClientCallback(callback, "Lay erTreeAgent.makeSnapshot(): ", WebInspector.PaintProfilerSnapshot.bind(null, thi s._weakTarget)); 761 if (!this._target) {
759 LayerTreeAgent.makeSnapshot(this.id(), wrappedCallback); 762 callback();
763 return;
764 }
765
766 var wrappedCallback = InspectorBackend.wrapClientCallback(callback, "Lay erTreeAgent.makeSnapshot(): ", WebInspector.PaintProfilerSnapshot.bind(null, thi s._target));
767 this._target.layerTreeAgent().makeSnapshot(this.id(), wrappedCallback);
760 }, 768 },
761 769
762 /** 770 /**
763 * @param {!DOMAgent.Rect} rect 771 * @param {!DOMAgent.Rect} rect
764 */ 772 */
765 _didPaint: function(rect) 773 _didPaint: function(rect)
766 { 774 {
767 this._lastPaintRect = rect; 775 this._lastPaintRect = rect;
768 this._paintCount = this.paintCount() + 1; 776 this._paintCount = this.paintCount() + 1;
769 this._image = null; 777 this._image = null;
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after
1086 */ 1094 */
1087 requestSnapshot: function(callback) 1095 requestSnapshot: function(callback)
1088 { 1096 {
1089 var wrappedCallback = InspectorBackend.wrapClientCallback(callback, "Lay erTreeAgent.makeSnapshot(): ", WebInspector.PaintProfilerSnapshot); 1097 var wrappedCallback = InspectorBackend.wrapClientCallback(callback, "Lay erTreeAgent.makeSnapshot(): ", WebInspector.PaintProfilerSnapshot);
1090 LayerTreeAgent.makeSnapshot(this.id(), wrappedCallback); 1098 LayerTreeAgent.makeSnapshot(this.id(), wrappedCallback);
1091 } 1099 }
1092 } 1100 }
1093 1101
1094 /** 1102 /**
1095 * @constructor 1103 * @constructor
1096 * @param {!WeakReference.<!WebInspector.Target>} weakTarget 1104 * @param {?WebInspector.Target} target
1097 */ 1105 */
1098 WebInspector.DeferredLayerTree = function(weakTarget) 1106 WebInspector.DeferredLayerTree = function(target)
1099 { 1107 {
1100 this._weakTarget = weakTarget; 1108 this._target = target;
1101 } 1109 }
1102 1110
1103 WebInspector.DeferredLayerTree.prototype = { 1111 WebInspector.DeferredLayerTree.prototype = {
1104 /** 1112 /**
1105 * @param {function(!WebInspector.LayerTreeBase)} callback 1113 * @param {function(!WebInspector.LayerTreeBase)} callback
1106 */ 1114 */
1107 resolve: function(callback) { }, 1115 resolve: function(callback) { },
1108 1116
1109 /** 1117 /**
1110 * @return {!WeakReference.<!WebInspector.Target>} 1118 * @return {?WebInspector.Target}
1111 */ 1119 */
1112 weakTarget: function() 1120 target: function()
1113 { 1121 {
1114 return this._weakTarget; 1122 return this._target;
1115 } 1123 }
1116 }; 1124 };
1117 1125
1118 /** 1126 /**
1119 * @constructor 1127 * @constructor
1120 * @extends {WebInspector.DeferredLayerTree} 1128 * @extends {WebInspector.DeferredLayerTree}
1121 * @param {!WeakReference.<!WebInspector.Target>} weakTarget 1129 * @param {?WebInspector.Target} target
1122 * @param {!Array.<!LayerTreeAgent.Layer>} layers 1130 * @param {!Array.<!LayerTreeAgent.Layer>} layers
1123 */ 1131 */
1124 WebInspector.DeferredAgentLayerTree = function(weakTarget, layers) 1132 WebInspector.DeferredAgentLayerTree = function(target, layers)
1125 { 1133 {
1126 WebInspector.DeferredLayerTree.call(this, weakTarget); 1134 WebInspector.DeferredLayerTree.call(this, target);
1127 this._layers = layers; 1135 this._layers = layers;
1128 } 1136 }
1129 1137
1130 WebInspector.DeferredAgentLayerTree.prototype = { 1138 WebInspector.DeferredAgentLayerTree.prototype = {
1131 /** 1139 /**
1132 * @param {function(!WebInspector.LayerTreeBase)} callback 1140 * @param {function(!WebInspector.LayerTreeBase)} callback
1133 */ 1141 */
1134 resolve: function(callback) 1142 resolve: function(callback)
1135 { 1143 {
1136 var result = new WebInspector.AgentLayerTree(this._weakTarget); 1144 var result = new WebInspector.AgentLayerTree(this._target);
1137 result.setLayers(this._layers, callback.bind(null, result)); 1145 result.setLayers(this._layers, callback.bind(null, result));
1138 }, 1146 },
1139 1147
1140 __proto__: WebInspector.DeferredLayerTree.prototype 1148 __proto__: WebInspector.DeferredLayerTree.prototype
1141 }; 1149 };
1142 1150
1143 /** 1151 /**
1144 * @constructor 1152 * @constructor
1145 * @extends {WebInspector.DeferredLayerTree} 1153 * @extends {WebInspector.DeferredLayerTree}
1146 * @param {!WeakReference.<!WebInspector.Target>} weakTarget 1154 * @param {?WebInspector.Target} target
1147 * @param {!WebInspector.TracingLayerPayload} root 1155 * @param {!WebInspector.TracingLayerPayload} root
1148 * @param {!Object} viewportSize 1156 * @param {!Object} viewportSize
1149 */ 1157 */
1150 WebInspector.DeferredTracingLayerTree = function(weakTarget, root, viewportSize) 1158 WebInspector.DeferredTracingLayerTree = function(target, root, viewportSize)
1151 { 1159 {
1152 WebInspector.DeferredLayerTree.call(this, weakTarget); 1160 WebInspector.DeferredLayerTree.call(this, target);
1153 this._root = root; 1161 this._root = root;
1154 this._viewportSize = viewportSize; 1162 this._viewportSize = viewportSize;
1155 } 1163 }
1156 1164
1157 WebInspector.DeferredTracingLayerTree.prototype = { 1165 WebInspector.DeferredTracingLayerTree.prototype = {
1158 /** 1166 /**
1159 * @param {function(!WebInspector.LayerTreeBase)} callback 1167 * @param {function(!WebInspector.LayerTreeBase)} callback
1160 */ 1168 */
1161 resolve: function(callback) 1169 resolve: function(callback)
1162 { 1170 {
1163 var result = new WebInspector.TracingLayerTree(this._weakTarget); 1171 var result = new WebInspector.TracingLayerTree(this._target);
1164 result.setViewportSize(this._viewportSize); 1172 result.setViewportSize(this._viewportSize);
1165 result.setLayers(this._root, callback.bind(null, result)); 1173 result.setLayers(this._root, callback.bind(null, result));
1166 }, 1174 },
1167 1175
1168 __proto__: WebInspector.DeferredLayerTree.prototype 1176 __proto__: WebInspector.DeferredLayerTree.prototype
1169 }; 1177 };
1170 1178
1171 /** 1179 /**
1172 * @constructor 1180 * @constructor
1173 * @implements {LayerTreeAgent.Dispatcher} 1181 * @implements {LayerTreeAgent.Dispatcher}
(...skipping 15 matching lines...) Expand all
1189 1197
1190 /** 1198 /**
1191 * @param {!LayerTreeAgent.LayerId} layerId 1199 * @param {!LayerTreeAgent.LayerId} layerId
1192 * @param {!DOMAgent.Rect} clipRect 1200 * @param {!DOMAgent.Rect} clipRect
1193 */ 1201 */
1194 layerPainted: function(layerId, clipRect) 1202 layerPainted: function(layerId, clipRect)
1195 { 1203 {
1196 this._layerTreeModel._layerPainted(layerId, clipRect); 1204 this._layerTreeModel._layerPainted(layerId, clipRect);
1197 } 1205 }
1198 } 1206 }
OLDNEW
« no previous file with comments | « LayoutTests/inspector/timeline/timeline-layer-tree-snapshot.html ('k') | Source/devtools/front_end/sdk/PaintProfiler.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698