summaryrefslogtreecommitdiffstats
path: root/layout/tools/layout-debug/ui/content
diff options
context:
space:
mode:
Diffstat (limited to 'layout/tools/layout-debug/ui/content')
-rw-r--r--layout/tools/layout-debug/ui/content/layoutdebug-overlay.xul38
-rw-r--r--layout/tools/layout-debug/ui/content/layoutdebug.js434
-rw-r--r--layout/tools/layout-debug/ui/content/layoutdebug.xul187
3 files changed, 659 insertions, 0 deletions
diff --git a/layout/tools/layout-debug/ui/content/layoutdebug-overlay.xul b/layout/tools/layout-debug/ui/content/layoutdebug-overlay.xul
new file mode 100644
index 000000000..df34e0953
--- /dev/null
+++ b/layout/tools/layout-debug/ui/content/layoutdebug-overlay.xul
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+
+<!--
+ -
+ - This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!--
+ This file contains the nodes that will be overlayed on top of
+ <chrome://communicator/content/tasksOverlay.xul>.
+ Declare XML entites that this file refers to in layoutdebug-overlay.dtd.
+ -->
+
+<!DOCTYPE window SYSTEM "chrome://layoutdebug/locale/layoutdebug-overlay.dtd" >
+
+<overlay id="layoutdebugTaskMenuID"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+<!-- SeaMonkey -->
+<menupopup id="taskPopup">
+ <menuitem label="&ldbCmd.label;"
+ accesskey="&ldbCmd.accesskey;"
+ oncommand="toOpenWindowByType('mozapp:layoutdebug',
+ 'chrome://layoutdebug/content/');"/>
+</menupopup>
+
+<!-- Firefox -->
+<menupopup id="menu_ToolsPopup">
+ <menuitem label="&ldbCmd.label;"
+ accesskey="&ldbCmd.accesskey;"
+ insertafter="javascriptConsole"
+ oncommand="toOpenWindowByType('mozapp:layoutdebug',
+ 'chrome://layoutdebug/content/');"/>
+</menupopup>
+
+</overlay>
diff --git a/layout/tools/layout-debug/ui/content/layoutdebug.js b/layout/tools/layout-debug/ui/content/layoutdebug.js
new file mode 100644
index 000000000..71142fa39
--- /dev/null
+++ b/layout/tools/layout-debug/ui/content/layoutdebug.js
@@ -0,0 +1,434 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var gBrowser;
+var gProgressListener;
+var gDebugger;
+var gRTestIndexList;
+var gRTestURLList = null;
+
+const nsILayoutDebuggingTools = Components.interfaces.nsILayoutDebuggingTools;
+const nsIDocShell = Components.interfaces.nsIDocShell;
+const nsIWebProgressListener = Components.interfaces.nsIWebProgressListener;
+
+const NS_LAYOUT_DEBUGGINGTOOLS_CONTRACTID = "@mozilla.org/layout-debug/layout-debuggingtools;1";
+
+
+function nsLDBBrowserContentListener()
+{
+ this.init();
+}
+
+nsLDBBrowserContentListener.prototype = {
+
+ init : function()
+ {
+ this.mStatusText = document.getElementById("status-text");
+ this.mURLBar = document.getElementById("urlbar");
+ this.mForwardButton = document.getElementById("forward-button");
+ this.mBackButton = document.getElementById("back-button");
+ this.mStopButton = document.getElementById("stop-button");
+ },
+
+ QueryInterface : function(aIID)
+ {
+ if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
+ aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
+ aIID.equals(Components.interfaces.nsISupports))
+ return this;
+ throw Components.results.NS_NOINTERFACE;
+ },
+
+ // nsIWebProgressListener implementation
+ onStateChange : function(aWebProgress, aRequest, aStateFlags, aStatus)
+ {
+ if (!(aStateFlags & nsIWebProgressListener.STATE_IS_NETWORK) ||
+ aWebProgress != gBrowser.webProgress)
+ return;
+
+ if (aStateFlags & nsIWebProgressListener.STATE_START) {
+ this.setButtonEnabled(this.mStopButton, true);
+ this.setButtonEnabled(this.mForwardButton, gBrowser.canGoForward);
+ this.setButtonEnabled(this.mBackButton, gBrowser.canGoBack);
+ this.mStatusText.value = "loading...";
+ this.mLoading = true;
+
+ } else if (aStateFlags & nsIWebProgressListener.STATE_STOP) {
+ this.setButtonEnabled(this.mStopButton, false);
+ this.mStatusText.value = this.mURLBar.value + " loaded";
+
+ if (gRTestURLList && this.mLoading) {
+ // Let other things happen in the first 20ms, since this
+ // doesn't really seem to be when the page is done loading.
+ setTimeout("gRTestURLList.doneURL()", 20);
+ }
+ this.mLoading = false;
+ }
+ },
+
+ onProgressChange : function(aWebProgress, aRequest,
+ aCurSelfProgress, aMaxSelfProgress,
+ aCurTotalProgress, aMaxTotalProgress)
+ {
+ },
+
+ onLocationChange : function(aWebProgress, aRequest, aLocation, aFlags)
+ {
+ this.mURLBar.value = aLocation.spec;
+ this.setButtonEnabled(this.mForwardButton, gBrowser.canGoForward);
+ this.setButtonEnabled(this.mBackButton, gBrowser.canGoBack);
+ },
+
+ onStatusChange : function(aWebProgress, aRequest, aStatus, aMessage)
+ {
+ this.mStatusText.value = aMessage;
+ },
+
+ onSecurityChange : function(aWebProgress, aRequest, aState)
+ {
+ },
+
+ // non-interface methods
+ setButtonEnabled : function(aButtonElement, aEnabled)
+ {
+ if (aEnabled)
+ aButtonElement.removeAttribute("disabled");
+ else
+ aButtonElement.setAttribute("disabled", "true");
+ },
+
+ mStatusText : null,
+ mURLBar : null,
+ mForwardButton : null,
+ mBackButton : null,
+ mStopButton : null,
+
+ mLoading : false
+
+}
+
+function OnLDBLoad()
+{
+ gBrowser = document.getElementById("browser");
+
+ gProgressListener = new nsLDBBrowserContentListener();
+ gBrowser.addProgressListener(gProgressListener);
+
+ gDebugger = Components.classes[NS_LAYOUT_DEBUGGINGTOOLS_CONTRACTID].
+ createInstance(nsILayoutDebuggingTools);
+
+ if (window.arguments && window.arguments[0])
+ gBrowser.loadURI(window.arguments[0]);
+ else
+ gBrowser.goHome();
+
+ gDebugger.init(gBrowser.contentWindow);
+
+ checkPersistentMenus();
+ gRTestIndexList = new RTestIndexList();
+}
+
+function checkPersistentMenu(item)
+{
+ var menuitem = document.getElementById("menu_" + item);
+ menuitem.setAttribute("checked", gDebugger[item]);
+}
+
+function checkPersistentMenus()
+{
+ // Restore the toggles that are stored in prefs.
+ checkPersistentMenu("paintFlashing");
+ checkPersistentMenu("paintDumping");
+ checkPersistentMenu("invalidateDumping");
+ checkPersistentMenu("eventDumping");
+ checkPersistentMenu("motionEventDumping");
+ checkPersistentMenu("crossingEventDumping");
+ checkPersistentMenu("reflowCounts");
+}
+
+
+function OnLDBUnload()
+{
+ gBrowser.removeProgressListener(gProgressListener);
+}
+
+function toggle(menuitem)
+{
+ // trim the initial "menu_"
+ var feature = menuitem.id.substring(5);
+ gDebugger[feature] = menuitem.getAttribute("checked") == "true";
+}
+
+function openFile()
+{
+ var nsIFilePicker = Components.interfaces.nsIFilePicker;
+ var fp = Components.classes["@mozilla.org/filepicker;1"]
+ .createInstance(nsIFilePicker);
+ fp.init(window, "Select a File", nsIFilePicker.modeOpen);
+ fp.appendFilters(nsIFilePicker.filterHTML | nsIFilePicker.filterAll);
+ if (fp.show() == nsIFilePicker.returnOK && fp.fileURL.spec &&
+ fp.fileURL.spec.length > 0) {
+ gBrowser.loadURI(fp.fileURL.spec);
+ }
+}
+const LDB_RDFNS = "http://mozilla.org/newlayout/LDB-rdf#";
+const NC_RDFNS = "http://home.netscape.com/NC-rdf#";
+
+function RTestIndexList() {
+ this.init();
+}
+
+RTestIndexList.prototype = {
+
+ init : function()
+ {
+ const nsIPrefService = Components.interfaces.nsIPrefService;
+ const PREF_SERVICE_CONTRACTID = "@mozilla.org/preferences-service;1";
+ const PREF_BRANCH_NAME = "layout_debugger.rtest_url.";
+ const nsIRDFService = Components.interfaces.nsIRDFService;
+ const RDF_SERVICE_CONTRACTID = "@mozilla.org/rdf/rdf-service;1";
+ const nsIRDFDataSource = Components.interfaces.nsIRDFDataSource;
+ const RDF_DATASOURCE_CONTRACTID =
+ "@mozilla.org/rdf/datasource;1?name=in-memory-datasource";
+
+ this.mPrefService = Components.classes[PREF_SERVICE_CONTRACTID].
+ getService(nsIPrefService);
+ this.mPrefBranch = this.mPrefService.getBranch(PREF_BRANCH_NAME);
+
+ this.mRDFService = Components.classes[RDF_SERVICE_CONTRACTID].
+ getService(nsIRDFService);
+ this.mDataSource = Components.classes[RDF_DATASOURCE_CONTRACTID].
+ createInstance(nsIRDFDataSource);
+
+ this.mLDB_Root = this.mRDFService.GetResource(LDB_RDFNS + "Root");
+ this.mNC_Name = this.mRDFService.GetResource(NC_RDFNS + "name");
+ this.mNC_Child = this.mRDFService.GetResource(NC_RDFNS + "child");
+
+ this.load();
+
+ document.getElementById("menu_RTest_baseline").database.
+ AddDataSource(this.mDataSource);
+ document.getElementById("menu_RTest_verify").database.
+ AddDataSource(this.mDataSource);
+ document.getElementById("menu_RTest_remove").database.
+ AddDataSource(this.mDataSource);
+ },
+
+ save : function()
+ {
+ this.mPrefBranch.deleteBranch("");
+
+ const nsIRDFLiteral = Components.interfaces.nsIRDFLiteral;
+ const nsIRDFResource = Components.interfaces.nsIRDFResource;
+ var etor = this.mDataSource.GetTargets(this.mLDB_Root,
+ this.mNC_Child, true);
+ var i = 0;
+ while (etor.hasMoreElements()) {
+ var resource = etor.getNext().QueryInterface(nsIRDFResource);
+ var literal = this.mDataSource.GetTarget(resource, this.mNC_Name, true);
+ literal = literal.QueryInterface(nsIRDFLiteral);
+ this.mPrefBranch.setCharPref(i.toString(), literal.Value);
+ ++i;
+ }
+
+ this.mPrefService.savePrefFile(null);
+ },
+
+ load : function()
+ {
+ var prefList = this.mPrefBranch.getChildList("");
+
+ var i = 0;
+ for (var pref in prefList) {
+ var file = this.mPrefBranch.getCharPref(pref);
+ var resource = this.mRDFService.GetResource(file);
+ var literal = this.mRDFService.GetLiteral(file);
+ this.mDataSource.Assert(this.mLDB_Root, this.mNC_Child, resource, true);
+ this.mDataSource.Assert(resource, this.mNC_Name, literal, true);
+ ++i;
+ }
+
+ },
+
+ /* Add a new list of regression tests to the menus. */
+ add : function()
+ {
+ const nsIFilePicker = Components.interfaces.nsIFilePicker;
+ const NS_FILEPICKER_CONTRACTID = "@mozilla.org/filepicker;1";
+
+ var fp = Components.classes[NS_FILEPICKER_CONTRACTID].
+ createInstance(nsIFilePicker);
+
+ // XXX l10n (but this is just for 5 developers, so no problem)
+ fp.init(window, "New Regression Test List", nsIFilePicker.modeOpen);
+ fp.appendFilters(nsIFilePicker.filterAll);
+ fp.defaultString = "rtest.lst";
+ if (fp.show() != nsIFilePicker.returnOK)
+ return;
+
+ var file = fp.file.persistentDescriptor;
+ var resource = this.mRDFService.GetResource(file);
+ var literal = this.mRDFService.GetLiteral(file);
+ this.mDataSource.Assert(this.mLDB_Root, this.mNC_Child, resource, true);
+ this.mDataSource.Assert(resource, this.mNC_Name, literal, true);
+
+ this.save();
+
+ },
+
+ remove : function(file)
+ {
+ var resource = this.mRDFService.GetResource(file);
+ var literal = this.mRDFService.GetLiteral(file);
+ this.mDataSource.Unassert(this.mLDB_Root, this.mNC_Child, resource);
+ this.mDataSource.Unassert(resource, this.mNC_Name, literal);
+
+ this.save();
+ },
+
+ mPrefBranch : null,
+ mPrefService : null,
+ mRDFService : null,
+ mDataSource : null,
+ mLDB_Root : null,
+ mNC_Child : null,
+ mNC_Name : null
+}
+
+const nsIFileInputStream = Components.interfaces.nsIFileInputStream;
+const nsILineInputStream = Components.interfaces.nsILineInputStream;
+const nsIFile = Components.interfaces.nsIFile;
+const nsILocalFile = Components.interfaces.nsILocalFile;
+const nsIFileURL = Components.interfaces.nsIFileURL;
+const nsIIOService = Components.interfaces.nsIIOService;
+const nsILayoutRegressionTester = Components.interfaces.nsILayoutRegressionTester;
+
+const NS_LOCAL_FILE_CONTRACTID = "@mozilla.org/file/local;1";
+const IO_SERVICE_CONTRACTID = "@mozilla.org/network/io-service;1";
+const NS_LOCALFILEINPUTSTREAM_CONTRACTID =
+ "@mozilla.org/network/file-input-stream;1";
+
+
+function RunRTest(aFilename, aIsBaseline, aIsPrinting)
+{
+ if (gRTestURLList) {
+ // XXX Does alert work?
+ alert("Already running regression test.\n");
+ return;
+ }
+ dump("Running " + (aIsBaseline?"baseline":"verify") +
+ (aIsPrinting?" PrintMode":"") + " test for " + aFilename + ".\n");
+
+ var listFile = Components.classes[NS_LOCAL_FILE_CONTRACTID].
+ createInstance(nsILocalFile);
+ listFile.persistentDescriptor = aFilename;
+ gRTestURLList = new RTestURLList(listFile, aIsBaseline, aIsPrinting);
+ gRTestURLList.startURL();
+}
+
+function RTestURLList(aLocalFile, aIsBaseline, aIsPrinting) {
+ this.init(aLocalFile, aIsBaseline, aIsPrinting);
+}
+
+RTestURLList.prototype = {
+ init : function(aLocalFile, aIsBaseline, aIsPrinting)
+ {
+ this.mIsBaseline = aIsBaseline;
+ this.mIsPrinting = aIsPrinting;
+ this.mURLs = new Array();
+ this.readFileList(aLocalFile);
+ this.mRegressionTester =
+ Components.classes["@mozilla.org/layout-debug/regressiontester;1"].
+ createInstance(nsILayoutRegressionTester)
+ },
+
+ readFileList : function(aLocalFile)
+ {
+ var ios = Components.classes[IO_SERVICE_CONTRACTID]
+ .getService(nsIIOService);
+ var dirURL = ios.newFileURI(aLocalFile.parent);
+
+ var fis = Components.classes[NS_LOCALFILEINPUTSTREAM_CONTRACTID].
+ createInstance(nsIFileInputStream);
+ fis.init(aLocalFile, -1, -1, false);
+ var lis = fis.QueryInterface(nsILineInputStream);
+
+ var line = {value:null};
+ do {
+ var more = lis.readLine(line);
+ var str = line.value;
+ str = /^[^#]*/.exec(str); // strip everything after "#"
+ str = /\S*/.exec(str); // take the first chunk of non-whitespace
+ if (!str || str == "")
+ continue;
+
+ var item = dirURL.resolve(str);
+ if (item.match(/\/rtest.lst$/)) {
+ var itemurl = ios.newURI(item, null, null);
+ itemurl = itemurl.QueryInterface(nsIFileURL);
+ this.readFileList(itemurl.file);
+ } else {
+ this.mURLs.push( {url:item, dir:aLocalFile.parent, relurl:str} );
+ }
+ } while (more);
+ },
+
+ doneURL : function()
+ {
+ var basename =
+ String(this.mCurrentURL.relurl).replace(/[:=&.\/?]/g, "_") + ".rgd";
+
+ var data = this.mCurrentURL.dir.clone();
+ data.append( this.mIsBaseline ? "baseline" : "verify");
+ if (!data.exists())
+ data.create(nsIFile.DIRECTORY_TYPE, 0o777)
+ data.append(basename);
+
+ dump("Writing regression data to " +
+ data.QueryInterface(nsILocalFile).persistentDescriptor + "\n");
+ if (this.mIsPrinting) {
+ this.mRegressionTester.dumpFrameModel(gBrowser.contentWindow, data,
+ nsILayoutRegressionTester.DUMP_FLAGS_MASK_PRINT_MODE);
+ }
+ else {
+ this.mRegressionTester.dumpFrameModel(gBrowser.contentWindow, data, 0);
+ }
+
+
+
+ if (!this.mIsBaseline) {
+ var base_data = this.mCurrentURL.dir.clone();
+ base_data.append("baseline");
+ base_data.append(basename);
+ dump("Comparing to regression data from " +
+ base_data.QueryInterface(nsILocalFile).persistentDescriptor + "\n");
+ var filesDiffer =
+ this.mRegressionTester.compareFrameModels(base_data, data,
+ nsILayoutRegressionTester.COMPARE_FLAGS_BRIEF)
+ dump("Comparison for " + this.mCurrentURL.url + " " +
+ (filesDiffer ? "failed" : "passed") + ".\n");
+ }
+
+ this.mCurrentURL = null;
+
+ this.startURL();
+ },
+
+ startURL : function()
+ {
+ this.mCurrentURL = this.mURLs.shift();
+ if (!this.mCurrentURL) {
+ gRTestURLList = null;
+ return;
+ }
+
+ gBrowser.loadURI(this.mCurrentURL.url);
+ },
+
+ mURLs : null,
+ mCurrentURL : null, // url (string), dir (nsIFileURL), relurl (string)
+ mIsBaseline : null,
+ mRegressionTester : null,
+ mIsPrinting : null
+}
diff --git a/layout/tools/layout-debug/ui/content/layoutdebug.xul b/layout/tools/layout-debug/ui/content/layoutdebug.xul
new file mode 100644
index 000000000..8de04847f
--- /dev/null
+++ b/layout/tools/layout-debug/ui/content/layoutdebug.xul
@@ -0,0 +1,187 @@
+<?xml version="1.0"?>
+<!-- vim: set shiftwidth=2 tabstop=8 expandtab :
+ -
+ -
+ - This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!DOCTYPE window [
+ <!ENTITY % layoutdebugDTD
+ SYSTEM "chrome://layoutdebug/locale/layoutdebug.dtd">
+ %layoutdebugDTD;
+
+ <!ENTITY W3C_RDFNS "http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <!ENTITY NC_RDFNS "http://home.netscape.com/NC-rdf#">
+ <!ENTITY LDB_RDFNS "http://mozilla.org/newlayout/LDB-rdf#">
+]>
+
+<?xml-stylesheet href="chrome://communicator/skin/" type="text/css" ?>
+
+<?xul-overlay href="chrome://global/content/globalOverlay.xul"?>
+<?xul-overlay href="chrome://communicator/content/tasksOverlay.xul"?>
+
+<!--
+
+ NOTE: Because this window is used for layout regression tests, the
+ persist attribute should never be used on anything. Otherwise there
+ is a risk of running baseline and verify runs under different
+ conditions.
+
+-->
+
+<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:rdf="&W3C_RDFNS;"
+ id="main-window"
+ align="stretch"
+ title="&ldb.MainWindow.title;"
+ titlemodifier="&ldb.MainWindow.title;"
+ contenttitlesetting="true"
+ titlemenuseparator=" - "
+ windowtype="mozapp:layoutdebug"
+ onload="OnLDBLoad();"
+ onunload="OnLDBUnload();"
+ width="610" height="450"
+ screenX="4" screenY="4"
+ >
+
+ <script src="chrome://layoutdebug/content/layoutdebug.js"/>
+
+ <commandset id="tasksCommands">
+ <command id="cmd_close" oncommand="window.close();"/>
+ <command id="cmd_quit"/>
+ </commandset>
+
+ <keyset id="tasksKeys">
+ <key id="openFileKb" key="&ldb.Open.commandkey;" oncommand="openFile()" modifiers="accel"/>
+ <key id="key_close"/>
+ <key id="key_quit"/>
+ </keyset>
+
+ <vbox flex="1">
+
+ <toolbox>
+ <menubar id="main-menubar" grippyhidden="true">
+ <menu id="menu_file" label="File" accesskey="F">
+ <menupopup id="menu_FilePopup">
+ <menuitem id="menu_open" label="&ldb.Open.label;" accesskey="&ldb.Open.accesskey;" key="openFileKb" oncommand="openFile()"/>
+ <menuitem id="menu_close" label="Close" accesskey="C" oncommand="window.close();"/>
+ </menupopup>
+ </menu>
+ <menu label="&ldb.RegressionTestMenu.label;"
+ accesskey="&ldb.RegressionTestMenu.accesskey;">
+ <menupopup>
+ <menuitem type="checkbox" id="menu_RTestPrintMode" label="&ldb.RegressionPrintMode.label;" accesskey="&ldb.RegressionPrintMode.accesskey;"/>
+ <menu label="&ldb.RunBaselineMenu.label;"
+ accesskey="&ldb.RunBaselineMenu.accesskey;"
+ id="menu_RTest_baseline"
+ datasources="rdf:null"
+ containment="&NC_RDFNS;child"
+ ref="&LDB_RDFNS;Root">
+ <template>
+ <menupopup>
+ <menuitem uri="rdf:*"
+ label="rdf:&NC_RDFNS;name"
+ name="rdf:&NC_RDFNS;name"
+ oncommand="RunRTest(this.getAttribute('name'), true, document.getElementById('menu_RTestPrintMode').getAttribute('checked'));" />
+ </menupopup>
+ </template>
+ </menu>
+ <menu label="&ldb.RunVerifyMenu.label;"
+ accesskey="&ldb.RunVerifyMenu.accesskey;"
+ id="menu_RTest_verify"
+ datasources="rdf:null"
+ containment="&NC_RDFNS;child"
+ ref="&LDB_RDFNS;Root">
+ <template>
+ <menupopup>
+ <menuitem uri="rdf:*"
+ label="rdf:&NC_RDFNS;name"
+ name="rdf:&NC_RDFNS;name"
+ oncommand="RunRTest(this.getAttribute('name'), false, document.getElementById('menu_RTestPrintMode').getAttribute('checked'));" />
+ </menupopup>
+ </template>
+ </menu>
+ <menuseparator />
+ <menuitem id="menu_AddNewList" label="&ldb.AddNewList.label;" accesskey="&ldb.AddNewList.accesskey;" oncommand="gRTestIndexList.add();" />
+ <menu label="&ldb.RemoveListMenu.label;"
+ accesskey="&ldb.RemoveListMenu.accesskey;"
+ id="menu_RTest_remove"
+ datasources="rdf:null"
+ containment="&NC_RDFNS;child"
+ ref="&LDB_RDFNS;Root">
+ <template>
+ <menupopup>
+ <menuitem uri="rdf:*"
+ label="rdf:&NC_RDFNS;name"
+ name="rdf:&NC_RDFNS;name"
+ oncommand="gRTestIndexList.remove(this.getAttribute('name'));" />
+ </menupopup>
+ </template>
+ </menu>
+ </menupopup>
+ </menu>
+ <menu label="&ldb.ToggleMenu.label;"
+ accesskey="&ldb.ToggleMenu.accesskey;">
+ <menupopup>
+ <menuitem type="checkbox" id="menu_visualDebugging" label="&ldb.visualDebugging.label;" accesskey="&ldb.visualDebugging.accesskey;" oncommand="toggle(this);" />
+ <menuitem type="checkbox" id="menu_visualEventDebugging" label="&ldb.visualEventDebugging.label;" accesskey="&ldb.visualEventDebugging.accesskey;" oncommand="toggle(this);" />
+ <menuseparator />
+ <menuitem type="checkbox" id="menu_paintFlashing" label="&ldb.paintFlashing.label;" accesskey="&ldb.paintFlashing.accesskey;" oncommand="toggle(this);" />
+ <menuitem type="checkbox" id="menu_paintDumping" label="&ldb.paintDumping.label;" accesskey="&ldb.paintDumping.accesskey;" oncommand="toggle(this);" />
+ <menuitem type="checkbox" id="menu_invalidateDumping" label="&ldb.invalidateDumping.label;" accesskey="&ldb.invalidateDumping.accesskey;" oncommand="toggle(this);" />
+ <menuseparator />
+ <menuitem type="checkbox" id="menu_eventDumping" label="&ldb.eventDumping.label;" accesskey="&ldb.eventDumping.accesskey;" oncommand="toggle(this);" />
+ <menuitem type="checkbox" id="menu_motionEventDumping" label="&ldb.motionEventDumping.label;" accesskey="&ldb.motionEventDumping.accesskey;" oncommand="toggle(this);" />
+ <menuitem type="checkbox" id="menu_crossingEventDumping" label="&ldb.crossingEventDumping.label;" accesskey="&ldb.crossingEventDumping.accesskey;" oncommand="toggle(this);" />
+ <menuseparator />
+ <menuitem type="checkbox" id="menu_reflowCounts" label="&ldb.reflowCounts.label;" accesskey="&ldb.reflowCounts.accesskey;" oncommand="toggle(this);" />
+ </menupopup>
+ </menu>
+ <menu label="&ldb.DumpMenu.label;"
+ accesskey="&ldb.DumpMenu.accesskey;">
+ <menupopup>
+ <menuitem id="menu_dumpWebShells" label="&ldb.dumpWebShells.label;" accesskey="&ldb.dumpWebShells.accesskey;" oncommand="gDebugger.dumpWebShells();" />
+ <menuitem id="menu_dumpContent" label="&ldb.dumpContent.label;" accesskey="&ldb.dumpContent.accesskey;" oncommand="gDebugger.dumpContent();" />
+ <menuitem id="menu_dumpFrames" label="&ldb.dumpFrames.label;" accesskey="&ldb.dumpFrames.accesskey;" oncommand="gDebugger.dumpFrames();" />
+ <menuitem id="menu_dumpViews" label="&ldb.dumpViews.label;" accesskey="&ldb.dumpViews.accesskey;" oncommand="gDebugger.dumpViews();" />
+ <menuseparator />
+ <menuitem id="menu_dumpStyleSheets" label="&ldb.dumpStyleSheets.label;" accesskey="&ldb.dumpStyleSheets.accesskey;" oncommand="gDebugger.dumpStyleSheets();" />
+ <menuitem id="menu_dumpStyleContexts" label="&ldb.dumpStyleContexts.label;" accesskey="&ldb.dumpStyleContexts.accesskey;" oncommand="gDebugger.dumpStyleContexts();" />
+ <menuseparator />
+ <menuitem id="menu_dumpReflowStats" label="&ldb.dumpReflowStats.label;" accesskey="&ldb.dumpReflowStats.accesskey;" oncommand="gDebugger.dumpReflowStats();" />
+ </menupopup>
+ </menu>
+ <menu id="tasksMenu"/>
+ <menu id="windowMenu"/>
+ <menu id="menu_Help"/>
+ </menubar>
+
+ <toolbar grippyhidden="true">
+ <toolbarbutton id="back-button" class="toolbarbutton-1"
+ label="&ldb.BackButton.label;"
+ oncommand="gBrowser.goBack();" />
+ <toolbarbutton id="forward-button" class="toolbarbutton-1"
+ label="&ldb.ForwardButton.label;"
+ oncommand="gBrowser.goForward();" />
+ <toolbarbutton id="reload-button" class="toolbarbutton-1"
+ label="&ldb.ReloadButton.label;"
+ oncommand="gBrowser.reload();" />
+ <toolbarbutton id="stop-button" class="toolbarbutton-1"
+ label="&ldb.StopButton.label;"
+ oncommand="gBrowser.stop();" />
+
+ <textbox id="urlbar" flex="1"
+ onkeypress="if (event.keyCode == 13)
+ gBrowser.loadURI(this.value);" />
+ </toolbar>
+ </toolbox>
+
+ <browser flex="1" id="browser" type="content-primary"
+ homepage="about:blank" />
+
+ <hbox>
+ <description id="status-text" value="" />
+ </hbox>
+ </vbox>
+</window>