diff options
Diffstat (limited to 'layout/tools/layout-debug/ui/content')
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> |