Breaks out ObjectPropertiesSection from PropertiesSidebarPane
[WebKit-https.git] / WebCore / page / inspector / ObjectPropertiesSection.js
1 /*
2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 WebInspector.ObjectPropertiesSection = function(object, title, subtitle)
27 {
28     if (!title) {
29         title = Object.describe(object);
30         if (title.match(/Prototype$/)) {
31             title = title.replace(/Prototype$/, "");
32             if (!subtitle)
33                 subtitle = WebInspector.UIString("Prototype");
34         }
35     }
36
37     this.object = object;
38
39     WebInspector.PropertiesSection.call(this, title, subtitle);
40 }
41
42 WebInspector.ObjectPropertiesSection.prototype = {
43     onpopulate: function()
44     {
45         var properties = Object.sortedProperties(this.object);
46         for (var i = 0; i < properties.length; ++i) {
47             var propertyName = properties[i];
48             if (("hasOwnProperty" in this.object && !this.object.hasOwnProperty(propertyName)) || propertyName === "__treeElementIdentifier")
49                 continue;
50             this.propertiesTreeOutline.appendChild(new WebInspector.ObjectPropertyTreeElement(this.object, propertyName));
51         }
52     }
53 }
54
55 WebInspector.ObjectPropertiesSection.prototype.__proto__ = WebInspector.PropertiesSection.prototype;
56
57 WebInspector.ObjectPropertyTreeElement = function(parentObject, propertyName)
58 {
59     this.parentObject = parentObject;
60     this.propertyName = propertyName;
61
62     var childObject = this.safePropertyValue(parentObject, propertyName);
63     var isGetter = ("__lookupGetter__" in parentObject && parentObject.__lookupGetter__(propertyName));
64
65     var title = "<span class=\"name\">" + propertyName.escapeHTML() + "</span>: ";
66     if (!isGetter)
67         title += "<span class=\"value\">" + Object.describe(childObject, true).escapeHTML() + "</span>";
68     else
69         // FIXME: this should show something like "getter" once we can change localization (bug 16734).
70         title += "<span class=\"value dimmed\">&mdash;</span>";
71
72     var hasSubProperties = false;
73     var type = typeof childObject;
74     if (childObject && (type === "object" || type === "function")) {
75         for (subPropertyName in childObject) {
76             if (subPropertyName === "__treeElementIdentifier")
77                 continue;
78             hasSubProperties = true;
79             break;
80         }
81     }
82
83     TreeElement.call(this, title, null, hasSubProperties);
84 }
85
86 WebInspector.ObjectPropertyTreeElement.prototype = {
87     safePropertyValue: function(object, propertyName)
88     {
89         if ("__lookupGetter__" in object && object.__lookupGetter__(propertyName))
90             return;
91         return object[propertyName];
92     },
93
94     onpopulate: function()
95     {
96         if (this.children.length)
97             return;
98
99         var childObject = this.safePropertyValue(this.parentObject, this.propertyName);
100         var properties = Object.sortedProperties(childObject);
101         for (var i = 0; i < properties.length; ++i) {
102             var propertyName = properties[i];
103             if (propertyName === "__treeElementIdentifier")
104                 continue;
105             this.appendChild(new WebInspector.ObjectPropertyTreeElement(childObject, propertyName));
106         }
107     }
108 }
109
110 WebInspector.ObjectPropertyTreeElement.prototype.__proto__ = TreeElement.prototype;