1231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block/*
2231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Copyright (C) IBM Corp. 2009  All rights reserved.
3231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *
4231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Redistribution and use in source and binary forms, with or without
5231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * modification, are permitted provided that the following conditions are
6231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * met:
7231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *
8231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *     * Redistributions of source code must retain the above copyright
9231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * notice, this list of conditions and the following disclaimer.
10231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *     * Redistributions in binary form must reproduce the above
11231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * copyright notice, this list of conditions and the following disclaimer
12231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * in the documentation and/or other materials provided with the
13231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * distribution.
14231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *     * Neither the name of IBM Corp. nor the names of its
15231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * contributors may be used to endorse or promote products derived from
16231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * this software without specific prior written permission.
17231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *
18231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block */
30231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
31231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockWebInspector.WatchExpressionsSidebarPane = function()
32231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
33231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    WebInspector.SidebarPane.call(this, WebInspector.UIString("Watch Expressions"));
34e14391e94c850b8bd03680c23b38978db68687a8John Reck    this.reset();
35d0825bca7fe65beaee391d30da42e937db621564Steve Block}
36231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
37d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebInspector.WatchExpressionsSidebarPane.prototype = {
38e14391e94c850b8bd03680c23b38978db68687a8John Reck    reset: function()
39d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
40d0825bca7fe65beaee391d30da42e937db621564Steve Block        this.bodyElement.removeChildren();
41231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
4228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        this.expanded = WebInspector.settings.watchExpressions.length > 0;
43d0825bca7fe65beaee391d30da42e937db621564Steve Block        this.section = new WebInspector.WatchExpressionsSection();
44d0825bca7fe65beaee391d30da42e937db621564Steve Block        this.bodyElement.appendChild(this.section.element);
45231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
46d0825bca7fe65beaee391d30da42e937db621564Steve Block        var addElement = document.createElement("button");
47d0825bca7fe65beaee391d30da42e937db621564Steve Block        addElement.setAttribute("type", "button");
48d0825bca7fe65beaee391d30da42e937db621564Steve Block        addElement.textContent = WebInspector.UIString("Add");
49d0825bca7fe65beaee391d30da42e937db621564Steve Block        addElement.addEventListener("click", this.section.addExpression.bind(this.section), false);
50231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
51d0825bca7fe65beaee391d30da42e937db621564Steve Block        var refreshElement = document.createElement("button");
52d0825bca7fe65beaee391d30da42e937db621564Steve Block        refreshElement.setAttribute("type", "button");
53d0825bca7fe65beaee391d30da42e937db621564Steve Block        refreshElement.textContent = WebInspector.UIString("Refresh");
54d0825bca7fe65beaee391d30da42e937db621564Steve Block        refreshElement.addEventListener("click", this.section.update.bind(this.section), false);
55231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
56d0825bca7fe65beaee391d30da42e937db621564Steve Block        var centerElement = document.createElement("div");
57d0825bca7fe65beaee391d30da42e937db621564Steve Block        centerElement.addStyleClass("watch-expressions-buttons-container");
58d0825bca7fe65beaee391d30da42e937db621564Steve Block        centerElement.appendChild(addElement);
59d0825bca7fe65beaee391d30da42e937db621564Steve Block        centerElement.appendChild(refreshElement);
60d0825bca7fe65beaee391d30da42e937db621564Steve Block        this.bodyElement.appendChild(centerElement);
61231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
62d0825bca7fe65beaee391d30da42e937db621564Steve Block        this.onexpand = this.refreshExpressions.bind(this);
63d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
64231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
65231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    refreshExpressions: function()
66231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    {
67d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (this.section)
68d0825bca7fe65beaee391d30da42e937db621564Steve Block            this.section.update();
69231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
70231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
71231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
72231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockWebInspector.WatchExpressionsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
73231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
74231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockWebInspector.WatchExpressionsSection = function()
75231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
76643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    this._watchObjectGroupId = "watch-group";
77643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
78231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    WebInspector.ObjectPropertiesSection.call(this);
79231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
8028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    this.watchExpressions = WebInspector.settings.watchExpressions;
81231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
82231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    this.headerElement.className = "hidden";
83231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    this.editable = true;
84231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    this.expanded = true;
85231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    this.propertiesElement.addStyleClass("watch-expressions");
86231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
87231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
88231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockWebInspector.WatchExpressionsSection.NewWatchExpression = "\xA0";
89231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
90231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockWebInspector.WatchExpressionsSection.prototype = {
91231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    update: function()
92231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    {
93f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        function appendResult(expression, watchIndex, result)
94231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        {
95f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            var property = new WebInspector.RemoteObjectProperty(expression, result);
96231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            property.watchIndex = watchIndex;
97231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
98231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            // To clarify what's going on here:
99231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            // In the outer function, we calculate the number of properties
100231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            // that we're going to be updating, and set that in the
101231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            // propertyCount variable.
102231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            // In this function, we test to see when we are processing the
103231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            // last property, and then call the superclass's updateProperties()
104231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            // method to get all the properties refreshed at once.
105231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            properties.push(property);
1062bde8e466a4451c7319e3a072d118917957d6554Steve Block
107643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (properties.length == propertyCount) {
108231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                this.updateProperties(properties, WebInspector.WatchExpressionTreeElement, WebInspector.WatchExpressionsSection.CompareProperties);
109643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
110643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                // check to see if we just added a new watch expression,
111643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                // which will always be the last property
112643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                if (this._newExpressionAdded) {
113643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    delete this._newExpressionAdded;
114643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
115643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    treeElement = this.findAddedTreeElement();
116643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    if (treeElement)
117643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                        treeElement.startEditing();
118643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                }
119643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            }
120231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
121231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
122d0825bca7fe65beaee391d30da42e937db621564Steve Block        // TODO: pass exact injected script id.
1232bde8e466a4451c7319e3a072d118917957d6554Steve Block        RuntimeAgent.releaseObjectGroup(this._watchObjectGroupId)
124231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        var properties = [];
125231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
126231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // Count the properties, so we known when to call this.updateProperties()
127231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // in appendResult()
128231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        var propertyCount = 0;
129231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        for (var i = 0; i < this.watchExpressions.length; ++i) {
130231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (!this.watchExpressions[i])
131231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                continue;
132231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            ++propertyCount;
133231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
134231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
135231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // Now process all the expressions, since we have the actual count,
136231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // which is checked in the appendResult inner function.
137231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        for (var i = 0; i < this.watchExpressions.length; ++i) {
138231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            var expression = this.watchExpressions[i];
139231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (!expression)
140231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                continue;
141231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            WebInspector.console.evalInInspectedWindow("(" + expression + ")", this._watchObjectGroupId, false, appendResult.bind(this, expression, i));
143231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
144231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
145231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // note this is setting the expansion of the tree, not the section;
146231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // with no expressions, and expanded tree, we get some extra vertical
147231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // white space
148231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // FIXME: should change to use header buttons instead of the buttons
149231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // at the bottom of the section, then we can add a "No Watch Expressions
150231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // element when there are no watch expressions, and this issue should
151231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // go away.
152231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        this.expanded = (propertyCount != 0);
153231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    },
154231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
155231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    addExpression: function()
156231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    {
157643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        this._newExpressionAdded = true;
158231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        this.watchExpressions.push(WebInspector.WatchExpressionsSection.NewWatchExpression);
159231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        this.update();
160231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    },
161231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
162231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    updateExpression: function(element, value)
163231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    {
164231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        this.watchExpressions[element.property.watchIndex] = value;
165231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        this.saveExpressions();
166231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        this.update();
167231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    },
168231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
169231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    findAddedTreeElement: function()
170231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    {
171231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        var children = this.propertiesTreeOutline.children;
172231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        for (var i = 0; i < children.length; ++i)
173231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (children[i].property.name === WebInspector.WatchExpressionsSection.NewWatchExpression)
174231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                return children[i];
175231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    },
176231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
177231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    saveExpressions: function()
178231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    {
179231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        var toSave = [];
180231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        for (var i = 0; i < this.watchExpressions.length; i++)
181231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (this.watchExpressions[i])
182231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                toSave.push(this.watchExpressions[i]);
183231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
18428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        WebInspector.settings.watchExpressions = toSave;
185231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return toSave.length;
186231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
187231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
188231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
189231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockWebInspector.WatchExpressionsSection.prototype.__proto__ = WebInspector.ObjectPropertiesSection.prototype;
190231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
191231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockWebInspector.WatchExpressionsSection.CompareProperties = function(propertyA, propertyB)
192231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
193231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (propertyA.watchIndex == propertyB.watchIndex)
194231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return 0;
195231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    else if (propertyA.watchIndex < propertyB.watchIndex)
196231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return -1;
197231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    else
198231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return 1;
199231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
200231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
201231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockWebInspector.WatchExpressionTreeElement = function(property)
202231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
203231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    WebInspector.ObjectPropertyTreeElement.call(this, property);
204231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
205231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
206231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockWebInspector.WatchExpressionTreeElement.prototype = {
207231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    update: function()
208231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    {
209231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        WebInspector.ObjectPropertyTreeElement.prototype.update.call(this);
210231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
211f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (this.property.value.isError())
212231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            this.valueElement.addStyleClass("watch-expressions-error-level");
213231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
214231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        var deleteButton = document.createElement("input");
215231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        deleteButton.type = "button";
216231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        deleteButton.title = WebInspector.UIString("Delete watch expression.");
217231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        deleteButton.addStyleClass("enabled-button");
218231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        deleteButton.addStyleClass("delete-button");
219231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        deleteButton.addEventListener("click", this._deleteButtonClicked.bind(this), false);
220231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
221231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        this.listItemElement.insertBefore(deleteButton, this.listItemElement.firstChild);
222231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    },
223231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
224231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    _deleteButtonClicked: function()
225231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    {
226231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        this.treeOutline.section.updateExpression(this, null);
227231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    },
228231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
229231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    startEditing: function()
230231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    {
231231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (WebInspector.isBeingEdited(this.nameElement) || !this.treeOutline.section.editable)
232231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return;
233231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
234d0825bca7fe65beaee391d30da42e937db621564Steve Block        this.nameElement.textContent = this.property.name.trim();
235231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
236231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        var context = { expanded: this.expanded };
237231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
238231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // collapse temporarily, if required
239231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        this.hasChildren = false;
240231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
241231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        this.listItemElement.addStyleClass("editing-sub-part");
242231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
243f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        WebInspector.startEditing(this.nameElement, {
244f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            context: context,
245f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            commitHandler: this.editingCommitted.bind(this),
246f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            cancelHandler: this.editingCancelled.bind(this)
247f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        });
248231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    },
249231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
250231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    editingCancelled: function(element, context)
251231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    {
252231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (!this.nameElement.textContent)
253231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            this.treeOutline.section.updateExpression(this, null);
254231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
255231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        this.update();
256231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        this.editingEnded(context);
257231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    },
258231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
259231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    applyExpression: function(expression, updateInterface)
260231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    {
261d0825bca7fe65beaee391d30da42e937db621564Steve Block        expression = expression.trim();
262231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
263231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (!expression)
264231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            expression = null;
265231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
266231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        this.property.name = expression;
267231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        this.treeOutline.section.updateExpression(this, expression);
268231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
269231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
270231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
271231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockWebInspector.WatchExpressionTreeElement.prototype.__proto__ = WebInspector.ObjectPropertyTreeElement.prototype;
272