Bug 386818 - expose right accessible tree in DOMi, r=sdwilsh, ajvincent, evan.yan, sr=neil
authorsurkov.alexander@gmail.com
Fri, 10 Aug 2007 19:46:11 -0700
changeset 4519 3939bc5fb2f9b26a0c5a44b4cf21a7b454576cb6
parent 4518 1b5b5b7d8c812affc302bb0027e03d42f6cadbf6
child 4520 ed3e32d42116492171f3fdbc543455d08a412b61
push idunknown
push userunknown
push dateunknown
reviewerssdwilsh, ajvincent, evan.yan, neil
bugs386818
milestone1.9a8pre
Bug 386818 - expose right accessible tree in DOMi, r=sdwilsh, ajvincent, evan.yan, sr=neil
extensions/inspector/jar.mn
extensions/inspector/resources/content/res/viewer-registry.rdf
extensions/inspector/resources/content/viewers/accessibleTree/accessibleTree.js
extensions/inspector/resources/content/viewers/accessibleTree/accessibleTree.xul
extensions/inspector/resources/locale/en-US/viewers/accessibleTree.dtd
extensions/inspector/resources/locale/fr/viewers/accessibleTree.dtd
extensions/inspector/resources/locale/jar.mn
extensions/inspector/resources/locale/nb-NO/viewers/accessibleTree.dtd
extensions/inspector/resources/locale/pl/viewers/accessibleTree.dtd
extensions/inspector/resources/locale/ru/viewers/accessibleTree.dtd
--- a/extensions/inspector/jar.mn
+++ b/extensions/inspector/jar.mn
@@ -63,16 +63,18 @@ inspector.jar:
   content/inspector/prefs/pref-inspector.xul                          (resources/content/prefs/pref-inspector.xul)
   content/inspector/prefs/prefsOverlay.xul                            (resources/content/prefs/prefsOverlay.xul)
   content/inspector/prefs/pref-sidebar.js                             (resources/content/prefs/pref-sidebar.js)
   content/inspector/tests/allskin.xul                                 (resources/content/tests/allskin.xul)
   content/inspector/viewers/accessibleObject/accessibleObject.js      (resources/content/viewers/accessibleObject/accessibleObject.js)
   content/inspector/viewers/accessibleObject/accessibleObject.xul     (resources/content/viewers/accessibleObject/accessibleObject.xul)
   content/inspector/viewers/accessibleProps/accessibleProps.js        (resources/content/viewers/accessibleProps/accessibleProps.js)
   content/inspector/viewers/accessibleProps/accessibleProps.xul       (resources/content/viewers/accessibleProps/accessibleProps.xul)
+  content/inspector/viewers/accessibleTree/accessibleTree.js          (resources/content/viewers/accessibleTree/accessibleTree.js)
+  content/inspector/viewers/accessibleTree/accessibleTree.xul         (resources/content/viewers/accessibleTree/accessibleTree.xul)
   content/inspector/viewers/computedStyle/computedStyle.js            (resources/content/viewers/computedStyle/computedStyle.js)
   content/inspector/viewers/computedStyle/computedStyle.xul           (resources/content/viewers/computedStyle/computedStyle.xul)
   content/inspector/viewers/dom/FindDialog.js                         (resources/content/viewers/dom/FindDialog.js)
   content/inspector/viewers/dom/columnsDialog.js                      (resources/content/viewers/dom/columnsDialog.js)
   content/inspector/viewers/dom/columnsDialog.xul                     (resources/content/viewers/dom/columnsDialog.xul)
   content/inspector/viewers/dom/commandOverlay.xul                    (resources/content/viewers/dom/commandOverlay.xul)
   content/inspector/viewers/dom/insertDialog.js                       (resources/content/viewers/dom/insertDialog.js)
   content/inspector/viewers/dom/insertDialog.xul                      (resources/content/viewers/dom/insertDialog.xul)
