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

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/timeline_model/TracingLayerTree.js

Issue 2493373002: DevTools: rename WebInspector into modules. (Closed)
Patch Set: for bots Created 4 years, 1 month 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
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 /** @typedef {!{ 4 /** @typedef {!{
5 bounds: {height: number, width: number}, 5 bounds: {height: number, width: number},
6 children: Array.<!WebInspector.TracingLayerPayload>, 6 children: Array.<!TimelineModel.TracingLayerPayload>,
7 layer_id: number, 7 layer_id: number,
8 position: Array.<number>, 8 position: Array.<number>,
9 scroll_offset: Array.<number>, 9 scroll_offset: Array.<number>,
10 layer_quad: Array.<number>, 10 layer_quad: Array.<number>,
11 draws_content: number, 11 draws_content: number,
12 gpu_memory_usage: number, 12 gpu_memory_usage: number,
13 transform: Array.<number>, 13 transform: Array.<number>,
14 owner_node: number, 14 owner_node: number,
15 compositing_reasons: Array.<string> 15 compositing_reasons: Array.<string>
16 }} 16 }}
17 */ 17 */
18 WebInspector.TracingLayerPayload; 18 TimelineModel.TracingLayerPayload;
19 19
20 /** @typedef {!{ 20 /** @typedef {!{
21 id: string, 21 id: string,
22 layer_id: string, 22 layer_id: string,
23 gpu_memory_usage: number, 23 gpu_memory_usage: number,
24 content_rect: !Array.<number> 24 content_rect: !Array.<number>
25 }} 25 }}
26 */ 26 */
27 WebInspector.TracingLayerTile; 27 TimelineModel.TracingLayerTile;
28
29 /** @typedef {!{
30 rect: !Protocol.DOM.Rect,
31 snapshot: !WebInspector.PaintProfilerSnapshot
32 }}
33 */
34 WebInspector.SnapshotWithRect;
35 28
36 /** 29 /**
37 * @unrestricted 30 * @unrestricted
38 */ 31 */
39 WebInspector.TracingLayerTree = class extends WebInspector.LayerTreeBase { 32 TimelineModel.TracingLayerTree = class extends SDK.LayerTreeBase {
40 /** 33 /**
41 * @param {?WebInspector.Target} target 34 * @param {?SDK.Target} target
42 */ 35 */
43 constructor(target) { 36 constructor(target) {
44 super(target); 37 super(target);
45 /** @type {!Map.<string, !WebInspector.TracingLayerTile>} */ 38 /** @type {!Map.<string, !TimelineModel.TracingLayerTile>} */
46 this._tileById = new Map(); 39 this._tileById = new Map();
47 } 40 }
48 41
49 /** 42 /**
50 * @param {?WebInspector.TracingLayerPayload} root 43 * @param {?TimelineModel.TracingLayerPayload} root
51 * @param {?Array<!WebInspector.TracingLayerPayload>} layers 44 * @param {?Array<!TimelineModel.TracingLayerPayload>} layers
52 * @param {!Array<!WebInspector.LayerPaintEvent>} paints 45 * @param {!Array<!TimelineModel.LayerPaintEvent>} paints
53 * @param {function()} callback 46 * @param {function()} callback
54 */ 47 */
55 setLayers(root, layers, paints, callback) { 48 setLayers(root, layers, paints, callback) {
56 var idsToResolve = new Set(); 49 var idsToResolve = new Set();
57 if (root) { 50 if (root) {
58 // This is a legacy code path for compatibility, as cc is removing 51 // This is a legacy code path for compatibility, as cc is removing
59 // layer tree hierarchy, this code will eventually be removed. 52 // layer tree hierarchy, this code will eventually be removed.
60 this._extractNodeIdsToResolve(idsToResolve, {}, root); 53 this._extractNodeIdsToResolve(idsToResolve, {}, root);
61 } else { 54 } else {
62 for (var i = 0; i < layers.length; ++i) 55 for (var i = 0; i < layers.length; ++i)
63 this._extractNodeIdsToResolve(idsToResolve, {}, layers[i]); 56 this._extractNodeIdsToResolve(idsToResolve, {}, layers[i]);
64 } 57 }
65 this._resolveBackendNodeIds(idsToResolve, onBackendNodeIdsResolved.bind(this )); 58 this._resolveBackendNodeIds(idsToResolve, onBackendNodeIdsResolved.bind(this ));
66 59
67 /** 60 /**
68 * @this {WebInspector.TracingLayerTree} 61 * @this {TimelineModel.TracingLayerTree}
69 */ 62 */
70 function onBackendNodeIdsResolved() { 63 function onBackendNodeIdsResolved() {
71 var oldLayersById = this._layersById; 64 var oldLayersById = this._layersById;
72 this._layersById = {}; 65 this._layersById = {};
73 this.setContentRoot(null); 66 this.setContentRoot(null);
74 if (root) { 67 if (root) {
75 var convertedLayers = this._innerSetLayers(oldLayersById, root); 68 var convertedLayers = this._innerSetLayers(oldLayersById, root);
76 this.setRoot(convertedLayers); 69 this.setRoot(convertedLayers);
77 } else { 70 } else {
78 var processedLayers = layers.map(this._innerSetLayers.bind(this, oldLaye rsById)); 71 var processedLayers = layers.map(this._innerSetLayers.bind(this, oldLaye rsById));
79 var contentRoot = this.contentRoot(); 72 var contentRoot = this.contentRoot();
80 this.setRoot(contentRoot); 73 this.setRoot(contentRoot);
81 for (var i = 0; i < processedLayers.length; ++i) { 74 for (var i = 0; i < processedLayers.length; ++i) {
82 if (processedLayers[i].id() !== contentRoot.id()) 75 if (processedLayers[i].id() !== contentRoot.id())
83 contentRoot.addChild(processedLayers[i]); 76 contentRoot.addChild(processedLayers[i]);
84 } 77 }
85 } 78 }
86 this._setPaints(paints); 79 this._setPaints(paints);
87 callback(); 80 callback();
88 } 81 }
89 } 82 }
90 83
91 /** 84 /**
92 * @param {!Array.<!WebInspector.TracingLayerTile>} tiles 85 * @param {!Array.<!TimelineModel.TracingLayerTile>} tiles
93 */ 86 */
94 setTiles(tiles) { 87 setTiles(tiles) {
95 this._tileById = new Map(); 88 this._tileById = new Map();
96 for (var tile of tiles) 89 for (var tile of tiles)
97 this._tileById.set(tile.id, tile); 90 this._tileById.set(tile.id, tile);
98 } 91 }
99 92
100 /** 93 /**
101 * @param {string} tileId 94 * @param {string} tileId
102 * @return {!Promise<?WebInspector.SnapshotWithRect>} 95 * @return {!Promise<?SDK.SnapshotWithRect>}
103 */ 96 */
104 pictureForRasterTile(tileId) { 97 pictureForRasterTile(tileId) {
105 var tile = this._tileById.get('cc::Tile/' + tileId); 98 var tile = this._tileById.get('cc::Tile/' + tileId);
106 if (!tile) { 99 if (!tile) {
107 WebInspector.console.error(`Tile ${tileId} is missing`); 100 Common.console.error(`Tile ${tileId} is missing`);
108 return /** @type {!Promise<?WebInspector.SnapshotWithRect>} */ (Promise.re solve(null)); 101 return /** @type {!Promise<?SDK.SnapshotWithRect>} */ (Promise.resolve(nul l));
109 } 102 }
110 var layer = this.layerById(tile.layer_id); 103 var layer = this.layerById(tile.layer_id);
111 if (!layer) { 104 if (!layer) {
112 WebInspector.console.error(`Layer ${tile.layer_id} for tile ${tileId} is n ot found`); 105 Common.console.error(`Layer ${tile.layer_id} for tile ${tileId} is not fou nd`);
113 return /** @type {!Promise<?WebInspector.SnapshotWithRect>} */ (Promise.re solve(null)); 106 return /** @type {!Promise<?SDK.SnapshotWithRect>} */ (Promise.resolve(nul l));
114 } 107 }
115 return layer._pictureForRect(tile.content_rect); 108 return layer._pictureForRect(tile.content_rect);
116 } 109 }
117 110
118 /** 111 /**
119 * @param {!Array<!WebInspector.LayerPaintEvent>} paints 112 * @param {!Array<!TimelineModel.LayerPaintEvent>} paints
120 */ 113 */
121 _setPaints(paints) { 114 _setPaints(paints) {
122 for (var i = 0; i < paints.length; ++i) { 115 for (var i = 0; i < paints.length; ++i) {
123 var layer = this._layersById[paints[i].layerId()]; 116 var layer = this._layersById[paints[i].layerId()];
124 if (layer) 117 if (layer)
125 layer._addPaintEvent(paints[i]); 118 layer._addPaintEvent(paints[i]);
126 } 119 }
127 } 120 }
128 121
129 /** 122 /**
130 * @param {!Object<(string|number), !WebInspector.Layer>} oldLayersById 123 * @param {!Object<(string|number), !SDK.Layer>} oldLayersById
131 * @param {!WebInspector.TracingLayerPayload} payload 124 * @param {!TimelineModel.TracingLayerPayload} payload
132 * @return {!WebInspector.TracingLayer} 125 * @return {!TimelineModel.TracingLayer}
133 */ 126 */
134 _innerSetLayers(oldLayersById, payload) { 127 _innerSetLayers(oldLayersById, payload) {
135 var layer = /** @type {?WebInspector.TracingLayer} */ (oldLayersById[payload .layer_id]); 128 var layer = /** @type {?TimelineModel.TracingLayer} */ (oldLayersById[payloa d.layer_id]);
136 if (layer) 129 if (layer)
137 layer._reset(payload); 130 layer._reset(payload);
138 else 131 else
139 layer = new WebInspector.TracingLayer(this.target(), payload); 132 layer = new TimelineModel.TracingLayer(this.target(), payload);
140 this._layersById[payload.layer_id] = layer; 133 this._layersById[payload.layer_id] = layer;
141 if (payload.owner_node) 134 if (payload.owner_node)
142 layer._setNode(this._backendNodeIdToNode.get(payload.owner_node) || null); 135 layer._setNode(this._backendNodeIdToNode.get(payload.owner_node) || null);
143 if (!this.contentRoot() && layer.drawsContent()) 136 if (!this.contentRoot() && layer.drawsContent())
144 this.setContentRoot(layer); 137 this.setContentRoot(layer);
145 for (var i = 0; payload.children && i < payload.children.length; ++i) 138 for (var i = 0; payload.children && i < payload.children.length; ++i)
146 layer.addChild(this._innerSetLayers(oldLayersById, payload.children[i])); 139 layer.addChild(this._innerSetLayers(oldLayersById, payload.children[i]));
147 return layer; 140 return layer;
148 } 141 }
149 142
150 /** 143 /**
151 * @param {!Set<number>} nodeIdsToResolve 144 * @param {!Set<number>} nodeIdsToResolve
152 * @param {!Object} seenNodeIds 145 * @param {!Object} seenNodeIds
153 * @param {!WebInspector.TracingLayerPayload} payload 146 * @param {!TimelineModel.TracingLayerPayload} payload
154 */ 147 */
155 _extractNodeIdsToResolve(nodeIdsToResolve, seenNodeIds, payload) { 148 _extractNodeIdsToResolve(nodeIdsToResolve, seenNodeIds, payload) {
156 var backendNodeId = payload.owner_node; 149 var backendNodeId = payload.owner_node;
157 if (backendNodeId && !this._backendNodeIdToNode.has(backendNodeId)) 150 if (backendNodeId && !this._backendNodeIdToNode.has(backendNodeId))
158 nodeIdsToResolve.add(backendNodeId); 151 nodeIdsToResolve.add(backendNodeId);
159 for (var i = 0; payload.children && i < payload.children.length; ++i) 152 for (var i = 0; payload.children && i < payload.children.length; ++i)
160 this._extractNodeIdsToResolve(nodeIdsToResolve, seenNodeIds, payload.child ren[i]); 153 this._extractNodeIdsToResolve(nodeIdsToResolve, seenNodeIds, payload.child ren[i]);
161 } 154 }
162 }; 155 };
163 156
164 /** 157 /**
165 * @implements {WebInspector.Layer} 158 * @implements {SDK.Layer}
166 * @unrestricted 159 * @unrestricted
167 */ 160 */
168 WebInspector.TracingLayer = class { 161 TimelineModel.TracingLayer = class {
169 /** 162 /**
170 * @param {!WebInspector.TracingLayerPayload} payload 163 * @param {!TimelineModel.TracingLayerPayload} payload
171 * @param {?WebInspector.Target} target 164 * @param {?SDK.Target} target
172 */ 165 */
173 constructor(target, payload) { 166 constructor(target, payload) {
174 this._target = target; 167 this._target = target;
175 this._reset(payload); 168 this._reset(payload);
176 } 169 }
177 170
178 /** 171 /**
179 * @param {!WebInspector.TracingLayerPayload} payload 172 * @param {!TimelineModel.TracingLayerPayload} payload
180 */ 173 */
181 _reset(payload) { 174 _reset(payload) {
182 /** @type {?WebInspector.DOMNode} */ 175 /** @type {?SDK.DOMNode} */
183 this._node = null; 176 this._node = null;
184 this._layerId = String(payload.layer_id); 177 this._layerId = String(payload.layer_id);
185 this._offsetX = payload.position[0]; 178 this._offsetX = payload.position[0];
186 this._offsetY = payload.position[1]; 179 this._offsetY = payload.position[1];
187 this._width = payload.bounds.width; 180 this._width = payload.bounds.width;
188 this._height = payload.bounds.height; 181 this._height = payload.bounds.height;
189 this._children = []; 182 this._children = [];
190 this._parentLayerId = null; 183 this._parentLayerId = null;
191 this._parent = null; 184 this._parent = null;
192 this._quad = payload.layer_quad || []; 185 this._quad = payload.layer_quad || [];
(...skipping 15 matching lines...) Expand all
208 /** 201 /**
209 * @override 202 * @override
210 * @return {?string} 203 * @return {?string}
211 */ 204 */
212 parentId() { 205 parentId() {
213 return this._parentLayerId; 206 return this._parentLayerId;
214 } 207 }
215 208
216 /** 209 /**
217 * @override 210 * @override
218 * @return {?WebInspector.Layer} 211 * @return {?SDK.Layer}
219 */ 212 */
220 parent() { 213 parent() {
221 return this._parent; 214 return this._parent;
222 } 215 }
223 216
224 /** 217 /**
225 * @override 218 * @override
226 * @return {boolean} 219 * @return {boolean}
227 */ 220 */
228 isRoot() { 221 isRoot() {
229 return !this.parentId(); 222 return !this.parentId();
230 } 223 }
231 224
232 /** 225 /**
233 * @override 226 * @override
234 * @return {!Array.<!WebInspector.Layer>} 227 * @return {!Array.<!SDK.Layer>}
235 */ 228 */
236 children() { 229 children() {
237 return this._children; 230 return this._children;
238 } 231 }
239 232
240 /** 233 /**
241 * @override 234 * @override
242 * @param {!WebInspector.Layer} child 235 * @param {!SDK.Layer} child
243 */ 236 */
244 addChild(child) { 237 addChild(child) {
245 if (child._parent) 238 if (child._parent)
246 console.assert(false, 'Child already has a parent'); 239 console.assert(false, 'Child already has a parent');
247 this._children.push(child); 240 this._children.push(child);
248 child._parent = this; 241 child._parent = this;
249 child._parentLayerId = this._layerId; 242 child._parentLayerId = this._layerId;
250 } 243 }
251 244
252 /** 245 /**
253 * @param {?WebInspector.DOMNode} node 246 * @param {?SDK.DOMNode} node
254 */ 247 */
255 _setNode(node) { 248 _setNode(node) {
256 this._node = node; 249 this._node = node;
257 } 250 }
258 251
259 /** 252 /**
260 * @override 253 * @override
261 * @return {?WebInspector.DOMNode} 254 * @return {?SDK.DOMNode}
262 */ 255 */
263 node() { 256 node() {
264 return this._node; 257 return this._node;
265 } 258 }
266 259
267 /** 260 /**
268 * @override 261 * @override
269 * @return {?WebInspector.DOMNode} 262 * @return {?SDK.DOMNode}
270 */ 263 */
271 nodeForSelfOrAncestor() { 264 nodeForSelfOrAncestor() {
272 for (var layer = this; layer; layer = layer._parent) { 265 for (var layer = this; layer; layer = layer._parent) {
273 if (layer._node) 266 if (layer._node)
274 return layer._node; 267 return layer._node;
275 } 268 }
276 return null; 269 return null;
277 } 270 }
278 271
279 /** 272 /**
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 /** 360 /**
368 * @override 361 * @override
369 * @return {number} 362 * @return {number}
370 */ 363 */
371 gpuMemoryUsage() { 364 gpuMemoryUsage() {
372 return this._gpuMemoryUsage; 365 return this._gpuMemoryUsage;
373 } 366 }
374 367
375 /** 368 /**
376 * @override 369 * @override
377 * @return {!Array<!Promise<?WebInspector.SnapshotWithRect>>} 370 * @return {!Array<!Promise<?SDK.SnapshotWithRect>>}
378 */ 371 */
379 snapshots() { 372 snapshots() {
380 return this._paints.map(paint => paint.snapshotPromise().then(snapshot => { 373 return this._paints.map(paint => paint.snapshotPromise().then(snapshot => {
381 if (!snapshot) 374 if (!snapshot)
382 return null; 375 return null;
383 var rect = {x: snapshot.rect[0], y: snapshot.rect[1], width: snapshot.rect [2], height: snapshot.rect[3]}; 376 var rect = {x: snapshot.rect[0], y: snapshot.rect[1], width: snapshot.rect [2], height: snapshot.rect[3]};
384 return {rect: rect, snapshot: snapshot.snapshot}; 377 return {rect: rect, snapshot: snapshot.snapshot};
385 })); 378 }));
386 } 379 }
387 380
388 /** 381 /**
389 * @param {!Array<number>} targetRect 382 * @param {!Array<number>} targetRect
390 * @return {!Promise<?WebInspector.SnapshotWithRect>} 383 * @return {!Promise<?SDK.SnapshotWithRect>}
391 */ 384 */
392 _pictureForRect(targetRect) { 385 _pictureForRect(targetRect) {
393 return Promise.all(this._paints.map(paint => paint.picturePromise())).then(p ictures => { 386 return Promise.all(this._paints.map(paint => paint.picturePromise())).then(p ictures => {
394 var fragments = 387 var fragments =
395 pictures.filter(picture => picture && rectsOverlap(picture.rect, targe tRect)) 388 pictures.filter(picture => picture && rectsOverlap(picture.rect, targe tRect))
396 .map(picture => ({x: picture.rect[0], y: picture.rect[1], picture: picture.serializedPicture})); 389 .map(picture => ({x: picture.rect[0], y: picture.rect[1], picture: picture.serializedPicture}));
397 if (!fragments.length || !this._target) 390 if (!fragments.length || !this._target)
398 return null; 391 return null;
399 var x0 = fragments.reduce((min, item) => Math.min(min, item.x), Infinity); 392 var x0 = fragments.reduce((min, item) => Math.min(min, item.x), Infinity);
400 var y0 = fragments.reduce((min, item) => Math.min(min, item.y), Infinity); 393 var y0 = fragments.reduce((min, item) => Math.min(min, item.y), Infinity);
401 // Rect is in layer content coordinates, make it relative to picture by of fsetting to the top left corner. 394 // Rect is in layer content coordinates, make it relative to picture by of fsetting to the top left corner.
402 var rect = {x: targetRect[0] - x0, y: targetRect[1] - y0, width: targetRec t[2], height: targetRect[3]}; 395 var rect = {x: targetRect[0] - x0, y: targetRect[1] - y0, width: targetRec t[2], height: targetRect[3]};
403 return WebInspector.PaintProfilerSnapshot.loadFromFragments(this._target, fragments) 396 return SDK.PaintProfilerSnapshot.loadFromFragments(this._target, fragments )
404 .then(snapshot => snapshot ? {rect: rect, snapshot: snapshot} : null); 397 .then(snapshot => snapshot ? {rect: rect, snapshot: snapshot} : null);
405 }); 398 });
406 399
407 /** 400 /**
408 * @param {number} a1 401 * @param {number} a1
409 * @param {number} a2 402 * @param {number} a2
410 * @param {number} b1 403 * @param {number} b1
411 * @param {number} b2 404 * @param {number} b2
412 * @return {boolean} 405 * @return {boolean}
413 */ 406 */
(...skipping 16 matching lines...) Expand all
430 /** 423 /**
431 * @param {!Array.<number>} params 424 * @param {!Array.<number>} params
432 * @param {string} type 425 * @param {string} type
433 * @return {!Object} 426 * @return {!Object}
434 */ 427 */
435 _scrollRectsFromParams(params, type) { 428 _scrollRectsFromParams(params, type) {
436 return {rect: {x: params[0], y: params[1], width: params[2], height: params[ 3]}, type: type}; 429 return {rect: {x: params[0], y: params[1], width: params[2], height: params[ 3]}, type: type};
437 } 430 }
438 431
439 /** 432 /**
440 * @param {!WebInspector.TracingLayerPayload} payload 433 * @param {!TimelineModel.TracingLayerPayload} payload
441 */ 434 */
442 _createScrollRects(payload) { 435 _createScrollRects(payload) {
443 this._scrollRects = []; 436 this._scrollRects = [];
444 if (payload.non_fast_scrollable_region) 437 if (payload.non_fast_scrollable_region)
445 this._scrollRects.push(this._scrollRectsFromParams( 438 this._scrollRects.push(this._scrollRectsFromParams(
446 payload.non_fast_scrollable_region, WebInspector.Layer.ScrollRectType. NonFastScrollable.name)); 439 payload.non_fast_scrollable_region, SDK.Layer.ScrollRectType.NonFastSc rollable.name));
447 if (payload.touch_event_handler_region) 440 if (payload.touch_event_handler_region)
448 this._scrollRects.push(this._scrollRectsFromParams( 441 this._scrollRects.push(this._scrollRectsFromParams(
449 payload.touch_event_handler_region, WebInspector.Layer.ScrollRectType. TouchEventHandler.name)); 442 payload.touch_event_handler_region, SDK.Layer.ScrollRectType.TouchEven tHandler.name));
450 if (payload.wheel_event_handler_region) 443 if (payload.wheel_event_handler_region)
451 this._scrollRects.push(this._scrollRectsFromParams( 444 this._scrollRects.push(this._scrollRectsFromParams(
452 payload.wheel_event_handler_region, WebInspector.Layer.ScrollRectType. WheelEventHandler.name)); 445 payload.wheel_event_handler_region, SDK.Layer.ScrollRectType.WheelEven tHandler.name));
453 if (payload.scroll_event_handler_region) 446 if (payload.scroll_event_handler_region)
454 this._scrollRects.push(this._scrollRectsFromParams( 447 this._scrollRects.push(this._scrollRectsFromParams(
455 payload.scroll_event_handler_region, WebInspector.Layer.ScrollRectType .RepaintsOnScroll.name)); 448 payload.scroll_event_handler_region, SDK.Layer.ScrollRectType.Repaints OnScroll.name));
456 } 449 }
457 450
458 /** 451 /**
459 * @param {!WebInspector.LayerPaintEvent} paint 452 * @param {!TimelineModel.LayerPaintEvent} paint
460 */ 453 */
461 _addPaintEvent(paint) { 454 _addPaintEvent(paint) {
462 this._paints.push(paint); 455 this._paints.push(paint);
463 } 456 }
464 457
465 /** 458 /**
466 * @override 459 * @override
467 * @param {function(!Array.<string>)} callback 460 * @param {function(!Array.<string>)} callback
468 */ 461 */
469 requestCompositingReasons(callback) { 462 requestCompositingReasons(callback) {
470 callback(this._compositingReasons); 463 callback(this._compositingReasons);
471 } 464 }
472 465
473 /** 466 /**
474 * @override 467 * @override
475 * @return {boolean} 468 * @return {boolean}
476 */ 469 */
477 drawsContent() { 470 drawsContent() {
478 return this._drawsContent; 471 return this._drawsContent;
479 } 472 }
480 }; 473 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698