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

Side by Side Diff: Source/devtools/front_end/Layers3DView.js

Issue 166273018: Added showing slow scroll rectangles in Layers panel. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fixes. Added showing all layers under content root. Created 6 years, 9 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2014 Google Inc. All rights reserved. 2 * Copyright (C) 2014 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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 this._model.addEventListener(WebInspector.LayerTreeModel.Events.LayerPainted , this._onLayerPainted, this); 43 this._model.addEventListener(WebInspector.LayerTreeModel.Events.LayerPainted , this._onLayerPainted, this);
44 this._rotatingContainerElement = this.element.createChild("div", "fill rotat ing-container"); 44 this._rotatingContainerElement = this.element.createChild("div", "fill rotat ing-container");
45 this._transformController = new WebInspector.TransformController(this.elemen t); 45 this._transformController = new WebInspector.TransformController(this.elemen t);
46 this._transformController.addEventListener(WebInspector.TransformController. Events.TransformChanged, this._onTransformChanged, this); 46 this._transformController.addEventListener(WebInspector.TransformController. Events.TransformChanged, this._onTransformChanged, this);
47 this.element.addEventListener("dblclick", this._onDoubleClick.bind(this), fa lse); 47 this.element.addEventListener("dblclick", this._onDoubleClick.bind(this), fa lse);
48 this.element.addEventListener("click", this._onClick.bind(this), false); 48 this.element.addEventListener("click", this._onClick.bind(this), false);
49 this.element.addEventListener("mouseout", this._onMouseMove.bind(this), fals e); 49 this.element.addEventListener("mouseout", this._onMouseMove.bind(this), fals e);
50 this.element.addEventListener("mousemove", this._onMouseMove.bind(this), fal se); 50 this.element.addEventListener("mousemove", this._onMouseMove.bind(this), fal se);
51 this.element.addEventListener("contextmenu", this._onContextMenu.bind(this), false); 51 this.element.addEventListener("contextmenu", this._onContextMenu.bind(this), false);
52 this._elementsByLayerId = {}; 52 this._elementsByLayerId = {};
53 this._scrollRectElementsByLayerId = {}
caseq 2014/03/11 11:14:38 unused?
malch 2014/03/11 11:49:08 Done.
53 this._scaleAdjustmentStylesheet = this.element.ownerDocument.head.createChil d("style"); 54 this._scaleAdjustmentStylesheet = this.element.ownerDocument.head.createChil d("style");
54 this._scaleAdjustmentStylesheet.disabled = true; 55 this._scaleAdjustmentStylesheet.disabled = true;
55 this._lastOutlinedElement = {}; 56 this._lastOutlinedElement = {};
56 this._layerImage = document.createElement("img"); 57 this._layerImage = document.createElement("img");
57 this._layerImage.style.width = "100%"; 58 this._layerImage.style.width = "100%";
58 this._layerImage.style.height = "100%"; 59 this._layerImage.style.height = "100%";
59 WebInspector.settings.showPaintRects.addChangeListener(this._update, this); 60 WebInspector.settings.showPaintRects.addChangeListener(this._update, this);
60 } 61 }
61 62
62 /** 63 /**
(...skipping 12 matching lines...) Expand all
75 LayerSelected: "LayerSelected", 76 LayerSelected: "LayerSelected",
76 LayerSnapshotRequested: "LayerSnapshotRequested" 77 LayerSnapshotRequested: "LayerSnapshotRequested"
77 } 78 }
78 79
79 WebInspector.Layers3DView.PaintRectColors = [ 80 WebInspector.Layers3DView.PaintRectColors = [
80 WebInspector.Color.fromRGBA([0, 0x5F, 0, 0x3F]), 81 WebInspector.Color.fromRGBA([0, 0x5F, 0, 0x3F]),
81 WebInspector.Color.fromRGBA([0, 0xAF, 0, 0x3F]), 82 WebInspector.Color.fromRGBA([0, 0xAF, 0, 0x3F]),
82 WebInspector.Color.fromRGBA([0, 0xFF, 0, 0x3F]) 83 WebInspector.Color.fromRGBA([0, 0xFF, 0, 0x3F])
83 ] 84 ]
84 85
86 /**
87 * @enum {string}
88 */
89 WebInspector.Layers3DView.ScrollRectTitles = {
90 RepaintsOnScroll: WebInspector.UIString("repaints on scroll"),
91 TouchEventHandler: WebInspector.UIString("touch event listener"),
92 WheelEventHandler: WebInspector.UIString("mousewheel event listener")
93 }
94
85 WebInspector.Layers3DView.prototype = { 95 WebInspector.Layers3DView.prototype = {
86 onResize: function() 96 onResize: function()
87 { 97 {
88 this._update(); 98 this._update();
89 }, 99 },
90 100
91 willHide: function() 101 willHide: function()
92 { 102 {
93 this._scaleAdjustmentStylesheet.disabled = true; 103 this._scaleAdjustmentStylesheet.disabled = true;
94 }, 104 },
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 { 156 {
147 var element = this._elementForLayer(layer); 157 var element = this._elementForLayer(layer);
148 this._layerImage.removeAttribute("src"); 158 this._layerImage.removeAttribute("src");
149 if (imageURL) 159 if (imageURL)
150 this._layerImage.src = imageURL; 160 this._layerImage.src = imageURL;
151 element.appendChild(this._layerImage); 161 element.appendChild(this._layerImage);
152 }, 162 },
153 163
154 _scaleToFit: function() 164 _scaleToFit: function()
155 { 165 {
156 var root = this._model.contentRoot(); 166 // var root = this._model.root();
157 if (!root) 167 // TODO: RENAME
168 var contentRoot = this._model.contentRoot();
caseq 2014/03/11 11:14:38 Do we really have to rename it here?
malch 2014/03/11 11:49:08 Done.
169 if (!contentRoot)
158 return; 170 return;
159 171
160 const padding = 40; 172 const padding = 40;
161 var scaleX = this._clientWidth / (root.width() + 2 * padding); 173 var scaleX = this._clientWidth / (contentRoot.width() + 2 * padding);
162 var scaleY = this._clientHeight / (root.height() + 2 * padding); 174 var scaleY = this._clientHeight / (contentRoot.height() + 2 * padding);
163 var autoScale = Math.min(scaleX, scaleY); 175 var autoScale = Math.min(scaleX, scaleY);
164 176
165 this._scale = autoScale * this._transformController.scale(); 177 this._scale = autoScale * this._transformController.scale();
166 this._paddingX = ((this._clientWidth / autoScale - root.width()) >> 1) * this._scale; 178 this._paddingX = ((this._clientWidth / autoScale - contentRoot.width()) >> 1) * this._scale;
167 this._paddingY = ((this._clientHeight / autoScale - root.height()) >> 1) * this._scale; 179 this._paddingY = ((this._clientHeight / autoScale - contentRoot.height() ) >> 1) * this._scale;
168 const screenLayerSpacing = 20; 180 const screenLayerSpacing = 20;
169 this._layerSpacing = screenLayerSpacing + "px"; 181 this._layerSpacing = screenLayerSpacing + "px";
170 const screenLayerThickness = 4; 182 const screenLayerThickness = 4;
171 var layerThickness = screenLayerThickness + "px"; 183 var layerThickness = screenLayerThickness + "px";
172 184
173 var stylesheetContent = ".layer-container .side-wall { height: " + layer Thickness + "; width: " + layerThickness + "; } " + 185 var stylesheetContent = ".layer-container .side-wall { height: " + layer Thickness + "; width: " + layerThickness + "; } " +
174 ".layer-container .back-wall { -webkit-transform: translateZ(-" + la yerThickness + "); } " + 186 ".layer-container .back-wall { -webkit-transform: translateZ(-" + la yerThickness + "); } " +
175 ".layer-container { -webkit-transform: translateZ(" + this._layerSpa cing + "); }"; 187 ".layer-container { -webkit-transform: translateZ(" + this._layerSpa cing + "); }";
176 // Workaround for double style recalculation upon assignment to style sh eet's text content. 188 // Workaround for double style recalculation upon assignment to style sh eet's text content.
177 var stylesheetTextNode = this._scaleAdjustmentStylesheet.firstChild; 189 var stylesheetTextNode = this._scaleAdjustmentStylesheet.firstChild;
178 if (!stylesheetTextNode || stylesheetTextNode.nodeType !== Node.TEXT_NOD E || stylesheetTextNode.nextSibling) 190 if (!stylesheetTextNode || stylesheetTextNode.nodeType !== Node.TEXT_NOD E || stylesheetTextNode.nextSibling)
179 this._scaleAdjustmentStylesheet.textContent = stylesheetContent; 191 this._scaleAdjustmentStylesheet.textContent = stylesheetContent;
180 else 192 else
181 stylesheetTextNode.nodeValue = stylesheetContent; 193 stylesheetTextNode.nodeValue = stylesheetContent;
182 194
183 var style = this._elementForLayer(root).style; 195 var style = this._elementForLayer(contentRoot).style;
184 style.left = Math.round(this._paddingX) + "px"; 196 style.left = Math.round(this._paddingX) + "px";
185 style.top = Math.round(this._paddingY) + "px"; 197 style.top = Math.round(this._paddingY) + "px";
186 style.webkitTransformOrigin = ""; 198 style.webkitTransformOrigin = "";
187 }, 199 },
188 200
189 /** 201 /**
190 * @param {!WebInspector.Event} event 202 * @param {!WebInspector.Event} event
191 */ 203 */
192 _onTransformChanged: function(event) 204 _onTransformChanged: function(event)
193 { 205 {
(...skipping 14 matching lines...) Expand all
208 var style = this._rotatingContainerElement.style; 220 var style = this._rotatingContainerElement.style;
209 // Translate well to front so that no matter how we turn the plane, no p arts of it goes below parent. 221 // Translate well to front so that no matter how we turn the plane, no p arts of it goes below parent.
210 // This makes sure mouse events go to proper layers, not straight to the parent. 222 // This makes sure mouse events go to proper layers, not straight to the parent.
211 style.webkitTransform = "translateZ(10000px)" + 223 style.webkitTransform = "translateZ(10000px)" +
212 " rotateX(" + this._transformController.rotateX() + "deg) rotateY(" + this._transformController.rotateY() + "deg)" + 224 " rotateX(" + this._transformController.rotateX() + "deg) rotateY(" + this._transformController.rotateY() + "deg)" +
213 " translateX(" + offsetX + "px) translateY(" + offsetY + "px)"; 225 " translateX(" + offsetX + "px) translateY(" + offsetY + "px)";
214 // Compute where the center of shitfted and scaled root layer would be a nd use is as origin for rotation. 226 // Compute where the center of shitfted and scaled root layer would be a nd use is as origin for rotation.
215 style.webkitTransformOrigin = Math.round(this._paddingX + offsetX + root .width() * this._scale / 2) + "px " + Math.round(this._paddingY + offsetY + root .height() * this._scale / 2) + "px"; 227 style.webkitTransformOrigin = Math.round(this._paddingX + offsetX + root .width() * this._scale / 2) + "px " + Math.round(this._paddingY + offsetY + root .height() * this._scale / 2) + "px";
216 }, 228 },
217 229
230 /**
231 * @param {!Element} element
232 */
233 _removeElement: function(element)
caseq 2014/03/11 11:14:38 looks like you can define it within the only remai
malch 2014/03/11 11:49:08 Done.
234 {
235 element.remove()
236 },
237
238 /**
239 * @param {!WebInspector.Layer} layer
240 * @param {!LayerTreeAgent.ScrollRect} scrollRect
241 * @return {!Element}
242 */
243 _createScrollRectElement: function(layer, scrollRect)
244 {
245 var element = document.createElement("div");
246 var style = element.style;
caseq 2014/03/11 11:14:38 unused?
malch 2014/03/11 11:49:08 Done.
247 var parentLayerId = layer.id();
caseq 2014/03/11 11:14:38 inline
malch 2014/03/11 11:49:08 Done.
248 var parentLayerElement = this._elementsByLayerId[parentLayerId];
249 element.className = "scroll-rect";
250 element.title = WebInspector.Layers3DView.ScrollRectTitles[scrollRect.ty pe];
251 parentLayerElement.appendChild(element);
252 return element;
253 },
254
255 /**
256 * @param {!Array.<!Element>} elements
257 * @param {!LayerTreeAgent.ScrollRect} scrollRect
258 * @param {!number} index
259 */
260 _updateScrollRectElement: function(elements, scrollRect, index)
261 {
262 var element = elements[index];
263 var style = element.style;
264 style.width = Math.round(scrollRect.rect.width * this._scale) + "px";
265 style.height = Math.round(scrollRect.rect.height * this._scale) + "px";
266 style.left = Math.round(scrollRect.rect.x * this._scale) + "px";
267 style.top = Math.round(scrollRect.rect.y * this._scale) + "px";
268 },
269
270 /**
271 * @param {!WebInspector.Layer} layer
272 */
273 _updateScrollRectsForLayer: function(layer)
274 {
275 var newScrollRects = layer.scrollRects(),
276 layerDetails = this._elementsByLayerId[layer.id()].__layerDetails;
277 if (newScrollRects != layerDetails.scrollRects) {
caseq 2014/03/11 11:14:38 We use !==
malch 2014/03/11 11:49:08 Done.
278 layerDetails.scrollRectElements.forEach(this._removeElement);
279 layerDetails.scrollRects = newScrollRects;
280 layerDetails.scrollRectElements = layerDetails.scrollRects.map(this. _createScrollRectElement.bind(this, layer));
281 }
282 layerDetails.scrollRects.forEach(this._updateScrollRectElement.bind(this , layerDetails.scrollRectElements));
283 },
284
218 _update: function() 285 _update: function()
219 { 286 {
220 if (!this.isShowing()) { 287 if (!this.isShowing()) {
221 this._needsUpdate = true; 288 this._needsUpdate = true;
222 return; 289 return;
223 } 290 }
224 if (!this._model.contentRoot()) { 291 if (!this._model.contentRoot()) {
225 this._emptyView.show(this.element); 292 this._emptyView.show(this.element);
226 this._rotatingContainerElement.removeChildren(); 293 this._rotatingContainerElement.removeChildren();
227 return; 294 return;
(...skipping 10 matching lines...) Expand all
238 this._clientWidth = this.element.clientWidth; 305 this._clientWidth = this.element.clientWidth;
239 this._clientHeight = this.element.clientHeight; 306 this._clientHeight = this.element.clientHeight;
240 for (var layerId in this._elementsByLayerId) { 307 for (var layerId in this._elementsByLayerId) {
241 if (this._model.layerById(layerId)) 308 if (this._model.layerById(layerId))
242 continue; 309 continue;
243 this._elementsByLayerId[layerId].remove(); 310 this._elementsByLayerId[layerId].remove();
244 delete this._elementsByLayerId[layerId]; 311 delete this._elementsByLayerId[layerId];
245 } 312 }
246 this._scaleToFit(); 313 this._scaleToFit();
247 this._updateTransform(); 314 this._updateTransform();
248 this._model.forEachLayer(updateLayer.bind(this), this._model.contentRoot ()); 315 this._model.forEachLayer(updateLayer.bind(this));
316 this._model.forEachLayer(this._updateScrollRectsForLayer.bind(this));
249 this._needsUpdate = false; 317 this._needsUpdate = false;
250 }, 318 },
251 319
252 /** 320 /**
253 * @param {!WebInspector.Event} event 321 * @param {!WebInspector.Event} event
254 */ 322 */
255 _onLayerPainted: function(event) 323 _onLayerPainted: function(event)
256 { 324 {
257 var layer = /** @type {!WebInspector.Layer} */ (event.data); 325 var layer = /** @type {!WebInspector.Layer} */ (event.data);
258 this._updatePaintRect(this._elementForLayer(layer)); 326 if (layer.nodeId())
327 this._updatePaintRect(this._elementForLayer(layer));
259 }, 328 },
260 329
261 /** 330 /**
262 * @param {!WebInspector.Layer} layer 331 * @param {!WebInspector.Layer} layer
263 * @return {!Element} 332 * @return {!Element}
264 */ 333 */
265 _elementForLayer: function(layer) 334 _elementForLayer: function(layer)
266 { 335 {
267 var element = this._elementsByLayerId[layer.id()]; 336 var element = this._elementsByLayerId[layer.id()];
268 if (element) { 337 if (element) {
269 // We might have missed an update were a layer with given id was gon e and re-created, 338 // We might have missed an update were a layer with given id was gon e and re-created,
270 // so update reference to point to proper layer object. 339 // so update reference to point to proper layer object.
271 element.__layerDetails.layer = layer; 340 element.__layerDetails.layer = layer;
272 return element; 341 return element;
273 } 342 }
274 element = document.createElement("div"); 343 element = document.createElement("div");
275 element.className = "layer-container"; 344 if (layer.nodeId()) {
276 ["fill back-wall", "side-wall top", "side-wall right", "side-wall bottom ", "side-wall left"].forEach(element.createChild.bind(element, "div")); 345 element.className = "layer-container";
277 element.__layerDetails = new WebInspector.LayerDetails(layer, element.cr eateChild("div", "paint-rect")); 346 ["fill back-wall", "side-wall top", "side-wall right", "side-wall bo ttom", "side-wall left"].forEach(element.createChild.bind(element, "div"));
347 element.__layerDetails = new WebInspector.LayerDetails(layer, elemen t.createChild("div", "paint-rect"));
348 } else {
349 element.className = "layer-transparent";
350 element.__layerDetails = new WebInspector.LayerDetails(layer);
351 }
278 this._elementsByLayerId[layer.id()] = element; 352 this._elementsByLayerId[layer.id()] = element;
279 return element; 353 return element;
280 }, 354 },
281 355
282 /** 356 /**
283 * @param {!Element} element 357 * @param {!Element} element
284 */ 358 */
285 _updateLayerElement: function(element) 359 _updateLayerElement: function(element)
286 { 360 {
287 var layer = element.__layerDetails.layer; 361 var layer = element.__layerDetails.layer;
288 var style = element.style; 362 var style = element.style;
289 var isContentRoot = layer === this._model.contentRoot(); 363
290 var parentElement = isContentRoot ? this._rotatingContainerElement : thi s._elementForLayer(layer.parent()); 364 var contentRoot = /** @type {!WebInspector.Layer} */ (this._model.conten tRoot());
365 var isContentRoot = layer === contentRoot;
366 var isRoot = layer === this._model.root();
367 var parentElement = isContentRoot ? this._rotatingContainerElement : (is Root ? this._elementForLayer(contentRoot) : this._elementForLayer(layer.parent() ));
291 element.__layerDetails.depth = parentElement.__layerDetails ? parentElem ent.__layerDetails.depth + 1 : 0; 368 element.__layerDetails.depth = parentElement.__layerDetails ? parentElem ent.__layerDetails.depth + 1 : 0;
292 element.classList.toggle("invisible", layer.invisible()); 369 element.classList.toggle("invisible", layer.invisible());
293 this._updateElementColor(element); 370 if (layer.nodeId())
371 this._updateElementColor(element);
294 if (parentElement !== element.parentElement) 372 if (parentElement !== element.parentElement)
295 parentElement.appendChild(element); 373 parentElement.appendChild(element);
296 374
297 style.width = Math.round(layer.width() * this._scale) + "px"; 375 style.width = Math.round(layer.width() * this._scale) + "px";
298 style.height = Math.round(layer.height() * this._scale) + "px"; 376 style.height = Math.round(layer.height() * this._scale) + "px";
299 this._updatePaintRect(element); 377 if (layer.nodeId())
300 if (isContentRoot) 378 this._updatePaintRect(element);
379 if (isContentRoot || isRoot)
301 return; 380 return;
302 style.left = Math.round(layer.offsetX() * this._scale) + "px"; 381 style.left = Math.round(layer.offsetX() * this._scale) + "px";
303 style.top = Math.round(layer.offsetY() * this._scale) + "px"; 382 style.top = Math.round(layer.offsetY() * this._scale) + "px";
304 var transform = layer.transform(); 383 var transform = layer.transform();
305 if (transform) { 384 if (transform) {
306 transform = transform.slice(); 385 transform = transform.slice();
307 // Adjust offset in the transform matrix according to scale. 386 // Adjust offset in the transform matrix according to scale.
308 for (var i = 12; i < 15; ++i) 387 for (var i = 12; i < 15; ++i)
309 transform[i] *= this._scale; 388 transform[i] *= this._scale;
310 // Avoid exponential notation in CSS. 389 // Avoid exponential notation in CSS.
311 style.webkitTransform = "matrix3d(" + transform.map(toFixed5).join(" ,") + ") translateZ(" + this._layerSpacing + ")"; 390 style.webkitTransform = "matrix3d(" + transform.map(toFixed5).join(" ,") + ") translateZ(" + this._layerSpacing + ")";
312 var anchor = layer.anchorPoint(); 391 var anchor = layer.anchorPoint();
313 style.webkitTransformOrigin = Math.round(anchor[0] * 100) + "% " + M ath.round(anchor[1] * 100) + "% " + anchor[2]; 392 style.webkitTransformOrigin = Math.round(anchor[0] * 100) + "% " + M ath.round(anchor[1] * 100) + "% " + anchor[2];
314 } else { 393 } else {
315 style.webkitTransform = ""; 394 style.webkitTransform = "";
316 style.webkitTransformOrigin = ""; 395 style.webkitTransformOrigin = "";
317 } 396 }
318 397
319 function toFixed5(x) 398 function toFixed5(x)
320 { 399 {
321 return x.toFixed(5); 400 return x.toFixed(5);
322 } 401 }
323 }, 402 },
324 403
404 /**
405 * @param {!Element} element
406 */
325 _updatePaintRect: function(element) 407 _updatePaintRect: function(element)
326 { 408 {
327 var details = element.__layerDetails; 409 var details = element.__layerDetails;
328 var paintRect = details.layer.lastPaintRect(); 410 var paintRect = details.layer.lastPaintRect();
329 var paintRectElement = details.paintRectElement; 411 var paintRectElement = details.paintRectElement;
330 if (!paintRect || !WebInspector.settings.showPaintRects.get()) { 412 if (!paintRect || !WebInspector.settings.showPaintRects.get()) {
331 paintRectElement.classList.add("hidden"); 413 paintRectElement.classList.add("hidden");
332 return; 414 return;
333 } 415 }
334 paintRectElement.classList.remove("hidden"); 416 paintRectElement.classList.remove("hidden");
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 this.dispatchEventToListeners(WebInspector.Layers3DView.Events.Layer SnapshotRequested, layer); 501 this.dispatchEventToListeners(WebInspector.Layers3DView.Events.Layer SnapshotRequested, layer);
420 event.stopPropagation(); 502 event.stopPropagation();
421 }, 503 },
422 504
423 __proto__: WebInspector.View.prototype 505 __proto__: WebInspector.View.prototype
424 } 506 }
425 507
426 /** 508 /**
427 * @constructor 509 * @constructor
428 * @param {!WebInspector.Layer} layer 510 * @param {!WebInspector.Layer} layer
429 * @param {!Element} paintRectElement 511 * @param {!Element=} paintRectElement
430 */ 512 */
431 WebInspector.LayerDetails = function(layer, paintRectElement) 513 WebInspector.LayerDetails = function(layer, paintRectElement)
432 { 514 {
433 this.layer = layer; 515 this.layer = layer;
434 this.depth = 0; 516 this.depth = 0;
435 this.paintRectElement = paintRectElement; 517 if (paintRectElement)
caseq 2014/03/11 11:14:38 I think you can omit this check.
malch 2014/03/11 11:49:08 Done.
518 this.paintRectElement = paintRectElement;
436 this.paintCount = 0; 519 this.paintCount = 0;
520 this.scrollRects = [];
521 this.scrollRectElements = [];
437 } 522 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698