--- a/extensions/inspector/resources/content/res/viewer-registry.rdf
+++ b/extensions/inspector/resources/content/res/viewer-registry.rdf
@@ -91,21 +91,24 @@
       ins:filter="return true;"/>
     </rdf:li>
 
     <rdf:li>
       <rdf:Description ins:uid="accessibleObject"
                        ins:panels="bxObjectPanel bxObjPanel"
                        ins:description="Accessible Object">
         <ins:filter><![CDATA[
-          if (!linkedViewer || linkedViewer.uid != "dom" ||
-              !linkedViewer.getAccessibleNodes() ||
+          if (!linkedViewer ||
               !(object instanceof Components.interfaces.nsIDOMNode))
             return false;
 
+          if (linkedViewer.uid != "accessibleTree" &&
+              (linkedViewer.uid != "dom" || !linkedViewer.getAccessibleNodes()))
+            return false;
+
           try {
             var accService =
               Components.classes["@mozilla.org/accessibleRetrieval;1"]
                         .getService(Components.interfaces.nsIAccessibleRetrieval);
 
             return accService.getAttachedAccessibleFor(object);
           } catch(e) {
             return false;
@@ -114,21 +117,45 @@
       </rdf:Description>
     </rdf:li>
 
     <rdf:li>
       <rdf:Description ins:uid="accessibleProps"
                        ins:panels="bxObjectPanel bxObjPanel"
                        ins:description="Accessible Properties">
         <ins:filter><![CDATA[
-          if (!linkedViewer || linkedViewer.uid != "dom" ||
-              !linkedViewer.getAccessibleNodes() ||
+          if (!linkedViewer ||
               !(object instanceof Components.interfaces.nsIDOMNode))
             return false;
 
+          if (linkedViewer.uid != "accessibleTree" &&
+              (linkedViewer.uid != "dom" || !linkedViewer.getAccessibleNodes()))
+            return false;
+
+          try {
+            var accService =
+              Components.classes["@mozilla.org/accessibleRetrieval;1"]
+                        .getService(Components.interfaces.nsIAccessibleRetrieval);
+
+            return accService.getAttachedAccessibleFor(object);
+          } catch(e) {
+            return false;
+          }
+        ]]></ins:filter>
+      </rdf:Description>
+    </rdf:li>
+
+    <rdf:li>
+      <rdf:Description ins:uid="accessibleTree"
+                       ins:panels="bxDocPanel"
+                       ins:description="Accessible Tree">
+        <ins:filter><![CDATA[
+          if (!(object instanceof Components.interfaces.nsIDOMDocument))
+            return false;
+
           try {
             var accService =
               Components.classes["@mozilla.org/accessibleRetrieval;1"]
                         .getService(Components.interfaces.nsIAccessibleRetrieval);
 
             return accService.getAttachedAccessibleFor(object);
           } catch(e) {
             return false;
new file mode 100644
--- /dev/null
+++ b/extensions/inspector/resources/content/viewers/accessibleTree/accessibleTree.js
@@ -0,0 +1,426 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2007
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *   Alexander Surkov <surkov.alexander@gmail.com> (original author)
+ *
+ * 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
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. 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 ***** */
+
+/***************************************************************
+* AccessibleEventsViewer --------------------------------------------
+*  The viewer for the accessible tree of a document.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+* REQUIRED IMPORTS:
+*   chrome://inspector/content/jsutil/xpcom/XPCU.js
+****************************************************************/
+
+///////////////////////////////////////////////////////////////////////////////
+//// Global Variables
+
+var viewer;
+
+///////////////////////////////////////////////////////////////////////////////
+//// Global Constants
+
+const kAccessibleRetrievalCID = "@mozilla.org/accessibleRetrieval;1";
+
+const nsIAccessibleRetrieval = Components.interfaces.nsIAccessibleRetrieval;
+const nsIAccessibleEvent = Components.interfaces.nsIAccessibleEvent;
+const nsIAccessible = Components.interfaces.nsIAccessible;
+const nsIAccessNode = Components.interfaces.nsIAccessNode;
+
+///////////////////////////////////////////////////////////////////////////////
+//// Initialization
+
+window.addEventListener("load", AccessibleTreeViewer_initialize, false);
+
+function AccessibleTreeViewer_initialize()
+{
+  viewer = new AccessibleTreeViewer();
+  viewer.initialize(parent.FrameExchange.receiveData(window));
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// AccessibleEventsViewer
+
+function AccessibleTreeViewer()
+{
+  this.mURL = window.location;
+  this.mObsMan = new ObserverManager(this);
+
+  this.mTree = document.getElementById("olAccessibleTree");
+  this.mOlBox = this.mTree.treeBoxObject;
+}
+
+AccessibleTreeViewer.prototype =
+{
+  //Initialization
+
+  mSubject: null,
+  mPane: null,
+  mView: null,
+
+  // interface inIViewer
+
+  get uid() { return "accessibleTree"; },
+  get pane() { return this.mPane; },
+  get selection() { return this.mSelection; },
+
+  get subject() { return this.mSubject; },
+  set subject(aObject)
+  {
+    this.mView = new inAccTreeView(aObject);
+    this.mOlBox.view = this.mView;
+    this.mObsMan.dispatchEvent("subjectChange", { subject: aObject });
+    this.mView.selection.select(0);
+  },
+
+  initialize: function initialize(aPane)
+  {
+    this.mPane = aPane;
+    aPane.notifyViewerReady(this);
+  },
+
+  destroy: function destroy()
+  {
+    this.mOlBox.view = null;
+  },
+
+  isCommandEnabled: function isCommandEnabled(aCommand)
+  {
+    return false;
+  },
+
+  getCommand: function getCommand(aCommand)
+  {
+    return null;
+  },
+
+  // event dispatching
+
+  addObserver: function addObserver(aEvent, aObserver)
+  {
+    this.mObsMan.addObserver(aEvent, aObserver);
+  },
+  removeObserver: function removeObserver(aEvent, aObserver)
+  {
+    this.mObsMan.removeObserver(aEvent, aObserver);
+  },
+
+  // stuff
+
+  onItemSelected: function onItemSelected()
+  {
+    var idx = this.mTree.currentIndex;
+    this.mSelection = this.mView.getDOMNode(idx);
+    this.mObsMan.dispatchEvent("selectionChange",
+                               { selection: this.mSelection } );
+  }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//// inAccTreeView
+
+function inAccTreeView(aDocument)
+{
+  this.mNodes = [];
+
+  this.mAccService = XPCU.getService(kAccessibleRetrievalCID,
+                                     nsIAccessibleRetrieval);
+
+  this.mDocument = aDocument;
+  this.mAccDocument = this.mAccService.getAccessibleFor(aDocument);
+
+  var node = this.createNode(this.mAccDocument);
+  this.mNodes.push(node);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// inAccTreeView. nsITreeView interface
+
+inAccTreeView.prototype = new inBaseTreeView();
+
+inAccTreeView.prototype.__defineGetter__("rowCount",
+function rowCount()
+{
+  return this.mNodes.length;
+});
+
+inAccTreeView.prototype.getCellText =
+function getCellText(aRow, aCol)
+{
+  var node = this.rowToNode(aRow);
+  if (!node)
+    return "";
+
+  var accessible = node.accessible;
+
+  if (aCol.id == "olcRole")
+    return this.mAccService.getStringRole(accessible.finalRole);
+
+  if (aCol.id == "olcName")
+    return accessible.name;
+
+  if (aCol.id == "olcNodeName") {
+    var node = this.getDOMNodeFor(accessible);
+    return node ? node.nodeName : "";
+  }
+
+  return "";
+}
+
+inAccTreeView.prototype.isContainer =
+function isContainer(aRow)
+{
+  var node = this.rowToNode(aRow);
+  return node ? node.isContainer : false;
+}
+
+inAccTreeView.prototype.isContainerOpen =
+function isContainerOpen(aRow)
+{
+  var node = this.rowToNode(aRow);
+  return node ? node.isOpen : false;
+}
+
+inAccTreeView.prototype.isContainerEmpty =
+function isContainerEmpty(aRow)
+{
+  return !this.isContainer(aRow);
+}
+
+inAccTreeView.prototype.getLevel =
+function getLevel(aRow)
+{
+  var node = this.rowToNode(aRow);
+  return node ? node.level : 0;
+}
+
+inAccTreeView.prototype.getParentIndex =
+function getParentIndex(aRow)
+{
+  var node = this.rowToNode(aRow);
+  if (!node)
+    return -1;
+
+  var checkNode = null;
+  var i = aRow - 1;
+  do {
+    checkNode = this.rowToNode(i);
+    if (!checkNode)
+      return -1;
+
+    if (checkNode == node.parent)
+      return i;
+    --i;
+  } while (checkNode);
+
+  return -1;
+}
+
+inAccTreeView.prototype.hasNextSibling =
+function hasNextSibling(aRow, aAfterRow)
+{
+  var node = this.rowToNode(aRow);
+  return node && (node.next != null);
+}
+
+inAccTreeView.prototype.toggleOpenState =
+function toggleOpenState(aRow)
+{
+  var node = this.rowToNode(aRow);
+  if (!node)
+    return;
+
+  var oldCount = this.rowCount;
+  if (node.isOpen)
+    this.collapseNode(aRow);
+  else
+    this.expandNode(aRow);
+
+  this.mTree.invalidateRow(aRow);
+  this.mTree.rowCountChanged(aRow + 1, this.rowCount - oldCount);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// inAccTreeView. Tree utils.
+
+/**
+ * Expands a tree node on the given row.
+ *
+ * @param aRow - row index.
+ */
+inAccTreeView.prototype.expandNode =
+function expandNode(aRow)
+{
+  var node = this.rowToNode(aRow);
+  if (!node)
+    return;
+
+  var kids = node.accessible.children;
+  var kidCount = kids.length;
+
+  var newNode = null;
+  var prevNode = null;
+
+  for (var i = 0; i < kidCount; ++i) {
+    var accessible = kids.queryElementAt(i, nsIAccessible);
+    newNode = this.createNode(accessible, node);
+    this.mNodes.splice(aRow + i + 1, 0, newNode);
+
+    if (prevNode)
+      prevNode.next = newNode;
+    newNode.previous = prevNode;
+    prevNode = newNode;
+  }
+
+  node.isOpen = true;
+}
+
+/**
+ * Collapse a tree node on the given row.
+ *
+ * @param aRow - row index.
+ */
+inAccTreeView.prototype.collapseNode =
+function collapseNode(aRow)
+{
+  var node = this.rowToNode(aRow);
+  if (!node)
+    return;
+
+  var row = this.getLastDescendantOf(node, aRow);
+  this.mNodes.splice(aRow + 1, row - aRow);
+
+  node.isOpen = false;
+}
+
+/**
+ * Create a tree node.
+ *
+ * @param aAccessible - an accessible object associated with created tree node.
+ * @param aParent - parent tree node for the created tree node.
+ * @retrurn - tree node object for the given accesible.
+ */
+inAccTreeView.prototype.createNode =
+function createNode(aAccessible, aParent)
+{
+  var node = new inAccTreeViewNode(aAccessible);
+  node.level = aParent ? aParent.level + 1 : 0;
+  node.parent = aParent;
+  node.isContainer = aAccessible.children.length > 0;
+
+  return node;
+}
+
+/**
+ * Return row index of the last node that is a descendant of the given node.
+ * If there is no required node then return the given row.
+ *
+ * @param aNode - tree node for that last descedant is searched.
+ * @param aRow - row index of the given tree node.
+ */
+inAccTreeView.prototype.getLastDescendantOf =
+function getLastDescendantOf(aNode, aRow)
+{
+  var rowCount = this.rowCount;
+
+  var row = aRow + 1;
+  for (; row < rowCount; ++row) {
+    if (this.mNodes[row].level <= aNode.level)
+      return row - 1;
+  }
+
+  return rowCount - 1;
+}
+
+/**
+ * Return a tree node by the given row.
+ *
+ * @param aRow - row index.
+ */
+inAccTreeView.prototype.rowToNode =
+function rowToNode(aRow)
+{
+  if (aRow < 0 || aRow >= this.rowCount)
+    return null;
+
+  return this.mNodes[aRow];
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// inAccTreeView. Accessibility utils.
+
+/**
+ * Return DOM node for the given accessible.
+ *
+ * @param aAccessible - an accessible object.
+ */
+inAccTreeView.prototype.getDOMNodeFor =
+function getDOMNodeFor(aAccessible)
+{
+  var accessNode = XPCU.QI(aAccessible, nsIAccessNode);
+  return accessNode.DOMNode;
+}
+
+/**
+ * Return DOM node for an accessible of the tree node pointed by the given
+ * row index.
+ *
+ * @param aRow - row index.
+ */
+inAccTreeView.prototype.getDOMNode =
+function getDOMNode(aRow)
+{
+  var node = this.mNodes[aRow];
+  if (!node)
+    return null;
+
+  return this.getDOMNodeFor(node.accessible);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// inAccTreeViewNode
+
+function inAccTreeViewNode(aAccessible)
+{
+  this.accessible = aAccessible;
+
+  this.parent = null;
+  this.next = null;
+  this.previous = null;
+
+  this.level = 0;
+  this.isOpen = false;
+  this.isContainer = false;
+}
+
new file mode 100644
--- /dev/null
+++ b/extensions/inspector/resources/content/viewers/accessibleTree/accessibleTree.xul
@@ -0,0 +1,84 @@
+<?xml version="1.0"?>
+
+<!-- ***** BEGIN LICENSE BLOCK *****
+   - Version: MPL 1.1/GPL 2.0/LGPL 2.1
+   -
+   - The contents of this file are subject to the Mozilla Public License Version
+   - 1.1 (the "License"); you may not use this file except in compliance with
+   - the License. You may obtain a copy of the License at
+   - http://www.mozilla.org/MPL/
+   -
+   - Software distributed under the License is distributed on an "AS IS" basis,
+   - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+   - for the specific language governing rights and limitations under the
+   - License.
+   -
+   - The Original Code is DOM Inspector.
+   -
+   - The Initial Developer of the Original Code is
+   - Mozilla Foundation.
+   - Portions created by the Initial Developer are Copyright (C) 2007
+   - the Initial Developer. All Rights Reserved.
+   -
+   - Contributor(s):
+   -  Alexander Surkov <surkov.alexander@gmail.com> (original author)
+   -
+   - 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
+   - under the terms of either the GPL or the LGPL, and not to allow others to
+   - use your version of this file under the terms of the MPL, indicate your
+   - decision by deleting the provisions above and replace them with the notice
+   - and other provisions required by the GPL or the LGPL. 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 ***** -->
+
+<!DOCTYPE page [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+  <!ENTITY % dtd2 SYSTEM "chrome://inspector/content/util.dtd"> %dtd2;
+  <!ENTITY % dtd3 SYSTEM "chrome://inspector/locale/viewers/accessibleTree.dtd"> %dtd3;
+]>
+
+<?xml-stylesheet href="chrome://inspector/skin/"?>
+
+<page id="winAccessibleTree"
+      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xul/inBaseTreeView.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/viewers/accessibleTree/accessibleTree.js"/>
+
+  <tree id="olAccessibleTree" class="plain" flex="1"
+        onselect="viewer.onItemSelected()">
+    <treecols>
+      <treecol id="olcRole"
+               label="&role.label;"
+               persist="width,hidden,ordinal"
+               primary="true"
+               flex="1"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="olcName"
+               label="&name.label;"
+               persist="width,hidden,ordinal"
+               flex="1"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="olcNodeName"
+               label="&nodeName.label;"
+               persist="width,hidden,ordinal"
+               flex="1"/>
+    </treecols>
+    <treechildren id="olbAccessibleTree"
+                  alternatingbackground="true"/>
+  </tree>
+
+</page>
+
new file mode 100644
--- /dev/null
+++ b/extensions/inspector/resources/locale/en-US/viewers/accessibleTree.dtd
@@ -0,0 +1,43 @@
+<!-- ***** BEGIN LICENSE BLOCK *****
+#if 0
+   - Version: MPL 1.1/GPL 2.0/LGPL 2.1
+   -
+   - The contents of this file are subject to the Mozilla Public License Version
+   - 1.1 (the "License"); you may not use this file except in compliance with
+   - the License. You may obtain a copy of the License at
+   - http://www.mozilla.org/MPL/
+   -
+   - Software distributed under the License is distributed on an "AS IS" basis,
+   - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+   - for the specific language governing rights and limitations under the
+   - License.
+   -
+   - The Original Code is DOM Inspector.
+   -
+   - The Initial Developer of the Original Code is
+   - Mozilla Foundation.
+   - Portions created by the Initial Developer are Copyright (C) 2007
+   - the Initial Developer. All Rights Reserved.
+   -
+   - Contributor(s):
+   -   Alexander Surkov <surkov.alexander@gmail.com>
+   -
+   - 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
+   - under the terms of either the GPL or the LGPL, and not to allow others to
+   - use your version of this file under the terms of the MPL, indicate your
+   - decision by deleting the provisions above and replace them with the notice
+   - 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.
+   -
+#endif
+   - ***** END LICENSE BLOCK ***** -->
+
+<!ENTITY role.label "Role">
+<!ENTITY name.label "Name">
+<!ENTITY nodeName.label "Node Name">
+
new file mode 100644
--- /dev/null
+++ b/extensions/inspector/resources/locale/fr/viewers/accessibleTree.dtd
@@ -0,0 +1,43 @@
+<!-- ***** BEGIN LICENSE BLOCK *****
+#if 0
+   - Version: MPL 1.1/GPL 2.0/LGPL 2.1
+   -
+   - The contents of this file are subject to the Mozilla Public License Version
+   - 1.1 (the "License"); you may not use this file except in compliance with
+   - the License. You may obtain a copy of the License at
+   - http://www.mozilla.org/MPL/
+   -
+   - Software distributed under the License is distributed on an "AS IS" basis,
+   - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+   - for the specific language governing rights and limitations under the
+   - License.
+   -
+   - The Original Code is DOM Inspector.
+   -
+   - The Initial Developer of the Original Code is
+   - Mozilla Foundation.
+   - Portions created by the Initial Developer are Copyright (C) 2007
+   - the Initial Developer. All Rights Reserved.
+   -
+   - Contributor(s):
+   -   Alexander Surkov <surkov.alexander@gmail.com>
+   -
+   - 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
+   - under the terms of either the GPL or the LGPL, and not to allow others to
+   - use your version of this file under the terms of the MPL, indicate your
+   - decision by deleting the provisions above and replace them with the notice
+   - 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.
+   -
+#endif
+   - ***** END LICENSE BLOCK ***** -->
+
+<!ENTITY role.label "Role">
+<!ENTITY name.label "Name">
+<!ENTITY nodeName.label "Node Name">
+
--- a/extensions/inspector/resources/locale/jar.mn
+++ b/extensions/inspector/resources/locale/jar.mn
@@ -3,16 +3,17 @@
 inspector.jar:
 % locale inspector @AB_CD@ %locale/@AB_CD@/inspector/
 * locale/@AB_CD@/inspector/contents.rdf                 (contents.rdf)
   locale/@AB_CD@/inspector/inspector.dtd                (@AB_CD@/inspector.dtd)
   locale/@AB_CD@/inspector/prefs.dtd                    (@AB_CD@/prefs.dtd)
   locale/@AB_CD@/inspector/editing.dtd                  (@AB_CD@/editing.dtd)
   locale/@AB_CD@/inspector/tasksOverlay.dtd             (@AB_CD@/tasksOverlay.dtd)
 * locale/@AB_CD@/inspector/viewers/accessibleProps.dtd  (@AB_CD@/viewers/accessibleProps.dtd)
+* locale/@AB_CD@/inspector/viewers/accessibleTree.dtd   (@AB_CD@/viewers/accessibleTree.dtd)
 * locale/@AB_CD@/inspector/viewers/dom.dtd              (@AB_CD@/viewers/dom.dtd)
 * locale/@AB_CD@/inspector/viewers/domNode.dtd          (@AB_CD@/viewers/domNode.dtd)
 * locale/@AB_CD@/inspector/viewers/styleRules.dtd       (@AB_CD@/viewers/styleRules.dtd)
 * locale/@AB_CD@/inspector/viewers/stylesheets.dtd      (@AB_CD@/viewers/stylesheets.dtd)
 * locale/@AB_CD@/inspector/viewers/xblBindings.dtd      (@AB_CD@/viewers/xblBindings.dtd)
 * locale/@AB_CD@/inspector/viewers/boxModel.dtd         (@AB_CD@/viewers/boxModel.dtd)
 * locale/@AB_CD@/inspector/viewers/computedStyle.dtd    (@AB_CD@/viewers/computedStyle.dtd)
 * locale/@AB_CD@/inspector/viewers/jsObject.dtd         (@AB_CD@/viewers/jsObject.dtd)
new file mode 100644
--- /dev/null
+++ b/extensions/inspector/resources/locale/nb-NO/viewers/accessibleTree.dtd
@@ -0,0 +1,43 @@
+<!-- ***** BEGIN LICENSE BLOCK *****
+#if 0
+   - Version: MPL 1.1/GPL 2.0/LGPL 2.1
+   -
+   - The contents of this file are subject to the Mozilla Public License Version
+   - 1.1 (the "License"); you may not use this file except in compliance with
+   - the License. You may obtain a copy of the License at
+   - http://www.mozilla.org/MPL/
+   -
+   - Software distributed under the License is distributed on an "AS IS" basis,
+   - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+   - for the specific language governing rights and limitations under the
+   - License.
+   -
+   - The Original Code is DOM Inspector.
+   -
+   - The Initial Developer of the Original Code is
+   - Mozilla Foundation.
+   - Portions created by the Initial Developer are Copyright (C) 2007
+   - the Initial Developer. All Rights Reserved.
+   -
+   - Contributor(s):
+   -   Alexander Surkov <surkov.alexander@gmail.com>
+   -
+   - 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
+   - under the terms of either the GPL or the LGPL, and not to allow others to
+   - use your version of this file under the terms of the MPL, indicate your
+   - decision by deleting the provisions above and replace them with the notice
+   - 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.
+   -
+#endif
+   - ***** END LICENSE BLOCK ***** -->
+
+<!ENTITY role.label "Role">
+<!ENTITY name.label "Name">
+<!ENTITY nodeName.label "Node Name">
+
new file mode 100644
--- /dev/null
+++ b/extensions/inspector/resources/locale/pl/viewers/accessibleTree.dtd
@@ -0,0 +1,43 @@
+<!-- ***** BEGIN LICENSE BLOCK *****
+#if 0
+   - Version: MPL 1.1/GPL 2.0/LGPL 2.1
+   -
+   - The contents of this file are subject to the Mozilla Public License Version
+   - 1.1 (the "License"); you may not use this file except in compliance with
+   - the License. You may obtain a copy of the License at
+   - http://www.mozilla.org/MPL/
+   -
+   - Software distributed under the License is distributed on an "AS IS" basis,
+   - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+   - for the specific language governing rights and limitations under the
+   - License.
+   -
+   - The Original Code is DOM Inspector.
+   -
+   - The Initial Developer of the Original Code is
+   - Mozilla Foundation.
+   - Portions created by the Initial Developer are Copyright (C) 2007
+   - the Initial Developer. All Rights Reserved.
+   -
+   - Contributor(s):
+   -   Alexander Surkov <surkov.alexander@gmail.com>
+   -
+   - 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
+   - under the terms of either the GPL or the LGPL, and not to allow others to
+   - use your version of this file under the terms of the MPL, indicate your
+   - decision by deleting the provisions above and replace them with the notice
+   - 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.
+   -
+#endif
+   - ***** END LICENSE BLOCK ***** -->
+
+<!ENTITY role.label "Role">
+<!ENTITY name.label "Name">
+<!ENTITY nodeName.label "Node Name">
+
new file mode 100644
--- /dev/null
+++ b/extensions/inspector/resources/locale/ru/viewers/accessibleTree.dtd
@@ -0,0 +1,43 @@
+<!-- ***** BEGIN LICENSE BLOCK *****
+#if 0
+   - Version: MPL 1.1/GPL 2.0/LGPL 2.1
+   -
+   - The contents of this file are subject to the Mozilla Public License Version
+   - 1.1 (the "License"); you may not use this file except in compliance with
+   - the License. You may obtain a copy of the License at
+   - http://www.mozilla.org/MPL/
+   -
+   - Software distributed under the License is distributed on an "AS IS" basis,
+   - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+   - for the specific language governing rights and limitations under the
+   - License.
+   -
+   - The Original Code is DOM Inspector.
+   -
+   - The Initial Developer of the Original Code is
+   - Mozilla Foundation.
+   - Portions created by the Initial Developer are Copyright (C) 2007
+   - the Initial Developer. All Rights Reserved.
+   -
+   - Contributor(s):
+   -   Alexander Surkov <surkov.alexander@gmail.com>
+   -
+   - 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
+   - under the terms of either the GPL or the LGPL, and not to allow others to
+   - use your version of this file under the terms of the MPL, indicate your
+   - decision by deleting the provisions above and replace them with the notice
+   - 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.
+   -
+#endif
+   - ***** END LICENSE BLOCK ***** -->
+
+<!ENTITY role.label "Роль">
+<!ENTITY name.label "Имя">
+<!ENTITY nodeName.label "Имя узла">
+