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

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

Issue 197823010: [DevTools] Add minimum size to WebInspector.View. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@splitdip2
Patch Set: rebase 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) 2008 Apple Inc. All Rights Reserved. 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3 * Copyright (C) 2011 Google Inc. All Rights Reserved. 3 * Copyright (C) 2011 Google Inc. All Rights Reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. 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 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 }, 222 },
223 223
224 willHide: function() 224 willHide: function()
225 { 225 {
226 }, 226 },
227 227
228 onResize: function() 228 onResize: function()
229 { 229 {
230 }, 230 },
231 231
232 onLayout: function()
233 {
234 },
235
232 /** 236 /**
233 * @param {?Element} parentElement 237 * @param {?Element} parentElement
234 * @param {!Element=} insertBefore 238 * @param {!Element=} insertBefore
235 */ 239 */
236 show: function(parentElement, insertBefore) 240 show: function(parentElement, insertBefore)
237 { 241 {
238 WebInspector.View._assert(parentElement, "Attempt to attach view with no parent element"); 242 WebInspector.View._assert(parentElement, "Attempt to attach view with no parent element");
239 243
240 // Update view hierarchy 244 // Update view hierarchy
241 if (this.element.parentElement !== parentElement) { 245 if (this.element.parentElement !== parentElement) {
(...skipping 27 matching lines...) Expand all
269 if (insertBefore) 273 if (insertBefore)
270 WebInspector.View._originalInsertBefore.call(parentElement, this .element, insertBefore); 274 WebInspector.View._originalInsertBefore.call(parentElement, this .element, insertBefore);
271 else 275 else
272 WebInspector.View._originalAppendChild.call(parentElement, this. element); 276 WebInspector.View._originalAppendChild.call(parentElement, this. element);
273 } 277 }
274 278
275 if (this._parentIsShowing()) { 279 if (this._parentIsShowing()) {
276 this._processWasShown(); 280 this._processWasShown();
277 this._cacheSize(); 281 this._cacheSize();
278 } 282 }
283
284 if (this._parentView && this._hasNonZeroMinimumSize())
285 this._parentView.invalidateMinimumSize();
279 }, 286 },
280 287
281 /** 288 /**
282 * @param {boolean=} overrideHideOnDetach 289 * @param {boolean=} overrideHideOnDetach
283 */ 290 */
284 detach: function(overrideHideOnDetach) 291 detach: function(overrideHideOnDetach)
285 { 292 {
286 var parentElement = this.element.parentElement; 293 var parentElement = this.element.parentElement;
287 if (!parentElement) 294 if (!parentElement)
288 return; 295 return;
289 296
290 if (this._parentIsShowing()) { 297 if (this._parentIsShowing()) {
291 this._processDiscardCachedSize(); 298 this._processDiscardCachedSize();
292 this._processWillHide(); 299 this._processWillHide();
293 } 300 }
294 301
295 if (this._hideOnDetach && !overrideHideOnDetach) { 302 if (this._hideOnDetach && !overrideHideOnDetach) {
296 this.element.classList.remove("visible"); 303 this.element.classList.remove("visible");
297 this._visible = false; 304 this._visible = false;
298 if (this._parentIsShowing()) 305 if (this._parentIsShowing())
299 this._processWasHidden(); 306 this._processWasHidden();
307 if (this._parentView && this._hasNonZeroMinimumSize())
308 this._parentView.invalidateMinimumSize();
300 return; 309 return;
301 } 310 }
302 311
303 // Force legal removal 312 // Force legal removal
304 WebInspector.View._decrementViewCounter(parentElement, this.element); 313 WebInspector.View._decrementViewCounter(parentElement, this.element);
305 WebInspector.View._originalRemoveChild.call(parentElement, this.element) ; 314 WebInspector.View._originalRemoveChild.call(parentElement, this.element) ;
306 315
307 this._visible = false; 316 this._visible = false;
308 if (this._parentIsShowing()) 317 if (this._parentIsShowing())
309 this._processWasHidden(); 318 this._processWasHidden();
310 319
311 // Update view hierarchy 320 // Update view hierarchy
312 if (this._parentView) { 321 if (this._parentView) {
313 var childIndex = this._parentView._children.indexOf(this); 322 var childIndex = this._parentView._children.indexOf(this);
314 WebInspector.View._assert(childIndex >= 0, "Attempt to remove non-ch ild view"); 323 WebInspector.View._assert(childIndex >= 0, "Attempt to remove non-ch ild view");
315 this._parentView._children.splice(childIndex, 1); 324 this._parentView._children.splice(childIndex, 1);
325 var parent = this._parentView;
316 this._parentView = null; 326 this._parentView = null;
327 if (this._hasNonZeroMinimumSize())
328 parent.invalidateMinimumSize();
317 } else 329 } else
318 WebInspector.View._assert(this._isRoot, "Removing non-root view from DOM"); 330 WebInspector.View._assert(this._isRoot, "Removing non-root view from DOM");
319 }, 331 },
320 332
321 detachChildViews: function() 333 detachChildViews: function()
322 { 334 {
323 var children = this._children.slice(); 335 var children = this._children.slice();
324 for (var i = 0; i < children.length; ++i) 336 for (var i = 0; i < children.length; ++i)
325 children[i].detach(); 337 children[i].detach();
326 }, 338 },
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
359 { 371 {
360 if (!this.isShowing()) 372 if (!this.isShowing())
361 return; 373 return;
362 this._processDiscardCachedSize(); 374 this._processDiscardCachedSize();
363 // No matter what notification we are in, dispatching onResize is not ne eded. 375 // No matter what notification we are in, dispatching onResize is not ne eded.
364 if (!this._inNotification()) 376 if (!this._inNotification())
365 this._callOnVisibleChildren(this._processOnResize); 377 this._callOnVisibleChildren(this._processOnResize);
366 this._cacheSize(); 378 this._cacheSize();
367 }, 379 },
368 380
381 doLayout: function()
382 {
383 if (!this.isShowing())
384 return;
385 this._notify(this.onLayout);
386 this.doResize();
387 },
388
369 registerRequiredCSS: function(cssFile) 389 registerRequiredCSS: function(cssFile)
370 { 390 {
371 if (window.flattenImports) 391 if (window.flattenImports)
372 cssFile = cssFile.split("/").reverse()[0]; 392 cssFile = cssFile.split("/").reverse()[0];
373 this._cssFiles.push(cssFile); 393 this._cssFiles.push(cssFile);
374 }, 394 },
375 395
376 _loadCSSIfNeeded: function() 396 _loadCSSIfNeeded: function()
377 { 397 {
378 for (var i = 0; i < this._cssFiles.length; ++i) { 398 for (var i = 0; i < this._cssFiles.length; ++i) {
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 this._loadCSSIfNeeded(); 497 this._loadCSSIfNeeded();
478 WebInspector.View._originalAppendChild.call(document.body, this.element) ; 498 WebInspector.View._originalAppendChild.call(document.body, this.element) ;
479 this.element.positionAt(0, 0); 499 this.element.positionAt(0, 0);
480 var result = new Size(this.element.offsetWidth, this.element.offsetHeigh t); 500 var result = new Size(this.element.offsetWidth, this.element.offsetHeigh t);
481 this.element.positionAt(undefined, undefined); 501 this.element.positionAt(undefined, undefined);
482 WebInspector.View._originalRemoveChild.call(document.body, this.element) ; 502 WebInspector.View._originalRemoveChild.call(document.body, this.element) ;
483 this._disableCSSIfNeeded(); 503 this._disableCSSIfNeeded();
484 return result; 504 return result;
485 }, 505 },
486 506
507 /**
508 * @return {!Size}
509 */
510 calculateMinimumSize: function()
511 {
512 return new Size(0, 0);
513 },
514
515 /**
516 * @return {!Size}
517 */
518 minimumSize: function()
519 {
520 if (typeof this._minimumSize !== "undefined")
521 return this._minimumSize;
522 if (typeof this._cachedMinimumSize === "undefined")
523 this._cachedMinimumSize = this.calculateMinimumSize();
524 return this._cachedMinimumSize;
525 },
526
527 /**
528 * @param {number} width
529 * @param {number} height
530 */
531 setMinimumSize: function(width, height)
532 {
533 this._minimumSize = new Size(width, height);
534 this.invalidateMinimumSize();
535 },
536
537 /**
538 * @return {boolean}
539 */
540 _hasNonZeroMinimumSize: function()
541 {
542 var size = this.minimumSize();
543 return size.width || size.height;
544 },
545
546 invalidateMinimumSize: function()
547 {
548 var cached = this._cachedMinimumSize;
549 delete this._cachedMinimumSize;
550 var actual = this.minimumSize();
551 if (!actual.isEqual(cached) && this._parentView)
552 this._parentView.invalidateMinimumSize();
553 else
554 this.doLayout();
555 },
556
487 __proto__: WebInspector.Object.prototype 557 __proto__: WebInspector.Object.prototype
488 } 558 }
489 559
490 WebInspector.View._originalAppendChild = Element.prototype.appendChild; 560 WebInspector.View._originalAppendChild = Element.prototype.appendChild;
491 WebInspector.View._originalInsertBefore = Element.prototype.insertBefore; 561 WebInspector.View._originalInsertBefore = Element.prototype.insertBefore;
492 WebInspector.View._originalRemoveChild = Element.prototype.removeChild; 562 WebInspector.View._originalRemoveChild = Element.prototype.removeChild;
493 WebInspector.View._originalRemoveChildren = Element.prototype.removeChildren; 563 WebInspector.View._originalRemoveChildren = Element.prototype.removeChildren;
494 564
495 WebInspector.View._incrementViewCounter = function(parentElement, childElement) 565 WebInspector.View._incrementViewCounter = function(parentElement, childElement)
496 { 566 {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 * @constructor 598 * @constructor
529 * @extends {WebInspector.View} 599 * @extends {WebInspector.View}
530 */ 600 */
531 WebInspector.VBox = function() 601 WebInspector.VBox = function()
532 { 602 {
533 WebInspector.View.call(this); 603 WebInspector.View.call(this);
534 this.element.classList.add("vbox"); 604 this.element.classList.add("vbox");
535 }; 605 };
536 606
537 WebInspector.VBox.prototype = { 607 WebInspector.VBox.prototype = {
608 /**
609 * @return {!Size}
610 */
611 calculateMinimumSize: function()
612 {
613 var width = 0;
614 var height = 0;
615
616 /**
617 * @this {!WebInspector.View}
618 * @suppressReceiverCheck
619 */
620 function updateForChild()
621 {
622 var size = this.minimumSize();
623 width = Math.max(width, size.width);
624 height += size.height;
625 }
626
627 this._callOnVisibleChildren(updateForChild);
628 return new Size(width, height);
629 },
630
538 __proto__: WebInspector.View.prototype 631 __proto__: WebInspector.View.prototype
539 }; 632 };
540 633
541 /** 634 /**
542 * @constructor 635 * @constructor
543 * @extends {WebInspector.View} 636 * @extends {WebInspector.View}
544 */ 637 */
545 WebInspector.HBox = function() 638 WebInspector.HBox = function()
546 { 639 {
547 WebInspector.View.call(this); 640 WebInspector.View.call(this);
548 this.element.classList.add("hbox"); 641 this.element.classList.add("hbox");
549 }; 642 };
550 643
551 WebInspector.HBox.prototype = { 644 WebInspector.HBox.prototype = {
645 /**
646 * @return {!Size}
647 */
648 calculateMinimumSize: function()
649 {
650 var width = 0;
651 var height = 0;
652
653 /**
654 * @this {!WebInspector.View}
655 * @suppressReceiverCheck
656 */
657 function updateForChild()
658 {
659 var size = this.minimumSize();
660 width += size.width;
661 height = Math.max(height, size.height);
662 }
663
664 this._callOnVisibleChildren(updateForChild);
665 return new Size(width, height);
666 },
667
552 __proto__: WebInspector.View.prototype 668 __proto__: WebInspector.View.prototype
553 }; 669 };
554 670
555 /** 671 /**
556 * @constructor 672 * @constructor
557 * @extends {WebInspector.VBox} 673 * @extends {WebInspector.VBox}
558 * @param {function()} resizeCallback 674 * @param {function()} resizeCallback
559 */ 675 */
560 WebInspector.VBoxWithResizeCallback = function(resizeCallback) 676 WebInspector.VBoxWithResizeCallback = function(resizeCallback)
561 { 677 {
(...skipping 27 matching lines...) Expand all
589 { 705 {
590 WebInspector.View._assert(!child.__viewCounter && !child.__view, "Attempt to remove element containing view via regular DOM operation"); 706 WebInspector.View._assert(!child.__viewCounter && !child.__view, "Attempt to remove element containing view via regular DOM operation");
591 return WebInspector.View._originalRemoveChild.call(this, child); 707 return WebInspector.View._originalRemoveChild.call(this, child);
592 } 708 }
593 709
594 Element.prototype.removeChildren = function() 710 Element.prototype.removeChildren = function()
595 { 711 {
596 WebInspector.View._assert(!this.__viewCounter, "Attempt to remove element co ntaining view via regular DOM operation"); 712 WebInspector.View._assert(!this.__viewCounter, "Attempt to remove element co ntaining view via regular DOM operation");
597 WebInspector.View._originalRemoveChildren.call(this); 713 WebInspector.View._originalRemoveChildren.call(this);
598 } 714 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698