Index: jar.mn
===================================================================
RCS file: extensions/inspector/jar.mn,v
retrieving revision 1.6
diff -u -r1.6 jar.mn
--- extensions/inspector/jar.mn 15 May 2003 15:11:56 -0000 1.6
+++ extensions/inspector/jar.mn 20 Jun 2003 19:27:06 -0000
@@ -72,16 +72,22 @@
content/inspector/viewers/dom/pseudoClassDialog.js (resources/content/viewers/dom/pseudoClassDialog.js)
content/inspector/viewers/dom/pseudoClassDialog.xul (resources/content/viewers/dom/pseudoClassDialog.xul)
content/inspector/viewers/boxModel/boxModel.js (resources/content/viewers/boxModel/boxModel.js)
content/inspector/viewers/boxModel/boxModel.xul (resources/content/viewers/boxModel/boxModel.xul)
content/inspector/viewers/boxModel/colorPicker.xul (resources/content/viewers/boxModel/colorPicker.xul)
content/inspector/viewers/jsObject/jsObject.js (resources/content/viewers/jsObject/jsObject.js)
content/inspector/viewers/jsObject/jsObject.xul (resources/content/viewers/jsObject/jsObject.xul)
- content/inspector/viewers/jsObject/evalExprDialog.js (resources/content/viewers/jsObject/evalExprDialog.js)
- content/inspector/viewers/jsObject/evalExprDialog.xul (resources/content/viewers/jsObject/evalExprDialog.xul)
+ content/inspector/viewers/jsObject/addPropertyDialog.js (resources/content/viewers/jsObject/addPropertyDialog.js)
+ content/inspector/viewers/jsObject/addPropertyDialog.xul (resources/content/viewers/jsObject/addPropertyDialog.xul)
+ content/inspector/viewers/jsObject/assignMatchDialog.xul (resources/content/viewers/jsObject/assignMatchDialog.xul)
+ content/inspector/viewers/jsObject/assignMatchDialog.js (resources/content/viewers/jsObject/assignMatchDialog.js)
+ content/inspector/viewers/jsObject/methodExecuteDialog.xul (resources/content/viewers/jsObject/methodExecuteDialog.xul)
+ content/inspector/viewers/jsObject/methodExecuteDialog.js (resources/content/viewers/jsObject/methodExecuteDialog.js)
+ content/inspector/viewers/jsObject/showPropertyDialog.js (resources/content/viewers/jsObject/showPropertyDialog.js)
+ content/inspector/viewers/jsObject/showPropertyDialog.xul (resources/content/viewers/jsObject/showPropertyDialog.xul)
content/inspector/viewers/domNode/domNode.js (resources/content/viewers/domNode/domNode.js)
content/inspector/viewers/domNode/domNode.xul (resources/content/viewers/domNode/domNode.xul)
content/inspector/viewers/styleRules/commandOverlay.xul (resources/content/viewers/styleRules/commandOverlay.xul)
content/inspector/viewers/styleRules/keysetOverlay.xul (resources/content/viewers/styleRules/keysetOverlay.xul)
content/inspector/viewers/styleRules/popupOverlay.xul (resources/content/viewers/styleRules/popupOverlay.xul)
content/inspector/viewers/styleRules/styleRules.js (resources/content/viewers/styleRules/styleRules.js)
content/inspector/viewers/styleRules/styleRules.xul (resources/content/viewers/styleRules/styleRules.xul)
@@ -100,14 +106,15 @@
locale/en-US/inspector/viewers/domNode.dtd (resources/locale/en-US/viewers/domNode.dtd)
locale/en-US/inspector/viewers/styleRules.dtd (resources/locale/en-US/viewers/styleRules.dtd)
locale/en-US/inspector/viewers/stylesheets.dtd (resources/locale/en-US/viewers/stylesheets.dtd)
locale/en-US/inspector/viewers/xblBindings.dtd (resources/locale/en-US/viewers/xblBindings.dtd)
locale/en-US/inspector/viewers/boxModel.dtd (resources/locale/en-US/viewers/boxModel.dtd)
locale/en-US/inspector/viewers/computedStyle.dtd (resources/locale/en-US/viewers/computedStyle.dtd)
locale/en-US/inspector/viewers/jsObject.dtd (resources/locale/en-US/viewers/jsObject.dtd)
+ locale/en-US/inspector/viewers/dialogs.dtd (resources/locale/en-US/viewers/dialogs.dtd)
locale/en-US/inspector/inspector.properties (resources/locale/en-US/inspector.properties)
skin/classic/inspector/contents.rdf (resources/skin/classic/contents.rdf)
skin/classic/inspector/btnFind.gif (resources/skin/classic/btnFind.gif)
skin/classic/inspector/btnFind-dis.gif (resources/skin/classic/btnFind-dis.gif)
skin/classic/inspector/btnSelecting.gif (resources/skin/classic/btnSelecting.gif)
skin/classic/inspector/btnSelecting-act.gif (resources/skin/classic/btnSelecting-act.gif)
skin/classic/inspector/btnSelecting-dis.gif (resources/skin/classic/btnSelecting-dis.gif)
Index: extensions/inspector/resources/locale/en-US/viewers/dialogs.dtd
===================================================================
RCS file: extensions/inspector/resources/locale/en-US/viewers/dialogs.dtd
diff -N extensions/inspector/resources/locale/en-US/viewers/dialogs.dtd
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ extensions/inspector/resources/locale/en-US/viewers/dialogs.dtd 20 Jun 2003 18:45:56 -0000
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
Index: extensions/inspector/resources/content/viewers/jsObject/addPropertyDialog.js
===================================================================
RCS file: extensions/inspector/resources/content/viewers/jsObject/addPropertyDialog.js
diff -N extensions/inspector/resources/content/viewers/jsObject/addPropertyDialog.js
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ extensions/inspector/resources/content/viewers/jsObject/addPropertyDialog.js 20 Jun 2003 18:45:56 -0000
@@ -0,0 +1,15 @@
+function addProperty() {
+ if (propertyField.value != "") {
+ try {
+ var target = aObject;
+ var literalValue = eval(document.getElementById("literalValue").value);
+ treeItem.inspectedObject[propertyField.value] = literalValue;
+ showProperty();
+ }
+ catch (e) {
+ var err = "Couldn't set value:\nerror:\n" + e.message + "\nreference = '";
+ err += propertyField.value + "'\nvalue:\n" + literalValue;
+ opener.viewer.expandedValue.value = err;
+ }
+ }
+}
Index: extensions/inspector/resources/content/viewers/jsObject/addPropertyDialog.xul
===================================================================
RCS file: extensions/inspector/resources/content/viewers/jsObject/addPropertyDialog.xul
diff -N extensions/inspector/resources/content/viewers/jsObject/addPropertyDialog.xul
--- /dev/null Fri Jan 11 11:14:28 2002
+++ extensions/inspector/resources/content/viewers/jsObject/addPropertyDialog.xul 20 Jun 2003 18:45:56 -0000
@@ -0,0 +1,18 @@
+
+
+ %dtd1;
+ %dtd2;
+ %dtd3;
+]>
+
Index: extensions/inspector/resources/content/viewers/jsObject/assignMatchDialog.js
===================================================================
RCS file: extensions/inspector/resources/content/viewers/jsObject/assignMatchDialog.js
diff -N extensions/inspector/resources/content/viewers/jsObject/assignMatchDialog.js
--- /dev/null Fri Jan 11 11:14:28 2002
+++ extensions/inspector/resources/content/viewers/jsObject/assignMatchDialog.js 20 Jun 2003 18:45:56 -0000
@@ -0,0 +1,15 @@
+const treeItem = arguments[0];
+const match = document.getElementById("match");
+
+function assignMatch() {
+ if (match.value != "") {
+ try {
+ var prefix = opener.viewer.objectTree.lastChild.lastChild;
+ eval("prefix.inspectedObject." + match.value + " = treeItem.inspectedObject;");
+ treeItem.firstChild.childNodes[1].setAttribute("label", prefix.objectName + "." + match.value);
+ }
+ catch (e) {
+ opener.viewer.expandedValue.value = "Couldn't set reference to selected row's object matching value:\n" + match.value;
+ }
+ }
+}
Index: extensions/inspector/resources/content/viewers/jsObject/assignMatchDialog.xul
===================================================================
RCS file: extensions/inspector/resources/content/viewers/jsObject/assignMatchDialog.xul
diff -N extensions/inspector/resources/content/viewers/jsObject/assignMatchDialog.xul
--- /dev/null Fri Jan 11 11:14:28 2002
+++ extensions/inspector/resources/content/viewers/jsObject/assignMatchDialog.xul 20 Jun 2003 18:45:56 -0000
@@ -0,0 +1,15 @@
+
+
+ %dtd1;
+ %dtd2;
+ %dtd3;
+]>
+
Index: extensions/inspector/resources/content/viewers/jsObject/methodExecuteDialog.js
===================================================================
RCS file: extensions/inspector/resources/content/viewers/jsObject/methodExecuteDialog.js
diff -N extensions/inspector/resources/content/viewers/jsObject/methodExecuteDialog.js
--- /dev/null Fri Jan 11 11:14:28 2002
+++ extensions/inspector/resources/content/viewers/jsObject/methodExecuteDialog.js 20 Jun 2003 18:45:56 -0000
@@ -0,0 +1,104 @@
+const thisArg = arguments[0], func = arguments[1], treeItem = arguments[2];
+const hbox = document.getElementsByTagName("hbox")[0], vbox = hbox.previousSibling, button = hbox.nextSibling;
+const match = document.getElementById("match");
+var rowCount = 0;
+
+function getTextBox(rowIndex) {
+ return vbox.childNodes[rowIndex].childNodes[1];
+}
+
+function addRow() {
+ var row = hbox.cloneNode(true);
+ vbox.insertBefore(row, vbox.lastChild);
+ row.firstChild.appendChild(document.createTextNode("Argument " + rowCount));
+ row.childNodes[1].focus();
+ row.index = rowCount;
+ rowCount++;
+}
+
+function removeRow(row) {
+ rowCount--;
+ for (var k = row.index; k < rowCount; k++) {
+ getTextBox(k).value = getTextBox(k + 1).value;
+ }
+ vbox.removeChild(vbox.childNodes[rowCount]);
+}
+
+function argumentSet(args, returnValue) {
+ this.returnValue = returnValue;
+ for (var i = 0; i < args.length; i++) {
+ this[i] = args[i];
+ }
+}
+argumentSet.prototype.toString = function() {
+ return "[object argumentSet]";
+}
+
+function executeMethod() {
+ var args = [];
+ for (var k = 0; k < rowCount; k++) {
+ args[args.length] = eval(getTextBox(k).value);
+ }
+ var response = func.apply(thisArg, args);
+ var argSet = new argumentSet(args, response);
+ var objectName = argSet.toString();
+ var newTreeItem = opener.viewer.getTreeItem(argSet, argSet.toString());
+ if (match.value != "") {
+ try {
+ var prefix = opener.viewer.objectTree.lastChild.firstChild;
+ eval("prefix.inspectedObject." + match.value + " = response;");
+ opener.viewer.addProperties(newTreeItem);
+ newTreeItem.setAttribute("open", "true");
+ newTreeItem.lastChild.lastChild.firstChild.childNodes[1].setAttribute("label", prefix.objectName + "." + match.value);
+ }
+ catch (e) {
+ opener.viewer.expandedValue.value = "Couldn't set reference to argumentSet matching value:\n" + match.value;
+ }
+ }
+
+ if (treeItem.getAttribute("container") != "true") {
+ treeItem.setAttribute("container", "true");
+ treeItem.appendChild(document.createElement("treechildren"));
+ }
+ if (treeItem.lastChild.childNodes.length == 0) {
+ opener.viewer.addProperties(treeItem);
+ }
+
+ newTreeItem.origSortOrder = treeItem.childPropItems.length;
+ treeItem.childPropItems[newTreeItem.origSortOrder] = newTreeItem;
+ if (opener.viewer.sortOption.checked) {
+ var childItemIndex = 0, childItems = treeItem.lastChild.childNodes
+ while ((childItemIndex < childItems.length)
+ &&(objectName > childItems[childItemIndex].firstChild.firstChild.getAttribute("label"))) {
+ childItemIndex++;
+ }
+
+ if (childItemIndex < childItems.length) {
+ var nextSibling = treeItem.lastChild.childNodes[childItemIndex];
+ } else {
+ treeItem.lastChild.appendChild(newTreeItem);
+ treeItem.setAttribute("open", true);
+ return true;
+ }
+ }
+ treeItem.listedProps[objectName] = true;
+ if (opener.viewer.sortOption.checked) {
+ treeItem.lastChild.insertBefore(newTreeItem, nextSibling);
+ } else {
+ treeItem.lastChild.appendChild(newTreeItem);
+ }
+
+ opener.viewer.checkParentObjects(newTreeItem);
+
+ treeItem.setAttribute("open", true);
+ return true;
+}
+
+function init() {
+ for (var k = 0; k < func.length; k++) {
+ addRow();
+ }
+ hbox.appendChild(button);
+}
+
+window.addEventListener("load", init, true);
Index: extensions/inspector/resources/content/viewers/jsObject/methodExecuteDialog.xul
===================================================================
RCS file: extensions/inspector/resources/content/viewers/jsObject/methodExecuteDialog.xul
diff -N extensions/inspector/resources/content/viewers/jsObject/methodExecuteDialog.xul
--- /dev/null Fri Jan 11 11:14:28 2002
+++ extensions/inspector/resources/content/viewers/jsObject/methodExecuteDialog.xul 20 Jun 2003 18:45:56 -0000
@@ -0,0 +1,26 @@
+
+
+ %dtd1;
+ %dtd2;
+ %dtd3;
+]>
+
Index: extensions/inspector/resources/content/viewers/jsObject/showPropertyDialog.js
===================================================================
RCS file: extensions/inspector/resources/content/viewers/jsObject/showPropertyDialog.js
diff -N extensions/inspector/resources/content/viewers/jsObject/showPropertyDialog.js
--- /dev/null Fri Jan 11 11:14:28 2002
+++ extensions/inspector/resources/content/viewers/jsObject/showPropertyDialog.js 20 Jun 2003 18:45:56 -0000
@@ -0,0 +1,68 @@
+const treeItem = arguments[0];
+const aObject = treeItem.inspectedObject;
+const viewer = opener.viewer;
+const propertyField = document.getElementById("property");
+
+function showProperty() {
+ if (propertyField.value != "") {
+ if (treeItem.getAttribute("container") != "true") {
+ treeItem.setAttribute("container", "true");
+ treeItem.appendChild(document.createElement("treechildren"))
+ }
+
+ if (treeItem.lastChild.childNodes.length == 0) {
+ viewer.addProperties(treeItem);
+ }
+
+ var objectName = propertyField.value;
+ if (typeof treeItem.listedProps[objectName] != "undefined") {
+ viewer.expandedValue.value = objectName + " property already in list.";
+ return false;
+ }
+
+ if (typeof treeItem.inspectedObject[objectName] != "undefined") {
+ var aObject = treeItem.inspectedObject[objectName];
+ } else {
+ aObject = undefined;
+ }
+
+ try {
+ var newItem = viewer.getTreeItem(aObject, objectName);
+ }
+ catch (e) {
+ viewer.expandedValue.value = "Failed to retrieve for " + objectName;
+ }
+
+ newItem.origSortOrder = treeItem.childPropItems.length;
+ treeItem.childPropItems[newItem.origSortOrder] = newItem;
+
+ if (viewer.sortOption.checked) {
+ var childItemIndex = 0, childItems = treeItem.lastChild.childNodes
+ while ((childItemIndex < childItems.length)
+ &&(objectName > childItems[childItemIndex].firstChild.firstChild.getAttribute("label"))) {
+ childItemIndex++;
+ }
+
+ if (childItemIndex < childItems.length) {
+ var nextSibling = treeItem.lastChild.childNodes[childItemIndex];
+ } else {
+ treeItem.lastChild.appendChild(newItem);
+ treeItem.setAttribute("open", true);
+ return true;
+ }
+ }
+
+ treeItem.listedProps[objectName] = true;
+ if (viewer.sortOption.checked) {
+ treeItem.lastChild.insertBefore(newItem, nextSibling);
+ } else {
+ treeItem.lastChild.appendChild(newItem);
+ }
+
+ viewer.checkParentObjects(newItem);
+
+ treeItem.setAttribute("open", true);
+ return true;
+ }
+ return false;
+}
Index: extensions/inspector/resources/content/viewers/jsObject/showPropertyDialog.xul
===================================================================
RCS file: extensions/inspector/resources/content/viewers/jsObject/showPropertyDialog.xul
diff -N extensions/inspector/resources/content/viewers/jsObject/showPropertyDialog.xul
--- /dev/null Fri Jan 11 11:14:28 2002
+++ extensions/inspector/resources/content/viewers/jsObject/showPropertyDialog.xul 20 Jun 2003 18:45:56 -0000
@@ -0,0 +1,15 @@
+
+
+ %dtd1;
+ %dtd2;
+ %dtd3;
+]>
+
Index: extensions/inspector/resources/content/viewers/jsObject/jsObject.js
===================================================================
RCS file: extensions/inspector/resources/content/viewers/jsObject/jsObject.js
diff -N extensions/inspector/resources/content/viewers/jsObject/jsObject.js
--- extensions/inspector/resources/content/viewers/jsObject/jsObject.js Wed Nov 13 14:17:52 2002
+++ extensions/inspector/resources/content/viewers/jsObject/jsObject.js Fri Jun 20 19:32:56 2003
@@ -16,14 +16,15 @@
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 2001
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Joe Hewitt (original author)
+ * Alexander J. Vincent
*
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
@@ -55,50 +56,54 @@
//////////////////////////////////////////////////
window.addEventListener("load", JSObjectViewer_initialize, false);
function JSObjectViewer_initialize()
{
viewer = new JSObjectViewer();
+ viewer.objectTree.lastChild.addEventListener("DOMAttrModified", viewer.openTreeCellCheck, true);
+ viewer.objectTree.addEventListener("select", viewer.treeCellSelect, true);
viewer.initialize(parent.FrameExchange.receiveData(window));
}
////////////////////////////////////////////////////////////////////////////
//// class JSObjectViewer
function JSObjectViewer()
{
+ this.objectTree = document.getElementById("treeJSObject");
+ this.expandedValue = document.getElementById("expandedValue");
+ this.sortOption = document.getElementById("sortOption");
+ this.executeMethodMenuItem = document.getElementById("executeMethodMenuItem");
+ this.parameterField = document.getElementById("parameterField");
this.mObsMan = new ObserverManager(this);
}
JSObjectViewer.prototype =
{
////////////////////////////////////////////////////////////////////////////
//// Initialization
mSubject: null,
mPane: null,
+ mSelection: null,
////////////////////////////////////////////////////////////////////////////
//// interface inIViewer
get uid() { return "jsObject" },
get pane() { return this.mPane },
get selection() { return this.mSelection },
get subject() { return this.mSubject },
set subject(aObject)
{
this.mSubject = aObject;
- this.emptyTree(this.mTreeKids);
- var ti = this.addTreeItem(this.mTreeKids, "target", aObject, aObject);
- this.openTreeItem(ti);
-
- this.mObsMan.dispatchEvent("subjectChange", { subject: aObject });
+ this.inspectObject();
},
initialize: function(aPane)
{
this.mPane = aPane;
this.mTree = document.getElementById("treeJSObject");
this.mTreeKids = document.getElementById("trchJSObject");
@@ -129,145 +134,351 @@
////////////////////////////////////////////////////////////////////////////
//// UI Commands
cmdCopyValue: function()
{
var sel = getSelectedItem();
if (sel) {
- var val = sel.__JSValue__;
+ var val = sel.inspectedObject;
if (val) {
var helper = XPCU.getService(kClipboardHelperCID, "nsIClipboardHelper");
helper.copyString(val);
}
}
},
-
- cmdEvalExpr: function()
- {
- var sel = getSelectedItem();
- if (sel) {
- var win = openDialog("chrome://inspector/content/viewers/jsObject/evalExprDialog.xul",
- "_blank", "chrome", this, sel);
+
+ onItemSelected: function() {
+ if (this.pane.id == "bxDocPanel") {
+ var selectedItem = this.objectTree.view.getItemAtIndex(this.objectTree.currentIndex);
+ this.mSelection = selectedItem.inspectedObject;
+ this.mObsMan.dispatchEvent("selectionChange", { selection: this.mSelection } );
}
- },
-
- doEvalExpr: function(aExpr, aItem, aNewView)
- {
- // TODO: I should really write some C++ code to execute the
- // js code in the js context of the inspected window
-
- try {
- var f = Function("target", aExpr);
- var result = f(aItem.__JSValue__);
-
- if (result) {
- if (aNewView) {
- inspectObject(result);
- } else {
- this.subject = result;
- }
- }
- } catch (ex) {
- dump("Error in expression.\n");
- throw (ex);
+ },
+
+ ////////////////////////////////////////////////////////////////////////////
+ //// tree sorting functions
+
+ sortByAlpha: function(a, b) {
+ if (a.objectName < b.objectName) {
+ return -1;
}
- },
-
- cmdInspectInNewView: function()
- {
- var sel = getSelectedItem();
- if (sel)
- inspectObject(sel.__JSValue__);
+ if (a.objectName > b.objectName) {
+ return 1;
+ }
+ return 0;
},
-
+
+ sortByOrigOrder: function(a, b) {
+ return (a.origSortOrder - b.origSortOrder);
+ },
+
////////////////////////////////////////////////////////////////////////////
- //// tree construction
+ //// tree utility functions
- emptyTree: function(aTreeKids)
- {
- var kids = aTreeKids.childNodes;
- for (var i = 0; i < kids.length; ++i) {
- aTreeKids.removeChild(kids[i]);
+ getTreeItem: function(aObject, objectName) {
+ var treeItem = document.createElement("treeitem");
+ var treeRow = document.createElement("treerow");
+
+ var propertyName = document.createElement("treecell");
+ propertyName.setAttribute("label", objectName);
+ treeRow.appendChild(propertyName);
+
+ var propertyMatch = document.createElement("treecell");
+ treeRow.appendChild(propertyMatch);
+
+ var propertyType = document.createElement("treecell");
+ if (aObject === null) {
+ propertyType.setAttribute("label", "(null)");
+ } else {
+ propertyType.setAttribute("label", typeof aObject);
+ }
+ treeRow.appendChild(propertyType);
+
+ var propertyValue = document.createElement("treecell");
+ propertyValue.setAttribute("label", aObject);
+ treeRow.appendChild(propertyValue);
+
+ treeItem.appendChild(treeRow);
+
+ var hasProperties = false;
+ switch (typeof aObject) {
+ case "string":
+ case "undefined":
+ // we don't want to attempt listing properties of strings or undefined values
+ break;
+
+ case "object":
+ if (aObject === null) {
+ // we don't want to attempt listing properties of null values
+ break;
+ }
+
+ default:
+ for (var property in aObject) {
+ // okay, aObject does have a property. Set hasProperties and break out of the loop.
+ hasProperties = true;
+ break;
+ }
+
+ if ((!hasProperties)&&(typeof aObject[0] != "undefined")) {
+ hasProperties = true;
+ }
+ }
+
+ if (hasProperties) {
+ treeItem.setAttribute("container", "true");
+ treeItem.appendChild(document.createElement("treechildren"));
+ }
+
+ treeItem.inspectedObject = aObject;
+ treeItem.objectName = objectName;
+ treeItem.listedProps = [];
+
+ return treeItem;
+ },
+
+ checkParentObjects: function(newItem) {
+ var matchCheck = newItem.firstChild.firstChild;
+ var matchArray = [];
+ var matchTests = 0;
+
+ while ((typeof newItem.inspectedObject == "object")&&(matchCheck.parentNode.parentNode != this.objectTree)) {
+ matchCheck = matchCheck.parentNode.parentNode;
+ ++matchTests;
+ matchArray[matchArray.length] = matchCheck.firstChild.firstChild.getAttribute("label");
+
+ if (matchCheck.inspectedObject == newItem.inspectedObject) {
+ // we have a match, cut off everything before.
+ matchArray.splice(0, matchArray.length - 1);
+ }
+ }
+ if (matchArray.length < matchTests) {
+ matchArray.reverse();
+ newItem.firstChild.childNodes[1].setAttribute("label", matchArray.join("."));
}
},
-
- buildPropertyTree: function(aTreeChildren, aObject)
- {
- for (var prop in aObject) {
+
+ addProperties: function(treeItem) {
+ var props = [];
+ treeItem.childPropItems = [];
+ var treeChildren = treeItem.lastChild;
+
+ if (typeof treeItem.inspectedObject != "string") {
+ for (var property in treeItem.inspectedObject) {
+ props[props.length] = property;
+ }
+ }
+
+ // get numbered properties as well which the for...in statement did not retrieve
+ var i = 0;
+ while ((typeof treeItem.inspectedObject[i] != "undefined")&&(!treeItem.inspectedObject.propertyIsEnumerable(i))) {
+ props[props.length] = i;
+ ++i;
+ }
+
+ var errCount = 0, errMsg = "";
+ for (var k = 0; k < props.length; k++) {
try {
- this.addTreeItem(aTreeChildren, prop, aObject[prop], aObject);
- } catch (ex) {
- // hide unsightly NOT YET IMPLEMENTED errors when accessing certain properties
+ var newItem = this.getTreeItem(treeItem.inspectedObject[props[k]], props[k]);
+ newItem.origSortOrder = k;
+ treeItem.childPropItems[treeItem.childPropItems.length] = newItem;
}
+ catch (e) {
+ ++errCount;
+ errMsg += "\n" + props[k];
+ }
+ }
+
+ if (this.sortOption.checked) {
+ treeItem.childPropItems.sort(this.sortByAlpha);
+ }
+
+ for (k = 0; k < treeItem.childPropItems.length; k++) {
+ treeChildren.appendChild(treeItem.childPropItems[k]);
+
+ // check for matches
+ this.checkParentObjects(treeItem.childPropItems[k]);
}
+
+ if (errCount > 0) {
+ this.expandedValue.value = "Failed to retrieve for " + treeItem.firstChild.firstChild.getAttribute("label") + errMsg;
+ }
+
+ return true;
},
-
- addTreeItem: function(aTreeChildren, aName, aValue, aObject)
- {
- var ti = document.createElement("treeitem");
- ti.__JSObject__ = aObject;
- ti.__JSValue__ = aValue;
-
- var value;
- if (aValue === null) {
- value = "(null)"
+
+ resortProperties: function() {
+ if (this.sortOption.checked) {
+ var sortFunc = this.sortByAlpha;
} else {
- try {
- value = aValue.toString();
- value = value.replace(/\n|\r|\t|\v/g, " ");
- } catch (ex) {
- value = "";
+ sortFunc = this.sortByOrigOrder;
+ }
+
+ var selectedItem = this.objectTree.view.getItemAtIndex(this.objectTree.currentIndex);
+
+ var treeChildrenNodes = this.objectTree.lastChild.getElementsByTagName("treechildren");
+ for (var k = 0; k < treeChildrenNodes.length; k++) {
+ if (typeof treeChildrenNodes[k].parentNode.childPropItems != "undefined") {
+ var items = treeChildrenNodes[k].parentNode.childPropItems;
+ items.sort(sortFunc);
+ for (var j = 0; j < items.length; j++) {
+ if (items[j] != treeChildrenNodes[k].childNodes.item(j)) {
+ treeChildrenNodes[k].insertBefore(items[j], treeChildrenNodes[k].childNodes.item(j));
+ }
+ }
}
}
-
- ti.setAttribute("typeOf", typeof(aValue));
+ this.objectTree.treeBoxObject.selection.currentIndex = this.objectTree.view.getIndexOfItem(selectedItem);
+ },
- if (typeof(aValue) == "object" && aValue !== null) {
- ti.setAttribute("container", "true");
- } else if (typeof(aValue) == "string")
- value = "\"" + value + "\"";
-
- var tr = document.createElement("treerow");
- ti.appendChild(tr);
-
- var tc = document.createElement("treecell");
- tc.setAttribute("label", aName);
- tr.appendChild(tc);
- tc = document.createElement("treecell");
- tc.setAttribute("label", value);
- if (aValue === null) {
- tc.setAttribute("class", "inspector-null-value-treecell");
- }
- if (aName == "nodeType")
- tc.setAttribute("tooltiptext", nodeTypeToText(aValue));
- tr.appendChild(tc);
-
- aTreeChildren.appendChild(ti);
+ regExpTest: function(treeColIndex) {
+ var hiddenElements = this.objectTree.getElementsByAttribute("hidden", "true");
+ for (var j = 0; j < hiddenElements.length; j++) {
+ hiddenElements[j].removeAttribute("hidden");
+ }
- // listen for changes to open attribute
- this.mTreeKids.addEventListener("DOMAttrModified", onTreeItemAttrModified, false);
-
- return ti;
+ try {
+ var pattern = this.parameterField.value;
+ if (pattern != "") {
+ var regE = new RegExp(pattern, "m");
+ var children = this.objectTree.lastChild.lastChild.lastChild;
+ for (j = 0; j < children.childNodes.length; j++) {
+ this.hideOrShowItems(children.childNodes[j], regE, treeColIndex);
+ }
+ }
+ }
+ catch (e) {
+ hiddenElements = this.objectTree.getElementsByAttribute("hidden", "true");
+ for (j = 0; j < hiddenElements.length; j++) {
+ hiddenElements[j].removeAttribute("hidden");
+ }
+ var eMsg = e + "\n" + e.stack;
+ this.expandedValue.value = "regExpTest failed on treecol " + treeColIndex + " with /" + pattern + "/m\n" + eMsg;
+ }
},
-
- openTreeItem: function(aItem)
- {
- var kids = aItem.getElementsByTagName("treechildren");
- if (kids.length == 0) {
- kids = document.createElement("treechildren");
- aItem.appendChild(kids);
+
+ hideOrShowItems: function(treeItem, regE, treeColIndex) {
+ var field = treeItem.firstChild.childNodes[treeColIndex];
+ if (!regE.test(field.getAttribute("label"))) {
+ treeItem.setAttribute("hidden", "true");
+ } else {
+ var currentNode = treeItem.parentNode.parentNode;
+ while (currentNode != this.objectTree) {
+ currentNode.removeAttribute("hidden");
+ currentNode.setAttribute("open", "true");
+ currentNode = currentNode.parentNode.parentNode;
+ }
+ }
+
+ var children = treeItem.lastChild;
+ if (children.nodeName == "treechildren") {
+ for (var j = 0; j < children.childNodes.length; j++) {
+ this.hideOrShowItems(children.childNodes[j], regE, treeColIndex);
+ }
}
-
- this.buildPropertyTree(kids, aItem.__JSValue__);
},
-
- onCreateContext: function(aPopup)
- {
+
+ updateTreeContext: function(popup) {
+ var selectedItem = this.objectTree.view.getItemAtIndex(this.objectTree.currentIndex);
+ this.executeMethodMenuItem.setAttribute("disabled", (typeof selectedItem.inspectedObject != "function"));
+ },
+
+ openMethodDialog: function() {
+ var selectedItem = this.objectTree.view.getItemAtIndex(this.objectTree.currentIndex);
+ var thisItem = selectedItem.parentNode.parentNode;
+ try {
+ window.openDialog("chrome://inspector/content/viewers/jsObject/methodExecuteDialog.xul", "",
+ "chrome, width=320, height=240, modal=1",
+ thisItem.inspectedObject, selectedItem.inspectedObject, selectedItem);
+ }
+ catch (e) {
+ this.expandedValue.value = e;
+ }
+ },
+
+ openAssignDialog: function() {
+ var selectedItem = this.objectTree.view.getItemAtIndex(this.objectTree.currentIndex);
+ try {
+ window.openDialog("chrome://inspector/content/viewers/jsObject/assignMatchDialog.xul", "",
+ "chrome, width=320, height=80, modal=1", selectedItem);
+ }
+ catch (e) {
+ this.expandedValue.value = e;
+ }
+ },
+
+ openAddPropertyDialog: function() {
+ var selectedItem = this.objectTree.view.getItemAtIndex(this.objectTree.currentIndex);
+ try {
+ window.openDialog("chrome://inspector/content/viewers/jsObject/addPropertyDialog.xul", "",
+ "chrome, width=320, height=240, modal=1", selectedItem);
+ }
+ catch (e) {
+ this.expandedValue.value = e;
+ }
+ },
+
+ openShowPropertyDialog: function() {
+ var selectedItem = this.objectTree.view.getItemAtIndex(this.objectTree.currentIndex);
+ try {
+ window.openDialog("chrome://inspector/content/viewers/jsObject/showPropertyDialog.xul", "",
+ "chrome, width=320, height=80, modal=1", selectedItem);
+ }
+ catch (e) {
+ this.expandedValue.value = e;
+ }
+ },
+
+ ////////////////////////////////////////////////////////////////////////////
+ //// tree new inspection function
+
+ inspectObject: function() {
+ var objectName = "target";
+ var masterObject = this.mSubject;
+
+ var treeItem = this.getTreeItem(masterObject, objectName);
+
+ this.objectTree.lastChild.appendChild(treeItem);
+ this.objectTree.lastChild.removeChild(treeItem.previousSibling);
+ treeItem.setAttribute("open", "true");
+ this.objectTree.currentIndex = 0;
+ this.onItemSelected(); // update selection in right-hand panel
+
+ return true;
+ },
+
+ ////////////////////////////////////////////////////////////////////////////
+ //// tree event handler functions
+
+ openTreeCellCheck: function(evt) {
+ switch (true) {
+ case (evt.target.nodeName != "treeitem"):
+ case (evt.relatedNode.nodeName != "open"):
+ case (evt.newValue != "true"):
+ case (evt.target.lastChild.childNodes.length > 0):
+ return false;
+ }
+ viewer.addProperties(evt.target);
+ return true;
+ },
+
+ treeCellSelect: function(evt) {
+ var tree = evt.target;
+ if (tree.currentIndex == -1) {
+ return false;
+ }
+ var value = tree.view.getItemAtIndex(tree.currentIndex).inspectedObject;
+ if (value === null) {
+ viewer.expandedValue.value = "(null)";
+ } else {
+ viewer.expandedValue.value = value;
+ }
+ return true;
}
-
+
};
function onTreeItemAttrModified(aEvent)
{
if (aEvent.attrName == "open")
viewer.openTreeItem(aEvent.target);
}
Index: extensions/inspector/resources/content/viewers/jsObject/jsObject.xul
===================================================================
RCS file: extensions/inspector/resources/content/viewers/jsObject/jsObject.xul
diff -N extensions/inspector/resources/content/viewers/jsObject/jsObject.xul
--- extensions/inspector/resources/content/viewers/jsObject/jsObject.xul Sun May 18 05:15:14 2003
+++ extensions/inspector/resources/content/viewers/jsObject/jsObject.xul Fri Jun 20 18:30:14 2003
@@ -15,31 +15,57 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: extensions/inspector/resources/locale/en-US/viewers/jsObject.dtd
===================================================================
RCS file: extensions/inspector/resources/locale/en-US/viewers/jsObject.dtd
diff -N extensions/inspector/resources/locale/en-US/viewers/jsObject.dtd
--- extensions/inspector/resources/locale/en-US/viewers/jsObject.dtd Sun May 18 05:15:22 2003
+++ extensions/inspector/resources/locale/en-US/viewers/jsObject.dtd Fri Jun 20 17:36:26 2003
@@ -31,16 +31,22 @@
- and other provisions required by the LGPL or the GPL. If you do not delete
- the provisions above, a recipient may use your version of this file under
- the terms of any one of the MPL, the GPL or the LGPL.
-
- ***** END LICENSE BLOCK ***** -->
-
+
+
-
+
+
+
+
-
-
+
+
+
+