Index: chrome_frame/tools/test/reference_build/chrome/resources/inspector/WatchExpressionsSidebarPane.js |
=================================================================== |
--- chrome_frame/tools/test/reference_build/chrome/resources/inspector/WatchExpressionsSidebarPane.js (revision 0) |
+++ chrome_frame/tools/test/reference_build/chrome/resources/inspector/WatchExpressionsSidebarPane.js (revision 0) |
@@ -0,0 +1,274 @@ |
+/* |
+ * Copyright (C) IBM Corp. 2009 All rights reserved. |
+ * |
+ * Redistribution and use in source and binary forms, with or without |
+ * modification, are permitted provided that the following conditions are |
+ * met: |
+ * |
+ * * Redistributions of source code must retain the above copyright |
+ * notice, this list of conditions and the following disclaimer. |
+ * * Redistributions in binary form must reproduce the above |
+ * copyright notice, this list of conditions and the following disclaimer |
+ * in the documentation and/or other materials provided with the |
+ * distribution. |
+ * * Neither the name of IBM Corp. nor the names of its |
+ * contributors may be used to endorse or promote products derived from |
+ * this software without specific prior written permission. |
+ * |
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ */ |
+ |
+WebInspector.WatchExpressionsSidebarPane = function() |
+{ |
+ WebInspector.SidebarPane.call(this, WebInspector.UIString("Watch Expressions")); |
+ |
+ this.section = new WebInspector.WatchExpressionsSection(); |
+ |
+ this.bodyElement.appendChild(this.section.element); |
+ |
+ var addElement = document.createElement("button"); |
+ addElement.setAttribute("type", "button"); |
+ addElement.textContent = WebInspector.UIString("Add"); |
+ addElement.addEventListener("click", this.section.addExpression.bind(this.section), false); |
+ |
+ var refreshElement = document.createElement("button"); |
+ refreshElement.setAttribute("type", "button"); |
+ refreshElement.textContent = WebInspector.UIString("Refresh"); |
+ refreshElement.addEventListener("click", this.section.update.bind(this.section), false); |
+ |
+ var centerElement = document.createElement("div"); |
+ centerElement.addStyleClass("watch-expressions-buttons-container"); |
+ centerElement.appendChild(addElement); |
+ centerElement.appendChild(refreshElement); |
+ this.bodyElement.appendChild(centerElement); |
+ |
+ this.expanded = this.section.loadSavedExpressions().length > 0; |
+ this.onexpand = this.refreshExpressions.bind(this); |
+} |
+ |
+WebInspector.WatchExpressionsSidebarPane.prototype = { |
+ refreshExpressions: function() |
+ { |
+ this.section.update(); |
+ } |
+} |
+ |
+WebInspector.WatchExpressionsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype; |
+ |
+WebInspector.WatchExpressionsSection = function() |
+{ |
+ WebInspector.ObjectPropertiesSection.call(this); |
+ |
+ this.watchExpressions = this.loadSavedExpressions(); |
+ |
+ this.headerElement.className = "hidden"; |
+ this.editable = true; |
+ this.expanded = true; |
+ this.propertiesElement.addStyleClass("watch-expressions"); |
+} |
+ |
+WebInspector.WatchExpressionsSection.NewWatchExpression = "\xA0"; |
+ |
+WebInspector.WatchExpressionsSection.prototype = { |
+ update: function() |
+ { |
+ function appendResult(expression, watchIndex, result, exception) |
+ { |
+ // The null check catches some other cases, like null itself, and NaN |
+ if ((typeof result !== "object") || (result == null)) |
+ result = new WebInspector.ObjectProxy(null, [], 0, String(result), false); |
+ |
+ var property = new WebInspector.ObjectPropertyProxy(expression, result); |
+ property.watchIndex = watchIndex; |
+ |
+ // For newly added, empty expressions, set description to "", |
+ // since otherwise you get DOMWindow |
+ if (property.name === WebInspector.WatchExpressionsSection.NewWatchExpression) |
+ property.value.description = ""; |
+ |
+ // To clarify what's going on here: |
+ // In the outer function, we calculate the number of properties |
+ // that we're going to be updating, and set that in the |
+ // propertyCount variable. |
+ // In this function, we test to see when we are processing the |
+ // last property, and then call the superclass's updateProperties() |
+ // method to get all the properties refreshed at once. |
+ properties.push(property); |
+ |
+ if (properties.length == propertyCount) |
+ this.updateProperties(properties, WebInspector.WatchExpressionTreeElement, WebInspector.WatchExpressionsSection.CompareProperties); |
+ } |
+ |
+ var properties = []; |
+ |
+ // Count the properties, so we known when to call this.updateProperties() |
+ // in appendResult() |
+ var propertyCount = 0; |
+ for (var i = 0; i < this.watchExpressions.length; ++i) { |
+ if (!this.watchExpressions[i]) |
+ continue; |
+ ++propertyCount; |
+ } |
+ |
+ // Now process all the expressions, since we have the actual count, |
+ // which is checked in the appendResult inner function. |
+ for (var i = 0; i < this.watchExpressions.length; ++i) { |
+ var expression = this.watchExpressions[i]; |
+ if (!expression) |
+ continue; |
+ |
+ WebInspector.console.evalInInspectedWindow("(" + expression + ")", appendResult.bind(this, expression, i)); |
+ } |
+ |
+ // note this is setting the expansion of the tree, not the section; |
+ // with no expressions, and expanded tree, we get some extra vertical |
+ // white space |
+ // FIXME: should change to use header buttons instead of the buttons |
+ // at the bottom of the section, then we can add a "No Watch Expressions |
+ // element when there are no watch expressions, and this issue should |
+ // go away. |
+ this.expanded = (propertyCount != 0); |
+ }, |
+ |
+ addExpression: function() |
+ { |
+ this.watchExpressions.push(WebInspector.WatchExpressionsSection.NewWatchExpression); |
+ this.update(); |
+ |
+ // After update(), the new empty expression to be edited |
+ // will be in the tree, but we have to find it. |
+ treeElement = this.findAddedTreeElement(); |
+ if (treeElement) |
+ treeElement.startEditing(); |
+ }, |
+ |
+ updateExpression: function(element, value) |
+ { |
+ this.watchExpressions[element.property.watchIndex] = value; |
+ this.saveExpressions(); |
+ this.update(); |
+ }, |
+ |
+ findAddedTreeElement: function() |
+ { |
+ var children = this.propertiesTreeOutline.children; |
+ for (var i = 0; i < children.length; ++i) |
+ if (children[i].property.name === WebInspector.WatchExpressionsSection.NewWatchExpression) |
+ return children[i]; |
+ }, |
+ |
+ loadSavedExpressions: function() |
+ { |
+ var json = InspectorController.setting("watchExpressions"); |
+ if (!json) |
+ return []; |
+ |
+ try { |
+ json = JSON.parse(json); |
+ } catch(e) { |
+ return []; |
+ } |
+ |
+ return json.expressions || []; |
+ }, |
+ |
+ saveExpressions: function() |
+ { |
+ var toSave = []; |
+ for (var i = 0; i < this.watchExpressions.length; i++) |
+ if (this.watchExpressions[i]) |
+ toSave.push(this.watchExpressions[i]); |
+ |
+ var json = JSON.stringify({expressions: toSave}); |
+ InspectorController.setSetting("watchExpressions", json); |
+ |
+ return toSave.length; |
+ } |
+} |
+ |
+WebInspector.WatchExpressionsSection.prototype.__proto__ = WebInspector.ObjectPropertiesSection.prototype; |
+ |
+WebInspector.WatchExpressionsSection.CompareProperties = function(propertyA, propertyB) |
+{ |
+ if (propertyA.watchIndex == propertyB.watchIndex) |
+ return 0; |
+ else if (propertyA.watchIndex < propertyB.watchIndex) |
+ return -1; |
+ else |
+ return 1; |
+} |
+ |
+WebInspector.WatchExpressionTreeElement = function(property) |
+{ |
+ WebInspector.ObjectPropertyTreeElement.call(this, property); |
+} |
+ |
+WebInspector.WatchExpressionTreeElement.prototype = { |
+ update: function() |
+ { |
+ WebInspector.ObjectPropertyTreeElement.prototype.update.call(this); |
+ |
+ var deleteButton = document.createElement("input"); |
+ deleteButton.type = "button"; |
+ deleteButton.title = WebInspector.UIString("Delete watch expression."); |
+ deleteButton.addStyleClass("enabled-button"); |
+ deleteButton.addStyleClass("delete-button"); |
+ deleteButton.addEventListener("click", this._deleteButtonClicked.bind(this), false); |
+ |
+ this.listItemElement.insertBefore(deleteButton, this.listItemElement.firstChild); |
+ }, |
+ |
+ _deleteButtonClicked: function() |
+ { |
+ this.treeOutline.section.updateExpression(this, null); |
+ }, |
+ |
+ startEditing: function() |
+ { |
+ if (WebInspector.isBeingEdited(this.nameElement) || !this.treeOutline.section.editable) |
+ return; |
+ |
+ this.nameElement.textContent = this.property.name.trimWhitespace(); |
+ |
+ var context = { expanded: this.expanded }; |
+ |
+ // collapse temporarily, if required |
+ this.hasChildren = false; |
+ |
+ this.listItemElement.addStyleClass("editing-sub-part"); |
+ |
+ WebInspector.startEditing(this.nameElement, this.editingCommitted.bind(this), this.editingCancelled.bind(this), context); |
+ }, |
+ |
+ editingCancelled: function(element, context) |
+ { |
+ if (!this.nameElement.textContent) |
+ this.treeOutline.section.updateExpression(this, null); |
+ |
+ this.update(); |
+ this.editingEnded(context); |
+ }, |
+ |
+ applyExpression: function(expression, updateInterface) |
+ { |
+ expression = expression.trimWhitespace(); |
+ |
+ if (!expression) |
+ expression = null; |
+ |
+ this.property.name = expression; |
+ this.treeOutline.section.updateExpression(this, expression); |
+ } |
+} |
+ |
+WebInspector.WatchExpressionTreeElement.prototype.__proto__ = WebInspector.ObjectPropertyTreeElement.prototype; |