15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Apple Inc. All Rights Reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All Rights Reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @extends {WebInspector.Object}
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.View = function()
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
33197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    this.element = document.createElementWithClass("div", "view");
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.element.__view = this;
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._visible = true;
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._isRoot = false;
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._isShowing = false;
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._children = [];
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._hideOnDetach = false;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._cssFiles = [];
41926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._notificationDepth = 0;
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.View._cssFileToVisibleViewCount = {};
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.View._cssFileToStyleElement = {};
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)WebInspector.View._cssUnloadTimeout = 2000;
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.View._buildSourceURL = function(cssFile)
49d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
50d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return "\n/*# sourceURL=" + WebInspector.ParsedURL.completeURL(window.location.href, cssFile) + " */";
51d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
52d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
53323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)/**
54323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * @param {string} cssFile
55323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * @return {!Element}
56323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) */
57d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.View.createStyleElement = function(cssFile)
58d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
59323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    var styleElement = document.createElement("style");
60d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    styleElement.type = "text/css";
61323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    styleElement.textContent = loadResource(cssFile) + WebInspector.View._buildSourceURL(cssFile);
62d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    document.head.insertBefore(styleElement, document.head.firstChild);
63d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return styleElement;
64d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
65d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.View.prototype = {
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    markAsRoot: function()
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
69197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        WebInspector.View.__assert(!this.element.parentElement, "Attempt to mark as root attached node");
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._isRoot = true;
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {?WebInspector.View}
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    parentView: function()
77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._parentView;
79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
8109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
82a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     * @return {!Array.<!WebInspector.View>}
83a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     */
84a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    children: function()
85a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    {
86a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return this._children;
87a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    },
88a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
89a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    /**
9009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
9109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    isShowing: function()
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._isShowing;
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setHideOnDetach: function()
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._hideOnDetach = true;
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
103f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu     * @return {boolean}
104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _inNotification: function()
106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return !!this._notificationDepth || (this._parentView && this._parentView._inNotification());
108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _parentIsShowing: function()
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (this._isRoot)
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return true;
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._parentView && this._parentView.isShowing();
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {function(this:WebInspector.View)} method
119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _callOnVisibleChildren: function(method)
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var copy = this._children.slice();
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var i = 0; i < copy.length; ++i) {
124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (copy[i]._parentView === this && copy[i]._visible)
125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                method.call(copy[i]);
126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _processWillShow: function()
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._loadCSSIfNeeded();
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._callOnVisibleChildren(this._processWillShow);
133fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        this._isShowing = true;
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _processWasShown: function()
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (this._inNotification())
139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.restoreScrollPositions();
141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._notify(this.wasShown);
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._callOnVisibleChildren(this._processWasShown);
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _processWillHide: function()
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (this._inNotification())
148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.storeScrollPositions();
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._callOnVisibleChildren(this._processWillHide);
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._notify(this.willHide);
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._isShowing = false;
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _processWasHidden: function()
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._disableCSSIfNeeded();
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._callOnVisibleChildren(this._processWasHidden);
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _processOnResize: function()
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (this._inNotification())
165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this.isShowing())
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._notify(this.onResize);
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._callOnVisibleChildren(this._processOnResize);
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
173926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {function(this:WebInspector.View)} notification
174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _notify: function(notification)
176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ++this._notificationDepth;
178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        try {
179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            notification.call(this);
180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        } finally {
181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            --this._notificationDepth;
182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
184926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    wasShown: function()
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    willHide: function()
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    onResize: function()
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    onLayout: function()
19807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    {
19907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    },
20007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
202a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {?Element} parentElement
2035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @param {?Element=} insertBefore
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    show: function(parentElement, insertBefore)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
207197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        WebInspector.View.__assert(parentElement, "Attempt to attach view with no parent element");
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Update view hierarchy
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.element.parentElement !== parentElement) {
211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (this.element.parentElement)
212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                this.detach();
213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var currentParent = parentElement;
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            while (currentParent && !currentParent.__view)
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                currentParent = currentParent.parentElement;
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (currentParent) {
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this._parentView = currentParent.__view;
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this._parentView._children.push(this);
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this._isRoot = false;
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else
223197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                WebInspector.View.__assert(this._isRoot, "Attempt to attach view to orphan node");
224a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        } else if (this._visible) {
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
226a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        }
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._visible = true;
229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._parentIsShowing())
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._processWillShow();
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
233a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        this.element.classList.add("visible");
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Reparent
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.element.parentElement !== parentElement) {
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            WebInspector.View._incrementViewCounter(parentElement, this.element);
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (insertBefore)
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                WebInspector.View._originalInsertBefore.call(parentElement, this.element, insertBefore);
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                WebInspector.View._originalAppendChild.call(parentElement, this.element);
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
244f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        if (this._parentIsShowing())
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._processWasShown();
24607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
247aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (this._parentView && this._hasNonZeroConstraints())
248aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            this._parentView.invalidateConstraints();
249f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        else
250f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            this._processOnResize();
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {boolean=} overrideHideOnDetach
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    detach: function(overrideHideOnDetach)
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var parentElement = this.element.parentElement;
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!parentElement)
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
262f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        if (this._parentIsShowing())
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._processWillHide();
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._hideOnDetach && !overrideHideOnDetach) {
266a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            this.element.classList.remove("visible");
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._visible = false;
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (this._parentIsShowing())
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this._processWasHidden();
270aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            if (this._parentView && this._hasNonZeroConstraints())
271aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                this._parentView.invalidateConstraints();
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Force legal removal
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.View._decrementViewCounter(parentElement, this.element);
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.View._originalRemoveChild.call(parentElement, this.element);
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._visible = false;
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._parentIsShowing())
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._processWasHidden();
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Update view hierarchy
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._parentView) {
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var childIndex = this._parentView._children.indexOf(this);
286197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            WebInspector.View.__assert(childIndex >= 0, "Attempt to remove non-child view");
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._parentView._children.splice(childIndex, 1);
28807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            var parent = this._parentView;
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._parentView = null;
290aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            if (this._hasNonZeroConstraints())
291aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                parent.invalidateConstraints();
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else
293197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            WebInspector.View.__assert(this._isRoot, "Removing non-root view from DOM");
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    detachChildViews: function()
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var children = this._children.slice();
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < children.length; ++i)
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            children[i].detach();
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
30409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {!Array.<!Element>}
30509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    elementsToRestoreScrollPositionsFor: function()
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return [this.element];
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    storeScrollPositions: function()
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var elements = this.elementsToRestoreScrollPositionsFor();
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < elements.length; ++i) {
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var container = elements[i];
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            container._scrollTop = container.scrollTop;
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            container._scrollLeft = container.scrollLeft;
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    restoreScrollPositions: function()
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var elements = this.elementsToRestoreScrollPositionsFor();
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < elements.length; ++i) {
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var container = elements[i];
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (container._scrollTop)
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                container.scrollTop = container._scrollTop;
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (container._scrollLeft)
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                container.scrollLeft = container._scrollLeft;
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    doResize: function()
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
33509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!this.isShowing())
33609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return;
33709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // No matter what notification we are in, dispatching onResize is not needed.
33809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!this._inNotification())
33909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            this._callOnVisibleChildren(this._processOnResize);
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    doLayout: function()
34307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    {
34407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        if (!this.isShowing())
34507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            return;
34607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        this._notify(this.onLayout);
34707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        this.doResize();
34807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    },
34907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    registerRequiredCSS: function(cssFile)
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._cssFiles.push(cssFile);
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _loadCSSIfNeeded: function()
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < this._cssFiles.length; ++i) {
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var cssFile = this._cssFiles[i];
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var viewsWithCSSFile = WebInspector.View._cssFileToVisibleViewCount[cssFile];
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            WebInspector.View._cssFileToVisibleViewCount[cssFile] = (viewsWithCSSFile || 0) + 1;
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!viewsWithCSSFile)
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this._doLoadCSS(cssFile);
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _doLoadCSS: function(cssFile)
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var styleElement = WebInspector.View._cssFileToStyleElement[cssFile];
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (styleElement) {
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            styleElement.disabled = false;
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
374d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        styleElement = WebInspector.View.createStyleElement(cssFile);
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.View._cssFileToStyleElement[cssFile] = styleElement;
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _disableCSSIfNeeded: function()
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
38053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        var scheduleUnload = !!WebInspector.View._cssUnloadTimer;
38153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < this._cssFiles.length; ++i) {
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var cssFile = this._cssFiles[i];
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            if (!--WebInspector.View._cssFileToVisibleViewCount[cssFile])
38653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                scheduleUnload = true;
38753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        }
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        function doUnloadCSS()
39053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        {
39153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            delete WebInspector.View._cssUnloadTimer;
39253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
39353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            for (cssFile in WebInspector.View._cssFileToVisibleViewCount) {
394f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu                if (WebInspector.View._cssFileToVisibleViewCount.hasOwnProperty(cssFile) && !WebInspector.View._cssFileToVisibleViewCount[cssFile])
39553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                    WebInspector.View._cssFileToStyleElement[cssFile].disabled = true;
39653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            }
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
399f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        if (scheduleUnload && !WebInspector.View._cssUnloadTimer)
400f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            WebInspector.View._cssUnloadTimer = setTimeout(doUnloadCSS, WebInspector.View._cssUnloadTimeout);
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printViewHierarchy: function()
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var lines = [];
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._collectViewHierarchy("", lines);
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        console.log(lines.join("\n"));
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _collectViewHierarchy: function(prefix, lines)
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        lines.push(prefix + "[" + this.element.className + "]" + (this._children.length ? " {" : ""));
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < this._children.length; ++i)
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._children[i]._collectViewHierarchy(prefix + "    ", lines);
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._children.length)
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            lines.push(prefix + "}");
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
422a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!Element}
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    defaultFocusedElement: function()
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._defaultFocusedElement || this.element;
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
430a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Element} element
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setDefaultFocusedElement: function(element)
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._defaultFocusedElement = element;
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    focus: function()
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var element = this.defaultFocusedElement();
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!element || element.isAncestor(document.activeElement))
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.setCurrentFocusElement(element);
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
447a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     * @return {boolean}
448a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     */
449a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    hasFocus: function()
450a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    {
451a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var activeElement = document.activeElement;
452a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return activeElement && activeElement.isSelfOrDescendant(this.element);
453a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    },
454a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
455a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    /**
456a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!Size}
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    measurePreferredSize: function()
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._loadCSSIfNeeded();
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.View._originalAppendChild.call(document.body, this.element);
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.element.positionAt(0, 0);
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var result = new Size(this.element.offsetWidth, this.element.offsetHeight);
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.element.positionAt(undefined, undefined);
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.View._originalRemoveChild.call(document.body, this.element);
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._disableCSSIfNeeded();
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return result;
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    /**
471aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch     * @return {!Constraints}
47207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch     */
473aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    calculateConstraints: function()
47407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    {
475aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        return new Constraints(new Size(0, 0));
47607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    },
47707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
47807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    /**
479aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch     * @return {!Constraints}
48007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch     */
481aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    constraints: function()
48207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    {
483aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (typeof this._constraints !== "undefined")
484aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            return this._constraints;
485aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (typeof this._cachedConstraints === "undefined")
486aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            this._cachedConstraints = this.calculateConstraints();
487aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        return this._cachedConstraints;
488aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    },
489aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
490aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    /**
491aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch     * @param {number} width
492aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch     * @param {number} height
493aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch     * @param {number} preferredWidth
494aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch     * @param {number} preferredHeight
495aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch     */
496aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    setMinimumAndPreferredSizes: function(width, height, preferredWidth, preferredHeight)
497aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    {
498aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        this._constraints = new Constraints(new Size(width, height), new Size(preferredWidth, preferredHeight));
499aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        this.invalidateConstraints();
50007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    },
50107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
50207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    /**
50307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch     * @param {number} width
50407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch     * @param {number} height
50507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch     */
50607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setMinimumSize: function(width, height)
50707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    {
508aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        this._constraints = new Constraints(new Size(width, height));
509aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        this.invalidateConstraints();
51007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    },
51107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
51207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    /**
51307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch     * @return {boolean}
51407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch     */
515aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    _hasNonZeroConstraints: function()
51607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    {
517aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        var constraints = this.constraints();
518aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        return !!(constraints.minimum.width || constraints.minimum.height || constraints.preferred.width || constraints.preferred.height);
51907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    },
52007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
521aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    invalidateConstraints: function()
52207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    {
523aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        var cached = this._cachedConstraints;
524aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        delete this._cachedConstraints;
525aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        var actual = this.constraints();
52607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        if (!actual.isEqual(cached) && this._parentView)
527aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            this._parentView.invalidateConstraints();
52807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        else
52907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            this.doLayout();
53007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    },
53107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    __proto__: WebInspector.Object.prototype
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.View._originalAppendChild = Element.prototype.appendChild;
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.View._originalInsertBefore = Element.prototype.insertBefore;
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.View._originalRemoveChild = Element.prototype.removeChild;
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.View._originalRemoveChildren = Element.prototype.removeChildren;
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.View._incrementViewCounter = function(parentElement, childElement)
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var count = (childElement.__viewCounter || 0) + (childElement.__view ? 1 : 0);
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!count)
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (parentElement) {
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        parentElement.__viewCounter = (parentElement.__viewCounter || 0) + count;
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        parentElement = parentElement.parentElement;
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.View._decrementViewCounter = function(parentElement, childElement)
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var count = (childElement.__viewCounter || 0) + (childElement.__view ? 1 : 0);
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!count)
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (parentElement) {
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        parentElement.__viewCounter -= count;
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        parentElement = parentElement.parentElement;
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
564197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.View.__assert = function(condition, message)
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!condition) {
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        console.trace();
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        throw new Error(message);
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
572bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)/**
57351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * @constructor
57451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * @extends {WebInspector.View}
57551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) */
576d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.VBox = function()
57751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
57851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    WebInspector.View.call(this);
579d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this.element.classList.add("vbox");
580d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)};
581d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
582d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.VBox.prototype = {
58307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    /**
584aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch     * @return {!Constraints}
58507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch     */
586aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    calculateConstraints: function()
58707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    {
588aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        var constraints = new Constraints(new Size(0, 0));
58907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
59007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        /**
59107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         * @this {!WebInspector.View}
59207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         * @suppressReceiverCheck
59307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         */
59407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        function updateForChild()
59507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        {
596aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            var child = this.constraints();
597aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            constraints = constraints.widthToMax(child);
598aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            constraints = constraints.addHeight(child);
59907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        }
60007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
60107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        this._callOnVisibleChildren(updateForChild);
602aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        return constraints;
60307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    },
60407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
605d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    __proto__: WebInspector.View.prototype
606d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)};
607d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
608d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)/**
609d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @constructor
610d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @extends {WebInspector.View}
611d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) */
612d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.HBox = function()
613d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
614d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebInspector.View.call(this);
615d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this.element.classList.add("hbox");
616d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)};
617d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
618d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.HBox.prototype = {
61907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    /**
620aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch     * @return {!Constraints}
62107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch     */
622aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    calculateConstraints: function()
62307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    {
624aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        var constraints = new Constraints(new Size(0, 0));
62507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
62607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        /**
62707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         * @this {!WebInspector.View}
62807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         * @suppressReceiverCheck
62907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch         */
63007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        function updateForChild()
63107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        {
632aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            var child = this.constraints();
633aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            constraints = constraints.addWidth(child);
634aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            constraints = constraints.heightToMax(child);
63507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        }
63607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
63707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        this._callOnVisibleChildren(updateForChild);
638aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        return constraints;
63907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    },
64007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
641d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    __proto__: WebInspector.View.prototype
642d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)};
643d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
644d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)/**
645d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @constructor
646d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @extends {WebInspector.VBox}
647d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @param {function()} resizeCallback
648d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) */
649d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.VBoxWithResizeCallback = function(resizeCallback)
650d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
651d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebInspector.VBox.call(this);
65251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    this._resizeCallback = resizeCallback;
65351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
65451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
655d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebInspector.VBoxWithResizeCallback.prototype = {
65651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    onResize: function()
65751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
65851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        this._resizeCallback();
65951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    },
66051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
661d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    __proto__: WebInspector.VBox.prototype
66251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
66351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
6645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)/**
6655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * @param {?Node} child
6665d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * @return {?Node}
6675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * @suppress {duplicate}
6685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) */
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.prototype.appendChild = function(child)
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
671197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebInspector.View.__assert(!child.__view || child.parentElement === this, "Attempt to add view via regular DOM operation.");
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebInspector.View._originalAppendChild.call(this, child);
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)/**
6765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * @param {?Node} child
6775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * @param {?Node} anchor
678197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @return {!Node}
6795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * @suppress {duplicate}
6805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) */
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.prototype.insertBefore = function(child, anchor)
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
683197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebInspector.View.__assert(!child.__view || child.parentElement === this, "Attempt to add view via regular DOM operation.");
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebInspector.View._originalInsertBefore.call(this, child, anchor);
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)/**
6885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * @param {?Node} child
689197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @return {!Node}
6905d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * @suppress {duplicate}
6915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) */
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.prototype.removeChild = function(child)
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
694197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebInspector.View.__assert(!child.__viewCounter && !child.__view, "Attempt to remove element containing view via regular DOM operation");
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebInspector.View._originalRemoveChild.call(this, child);
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.prototype.removeChildren = function()
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
700197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebInspector.View.__assert(!this.__viewCounter, "Attempt to remove element containing view via regular DOM operation");
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebInspector.View._originalRemoveChildren.call(this);
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
703