From 35cfa1cd01752e57d67ac3f85a43866a288894b5 Mon Sep 17 00:00:00 2001 From: David Creswick Date: Tue, 19 Feb 2013 10:48:05 +0000 Subject: [PATCH 01/15] Bug 840156 - Inspector doesn't gracefully handle onDOMReady event that fires after the inspector has been destroyed; r=jwalker,paul --- browser/devtools/inspector/InspectorPanel.jsm | 4 ++ browser/devtools/inspector/test/Makefile.in | 1 + ...tor_bug_840156_destroy_after_navigation.js | 61 +++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 browser/devtools/inspector/test/browser_inspector_bug_840156_destroy_after_navigation.js diff --git a/browser/devtools/inspector/InspectorPanel.jsm b/browser/devtools/inspector/InspectorPanel.jsm index 9e728e3291b8..95deb03c2350 100644 --- a/browser/devtools/inspector/InspectorPanel.jsm +++ b/browser/devtools/inspector/InspectorPanel.jsm @@ -242,6 +242,10 @@ InspectorPanel.prototype = { function onDOMReady() { newWindow.removeEventListener("DOMContentLoaded", onDOMReady, true); + if (self._destroyed) { + return; + } + if (!self.selection.node) { self.selection.setNode(newWindow.document.documentElement); } diff --git a/browser/devtools/inspector/test/Makefile.in b/browser/devtools/inspector/test/Makefile.in index b330e8de8ddd..63439939e2f0 100644 --- a/browser/devtools/inspector/test/Makefile.in +++ b/browser/devtools/inspector/test/Makefile.in @@ -38,6 +38,7 @@ _BROWSER_FILES = \ browser_inspector_bug_817558_delete_node.js \ browser_inspector_bug_650804_search.js \ browser_inspector_bug_650804_search.html \ + browser_inspector_bug_840156_destroy_after_navigation.js \ head.js \ helpers.js \ $(NULL) diff --git a/browser/devtools/inspector/test/browser_inspector_bug_840156_destroy_after_navigation.js b/browser/devtools/inspector/test/browser_inspector_bug_840156_destroy_after_navigation.js new file mode 100644 index 000000000000..01d1569da5e8 --- /dev/null +++ b/browser/devtools/inspector/test/browser_inspector_bug_840156_destroy_after_navigation.js @@ -0,0 +1,61 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +let temp = {}; +Cu.import("resource://gre/modules/commonjs/sdk/core/promise.js", temp); +let Promise = temp.Promise; +temp = {}; +Cu.import("resource:///modules/devtools/Toolbox.jsm", temp); +let Toolbox = temp.Toolbox; +temp = {}; +Cu.import("resource:///modules/devtools/Target.jsm", temp); +let TargetFactory = temp.TargetFactory; +temp = null; + +function test() { + waitForExplicitFinish(); + + const URL_1 = "data:text/plain;charset=UTF-8,abcde"; + const URL_2 = "data:text/plain;charset=UTF-8,12345"; + + let target, toolbox; + + // open tab, load URL_1, and wait for load to finish + let tab = gBrowser.selectedTab = gBrowser.addTab(); + let target = TargetFactory.forTab(gBrowser.selectedTab); + let deferred = Promise.defer(); + let browser = gBrowser.getBrowserForTab(tab); + function onTabLoad() { + browser.removeEventListener("load", onTabLoad, true); + deferred.resolve(null); + } + browser.addEventListener("load", onTabLoad, true); + browser.loadURI(URL_1); + + // open devtools panel + deferred.promise + .then(function () gDevTools.showToolbox(target, null, Toolbox.HostType.BOTTOM)) + .then(function (aToolbox) { toolbox = aToolbox; }) + + // select the inspector + .then(function () toolbox.selectTool("inspector")) + + // navigate to URL_2 + .then(function () { + let deferred = Promise.defer(); + target.once("navigate", function () deferred.resolve()); + browser.loadURI(URL_2); + return deferred.promise; + }) + + // destroy the toolbox (and hence the inspector) before the load completes + .then(function () toolbox.destroy()) + + // this (or any other) exception should not occur: + // [JavaScript Error: "TypeError: self.selection is null" {file: "resource:///modules/devtools/InspectorPanel.jsm" line: 250}] + + .then(function cleanUp() { + gBrowser.removeCurrentTab(); + finish(); + }); +} From 27f46065853c8a00e239d76024ac52add9d20b84 Mon Sep 17 00:00:00 2001 From: David Creswick Date: Tue, 19 Feb 2013 10:54:01 +0000 Subject: [PATCH 02/15] Bug 734664 - Devtools toolbox should display the actual target url when detached. r=paul --- browser/devtools/framework/Toolbox.jsm | 37 +++++++++- browser/devtools/framework/ToolboxHosts.jsm | 21 ++++++ browser/devtools/framework/test/Makefile.in | 1 + .../browser_toolbox_window_title_changes.js | 69 +++++++++++++++++++ browser/devtools/framework/toolbox-window.xul | 1 - .../en-US/chrome/browser/devtools/toolbox.dtd | 4 +- .../browser/devtools/toolbox.properties | 10 +++ 7 files changed, 136 insertions(+), 7 deletions(-) create mode 100644 browser/devtools/framework/test/browser_toolbox_window_title_changes.js diff --git a/browser/devtools/framework/Toolbox.jsm b/browser/devtools/framework/Toolbox.jsm index 13951cc9c727..d8820b11eb05 100644 --- a/browser/devtools/framework/Toolbox.jsm +++ b/browser/devtools/framework/Toolbox.jsm @@ -19,11 +19,15 @@ XPCOMUtils.defineLazyModuleGetter(this, "CommandUtils", XPCOMUtils.defineLazyGetter(this, "toolboxStrings", function() { let bundle = Services.strings.createBundle("chrome://browser/locale/devtools/toolbox.properties"); - let l10n = function(name) { + let l10n = function(aName, ...aArgs) { try { - return bundle.GetStringFromName(name); + if (aArgs.length == 0) { + return bundle.GetStringFromName(aName); + } else { + return bundle.formatStringFromName(aName, aArgs, aArgs.length); + } } catch (ex) { - Services.console.logStringMessage("Error reading '" + name + "'"); + Services.console.logStringMessage("Error reading '" + aName + "'"); } }; return l10n; @@ -140,6 +144,11 @@ this.Toolbox = function Toolbox(target, selectedTool, hostType) { EventEmitter.decorate(this); + this._refreshHostTitle = this._refreshHostTitle.bind(this); + this._target.on("navigate", this._refreshHostTitle); + this.on("host-changed", this._refreshHostTitle); + this.on("select", this._refreshHostTitle); + gDevTools.on("tool-registered", this._toolRegistered); gDevTools.on("tool-unregistered", this._toolUnregistered); } @@ -508,6 +517,24 @@ Toolbox.prototype = { this._host.raise(); }, + /** + * Refresh the host's title. + */ + _refreshHostTitle: function TBOX_refreshHostTitle() { + let toolName; + let toolId = this.currentToolId; + if (toolId) { + let toolDef = gDevTools.getToolDefinitionMap().get(toolId); + toolName = toolDef.label; + } else { + // no tool is selected + toolName = toolboxStrings("toolbox.defaultTitle"); + } + let title = toolboxStrings("toolbox.titleTemplate", + toolName, this.target.url); + this._host.setTitle(title); + }, + /** * Create a host object based on the given host type. * @@ -649,6 +676,10 @@ Toolbox.prototype = { return this._destroyer; } + this._target.off("navigate", this._refreshHostTitle); + this.off("select", this._refreshHostTitle); + this.off("host-changed", this._refreshHostTitle); + let outstanding = []; // Remote targets need to be notified that the toolbox is being torn down. diff --git a/browser/devtools/framework/ToolboxHosts.jsm b/browser/devtools/framework/ToolboxHosts.jsm index 58b25309d600..f7bac42eaeff 100644 --- a/browser/devtools/framework/ToolboxHosts.jsm +++ b/browser/devtools/framework/ToolboxHosts.jsm @@ -85,6 +85,13 @@ BottomHost.prototype = { focusTab(this.hostTab); }, + /** + * Set the toolbox title. + */ + setTitle: function BH_setTitle(title) { + // Nothing to do for this host type. + }, + /** * Destroy the bottom dock. */ @@ -158,6 +165,13 @@ SidebarHost.prototype = { focusTab(this.hostTab); }, + /** + * Set the toolbox title. + */ + setTitle: function SH_setTitle(title) { + // Nothing to do for this host type. + }, + /** * Destroy the sidebar. */ @@ -235,6 +249,13 @@ WindowHost.prototype = { this._window.focus(); }, + /** + * Set the toolbox title. + */ + setTitle: function WH_setTitle(title) { + this._window.document.title = title; + }, + /** * Destroy the window. */ diff --git a/browser/devtools/framework/test/Makefile.in b/browser/devtools/framework/test/Makefile.in index 4c364cbeaf6b..5cc458519284 100644 --- a/browser/devtools/framework/test/Makefile.in +++ b/browser/devtools/framework/test/Makefile.in @@ -22,6 +22,7 @@ MOCHITEST_BROWSER_FILES = \ browser_toolbox_tool_ready.js \ browser_toolbox_sidebar.js \ browser_toolbox_window_shortcuts.js \ + browser_toolbox_window_title_changes.js \ $(NULL) include $(topsrcdir)/config/rules.mk diff --git a/browser/devtools/framework/test/browser_toolbox_window_title_changes.js b/browser/devtools/framework/test/browser_toolbox_window_title_changes.js new file mode 100644 index 000000000000..ec370db524d8 --- /dev/null +++ b/browser/devtools/framework/test/browser_toolbox_window_title_changes.js @@ -0,0 +1,69 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +let temp = {}; +Cu.import("resource:///modules/devtools/Toolbox.jsm", temp); +let Toolbox = temp.Toolbox; +temp = null; + +function test() { + waitForExplicitFinish(); + + const URL_1 = "data:text/plain;charset=UTF-8,abcde"; + const URL_2 = "data:text/plain;charset=UTF-8,12345"; + + const TOOL_ID_1 = "webconsole"; + const TOOL_ID_2 = "jsdebugger"; + + const LABEL_1 = "Web Console"; + const LABEL_2 = "Debugger"; + + let toolbox; + + addTab(URL_1, function () { + let target = TargetFactory.forTab(gBrowser.selectedTab); + gDevTools.showToolbox(target, null, Toolbox.HostType.BOTTOM) + .then(function (aToolbox) { toolbox = aToolbox; }) + .then(function () toolbox.selectTool(TOOL_ID_1)) + + // undock toolbox and check title + .then(function () toolbox.switchHost(Toolbox.HostType.WINDOW)) + .then(checkTitle.bind(null, LABEL_1, URL_1, "toolbox undocked")) + + // switch to different tool and check title + .then(function () toolbox.selectTool(TOOL_ID_2)) + .then(checkTitle.bind(null, LABEL_2, URL_1, "tool changed")) + + // navigate to different url and check title + .then(function () { + let deferred = Promise.defer(); + target.once("navigate", function () deferred.resolve()); + gBrowser.loadURI(URL_2); + return deferred.promise; + }) + .then(checkTitle.bind(null, LABEL_2, URL_2, "url changed")) + + // destroy toolbox, create new one hosted in a window (with a + // different tool id), and check title + .then(function () toolbox.destroy()) + .then(function () gDevTools.showToolbox(target, null, + Toolbox.HostType.WINDOW)) + .then(function (aToolbox) { toolbox = aToolbox; }) + .then(function () toolbox.selectTool(TOOL_ID_1)) + .then(checkTitle.bind(null, LABEL_1, URL_2, + "toolbox destroyed and recreated")) + + .then(function cleanUp() { + toolbox.destroy(); + gBrowser.removeCurrentTab(); + finish(); + }); + }); +} + +function checkTitle(toolLabel, url, context) { + let win = Services.wm.getMostRecentWindow("devtools:toolbox"); + let definitions = gDevTools.getToolDefinitionMap(); + let expectedTitle = toolLabel + " - " + url; + is(win.document.title, expectedTitle, context); +} diff --git a/browser/devtools/framework/toolbox-window.xul b/browser/devtools/framework/toolbox-window.xul index d0eb1acc522a..ce74feb5cb74 100644 --- a/browser/devtools/framework/toolbox-window.xul +++ b/browser/devtools/framework/toolbox-window.xul @@ -11,7 +11,6 @@ - - - \ No newline at end of file + diff --git a/browser/locales/en-US/chrome/browser/devtools/toolbox.properties b/browser/locales/en-US/chrome/browser/devtools/toolbox.properties index a9ae06fd9194..2042204bc71e 100644 --- a/browser/locales/en-US/chrome/browser/devtools/toolbox.properties +++ b/browser/locales/en-US/chrome/browser/devtools/toolbox.properties @@ -20,3 +20,13 @@ toolboxToggleButton.warnings=#1 warning;#1 warnings # toolboxToggleButton.warnings as second argument to show the number of errors # and warnings. toolboxToggleButton.tooltip=%1$S, %2$S\nClick to toggle the developer tools. + +# LOCALIZATION NOTE (toolbox.titleTemplate): This is the template +# used to format the title of the toolbox. +# The name of the selected tool: %1$S. +# The url of the page being tooled: %2$S. +toolbox.titleTemplate=%1$S - %2$S + +# LOCALIZATION NOTE (toolbox.defaultTitle): This is used as the tool +# name when no tool is selected. +toolbox.defaultTitle=Developer Tools \ No newline at end of file From 9b7accad406b55e35802a89afa77630151eb41cd Mon Sep 17 00:00:00 2001 From: Girish Sharma Date: Sun, 10 Feb 2013 22:10:37 +0530 Subject: [PATCH 03/15] Bug 839890 - Fix for typo at line 391 in gDevTools.jsm; r=paul --- browser/devtools/framework/gDevTools.jsm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/devtools/framework/gDevTools.jsm b/browser/devtools/framework/gDevTools.jsm index e76153726e01..08fb06637068 100644 --- a/browser/devtools/framework/gDevTools.jsm +++ b/browser/devtools/framework/gDevTools.jsm @@ -388,7 +388,7 @@ let gDevToolsBrowser = { doc.getElementById("mainCommandSet").appendChild(elements.cmd); if (elements.key) { - this.attachKeybindingsToBrowser(doc, elements.keys); + this.attachKeybindingsToBrowser(doc, elements.key); } doc.getElementById("mainBroadcasterSet").appendChild(elements.bc); From 76b8c7ea9982bf83299b7f1f90c7dde2a4a4d2a9 Mon Sep 17 00:00:00 2001 From: Brandon Benvie Date: Wed, 13 Feb 2013 11:36:00 -0800 Subject: [PATCH 04/15] Bug 841078 - change FORBIDDEN_IDS initializer to an array of strings --- browser/devtools/framework/gDevTools.jsm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/devtools/framework/gDevTools.jsm b/browser/devtools/framework/gDevTools.jsm index 08fb06637068..cc3864b24624 100644 --- a/browser/devtools/framework/gDevTools.jsm +++ b/browser/devtools/framework/gDevTools.jsm @@ -18,7 +18,7 @@ XPCOMUtils.defineLazyModuleGetter(this, "Toolbox", XPCOMUtils.defineLazyModuleGetter(this, "TargetFactory", "resource:///modules/devtools/Target.jsm"); -const FORBIDDEN_IDS = new Set("toolbox", ""); +const FORBIDDEN_IDS = new Set(["toolbox", ""]); /** * DevTools is a class that represents a set of developer tools, it holds a From 82fc0de6854e2b26a8a1dcc53c3c4cdc17d61cda Mon Sep 17 00:00:00 2001 From: Girish Sharma Date: Sat, 16 Feb 2013 16:22:27 +0530 Subject: [PATCH 05/15] Bug 835722 - Infobar reappears even when not needed, r=jwalker --- browser/devtools/inspector/Highlighter.jsm | 8 +- browser/devtools/inspector/InspectorPanel.jsm | 2 +- browser/devtools/inspector/test/Makefile.in | 1 + ..._inspector_bug_835722_infobar_reappears.js | 92 +++++++++++++++++++ 4 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 browser/devtools/inspector/test/browser_inspector_bug_835722_infobar_reappears.js diff --git a/browser/devtools/inspector/Highlighter.jsm b/browser/devtools/inspector/Highlighter.jsm index a1f066137b16..93a1c649982a 100644 --- a/browser/devtools/inspector/Highlighter.jsm +++ b/browser/devtools/inspector/Highlighter.jsm @@ -140,11 +140,13 @@ Highlighter.prototype = { if (id != "inspector") { this.chromeWin.clearTimeout(this.pageEventsMuter); this.detachMouseListeners(); + this.disabled = true; this.hide(); } else { if (!this.locked) { this.attachMouseListeners(); } + this.disabled = false; this.show(); } }.bind(this); @@ -206,6 +208,9 @@ Highlighter.prototype = { this.selection.isElementNode(); if (canHighlightNode) { + if (this.selection.reason != "navigateaway") { + this.disabled = false; + } this.show(); this.updateInfobar(); this.invalidateSize(); @@ -214,6 +219,7 @@ Highlighter.prototype = { LayoutHelpers.scrollIntoViewIfNeeded(this.selection.node); } } else { + this.disabled = true; this.hide(); } }, @@ -246,7 +252,7 @@ Highlighter.prototype = { * Show the highlighter if it has been hidden. */ show: function() { - if (!this.hidden) return; + if (!this.hidden || this.disabled) return; this.showOutline(); this.showInfobar(); this.computeZoomFactor(); diff --git a/browser/devtools/inspector/InspectorPanel.jsm b/browser/devtools/inspector/InspectorPanel.jsm index 95deb03c2350..9b3ca51c0237 100644 --- a/browser/devtools/inspector/InspectorPanel.jsm +++ b/browser/devtools/inspector/InspectorPanel.jsm @@ -247,7 +247,7 @@ InspectorPanel.prototype = { } if (!self.selection.node) { - self.selection.setNode(newWindow.document.documentElement); + self.selection.setNode(newWindow.document.documentElement, "navigateaway"); } self._initMarkup(); } diff --git a/browser/devtools/inspector/test/Makefile.in b/browser/devtools/inspector/test/Makefile.in index 63439939e2f0..f73ee5e51295 100644 --- a/browser/devtools/inspector/test/Makefile.in +++ b/browser/devtools/inspector/test/Makefile.in @@ -39,6 +39,7 @@ _BROWSER_FILES = \ browser_inspector_bug_650804_search.js \ browser_inspector_bug_650804_search.html \ browser_inspector_bug_840156_destroy_after_navigation.js \ + browser_inspector_bug_835722_infobar_reappears.js \ head.js \ helpers.js \ $(NULL) diff --git a/browser/devtools/inspector/test/browser_inspector_bug_835722_infobar_reappears.js b/browser/devtools/inspector/test/browser_inspector_bug_835722_infobar_reappears.js new file mode 100644 index 000000000000..40fb68a1c317 --- /dev/null +++ b/browser/devtools/inspector/test/browser_inspector_bug_835722_infobar_reappears.js @@ -0,0 +1,92 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +function test() { + let inspector; + + function startLocationTests() { + openInspector(runInspectorTests); + } + + function runInspectorTests(aInspector) { + inspector = aInspector; + + executeSoon(function() { + inspector.selection.once("new-node", onNewSelection); + info("selecting the DOCTYPE node"); + inspector.selection.setNode(content.document.doctype, "test"); + }); + } + + function onNewSelection() { + is(inspector.highlighter.isHidden(), true, + "The infobar should be hidden now on selecting a non element node."); + inspector.sidebar.select("ruleview"); + let ruleView = inspector.sidebar.getTab("ruleview"); + ruleView.addEventListener("mouseover", function onMouseOver() { + ruleView.removeEventListener("mouseover", onMouseOver, false); + is(inspector.highlighter.isHidden(), true, + "The infobar was hidden so mouseover on the rules view did nothing"); + mouseOutAndContinue(); + }, false); + EventUtils.synthesizeMouse(ruleView, 10, 50, {type: "mouseover"}, + ruleView.ownerDocument.defaultView); + } + + function mouseOutAndContinue() { + let ruleView = inspector.sidebar.getTab("ruleview"); + ruleView.addEventListener("mouseout", function onMouseOut() { + ruleView.removeEventListener("mouseout", onMouseOut, false); + is(inspector.highlighter.isHidden(), true, + "The infobar should not be visible after we mouseout of rules view"); + switchToWebConsole(); + }, false); + EventUtils.synthesizeMouse(ruleView, 10, 10, {type: "mousemove"}, + ruleView.ownerDocument.defaultView); + EventUtils.synthesizeMouse(ruleView, -10, -10, {type: "mouseout"}, + ruleView.ownerDocument.defaultView); + } + + function switchToWebConsole() { + inspector.selection.once("new-node", function() { + is(inspector.highlighter.isHidden(), false, + "The infobar should be visible after we select a div."); + gDevTools.showToolbox(inspector.target, "webconsole").then(function() { + is(inspector.highlighter.isHidden(), true, + "The infobar should not be visible after we switched to webconsole"); + reloadAndWait(); + }); + }); + inspector.selection.setNode(content.document.querySelector("div"), "test"); + } + + function reloadAndWait() { + gBrowser.selectedBrowser.addEventListener("load", function onBrowserLoad() { + gBrowser.selectedBrowser.removeEventListener("load", onBrowserLoad, true); + waitForFocus(testAfterReload, content); + }, true); + content.location.reload(); + } + + function testAfterReload() { + is(inspector.highlighter.isHidden(), true, + "The infobar should not be visible after we reload with webconsole shown"); + testEnd(); + } + + function testEnd() { + gBrowser.removeCurrentTab(); + executeSoon(finish); + } + + waitForExplicitFinish(); + + gBrowser.selectedTab = gBrowser.addTab(); + gBrowser.selectedBrowser.addEventListener("load", function onBrowserLoad() { + gBrowser.selectedBrowser.removeEventListener("load", onBrowserLoad, true); + waitForFocus(startLocationTests, content); + }, true); + + content.location = "data:text/html,
Infobar should not " + + "reappear

init

"; +} From ff1bd0e214a3e76cf46fddeeb5f1dd35464e5118 Mon Sep 17 00:00:00 2001 From: Michael Ratcliffe Date: Mon, 4 Feb 2013 16:29:30 +0000 Subject: [PATCH 06/15] Bug 834187 - [Computed view] Restore processing of namespaced type selectors e.g. :not(svg|a) --- browser/devtools/styleinspector/CssLogic.jsm | 197 ++++-------------- .../devtools/styleinspector/CssRuleView.jsm | 23 +- .../test/browser_bug_592743_specificity.js | 106 +++++++--- 3 files changed, 138 insertions(+), 188 deletions(-) diff --git a/browser/devtools/styleinspector/CssLogic.jsm b/browser/devtools/styleinspector/CssLogic.jsm index 573c67093979..29a4b8f09b13 100644 --- a/browser/devtools/styleinspector/CssLogic.jsm +++ b/browser/devtools/styleinspector/CssLogic.jsm @@ -125,8 +125,6 @@ CssLogic.prototype = { _matchedRules: null, _matchedSelectors: null, - domUtils: Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils), - /** * Reset various properties */ @@ -470,8 +468,9 @@ CssLogic.prototype = { rule.selectors.forEach(function (aSelector) { if (aSelector._matchId !== this._matchId && - (aSelector.elementStyle || - this._selectorMatchesElement(aSelector))) { + (aSelector.elementStyle || + this.selectorMatchesElement(rule._domRule, aSelector.selectorIndex))) { + aSelector._matchId = this._matchId; this._matchedSelectors.push([ aSelector, status ]); if (aCallback) { @@ -489,15 +488,19 @@ CssLogic.prototype = { * parents. * * @private - * @param {string} aSelector the selector string you want to check. - * @return {boolean} true if the given selector matches the highlighted - * element or any of its parents, otherwise false is returned. + * @param {DOMRule} domRule + * The DOM Rule containing the selector. + * @param {Number} idx + * The index of the selector within the DOMRule. + * @return {boolean} + * true if the given selector matches the highlighted element or any + * of its parents, otherwise false is returned. */ - _selectorMatchesElement: function CL__selectorMatchesElement(aSelector) + selectorMatchesElement: function CL_selectorMatchesElement2(domRule, idx) { let element = this.viewedElement; do { - if (element.mozMatchesSelector(aSelector)) { + if (domUtils.selectorMatchesElement(element, domRule, idx)) { return true; } } while ((element = element.parentNode) && @@ -531,7 +534,7 @@ CssLogic.prototype = { if (rule.getPropertyValue(aProperty) && (status == CssLogic.STATUS.MATCHED || (status == CssLogic.STATUS.PARENT_MATCH && - this.domUtils.isInheritedProperty(aProperty)))) { + domUtils.isInheritedProperty(aProperty)))) { result[aProperty] = true; return false; } @@ -569,7 +572,7 @@ CssLogic.prototype = { CssLogic.STATUS.MATCHED : CssLogic.STATUS.PARENT_MATCH; try { - domRules = this.domUtils.getCSSStyleRules(element); + domRules = domUtils.getCSSStyleRules(element); } catch (ex) { Services.console. logStringMessage("CL__buildMatchedRules error: " + ex); @@ -690,65 +693,22 @@ CssLogic.getShortNamePath = function CssLogic_getShortNamePath(aElement) }; /** - * Get a string list of selectors for a given CSSStyleRule.selectorText + * Get a string list of selectors for a given DOMRule. * - * @param {string} aSelectorText The CSSStyleRule.selectorText to parse. - * @return {array} An array of string selectors. + * @param {DOMRule} aDOMRule + * The DOMRule to parse. + * @return {Array} + * An array of string selectors. */ -CssLogic.getSelectors = function CssLogic_getSelectors(aSelectorText) +CssLogic.getSelectors = function CssLogic_getSelectors(aDOMRule) { let selectors = []; - let selector = aSelectorText.trim(); - if (!selector) { - return selectors; + let len = domUtils.getSelectorCount(aDOMRule); + for (let i = 0; i < len; i++) { + let text = domUtils.getSelectorText(aDOMRule, i); + selectors.push(text); } - - let nesting = 0; - let currentSelector = []; - - // Parse a selector group into selectors. Normally we could just .split(',') - // however Gecko allows -moz-any(a, b, c) as a selector so we ignore commas - // inside brackets. - for (let i = 0, selLen = selector.length; i < selLen; i++) { - let c = selector.charAt(i); - switch (c) { - case ",": - if (nesting == 0 && currentSelector.length > 0) { - let selectorStr = currentSelector.join("").trim(); - if (selectorStr) { - selectors.push(selectorStr); - } - currentSelector = []; - } else { - currentSelector.push(c); - } - break; - - case "(": - nesting++; - currentSelector.push(c); - break; - - case ")": - nesting--; - currentSelector.push(c); - break; - - default: - currentSelector.push(c); - break; - } - } - - // Add the last selector. - if (nesting == 0 && currentSelector.length > 0) { - let selectorStr = currentSelector.join("").trim(); - if (selectorStr) { - selectors.push(selectorStr); - } - } - return selectors; } @@ -1171,7 +1131,7 @@ function CssRule(aCssSheet, aDomRule, aElement) if (this._cssSheet) { // parse _domRule.selectorText on call to this.selectors this._selectors = null; - this.line = this._cssSheet._cssLogic.domUtils.getRuleLine(this._domRule); + this.line = domUtils.getRuleLine(this._domRule); this.source = this._cssSheet.shortSource + ":" + this.line; if (this.mediaText) { this.source += " @media " + this.mediaText; @@ -1179,7 +1139,7 @@ function CssRule(aCssSheet, aDomRule, aElement) this.href = this._cssSheet.href; this.contentRule = this._cssSheet.contentSheet; } else if (aElement) { - this._selectors = [ new CssSelector(this, "@element.style") ]; + this._selectors = [ new CssSelector(this, "@element.style", 0) ]; this.line = -1; this.source = CssLogic.l10n("rule.sourceElement"); this.href = "#"; @@ -1263,8 +1223,12 @@ CssRule.prototype = { return this._selectors; } - let selectors = CssLogic.getSelectors(this._domRule.selectorText); - this._selectors = [new CssSelector(this, text) for (text of selectors)]; + let selectors = CssLogic.getSelectors(this._domRule); + + for (let i = 0, len = selectors.length; i < len; i++) { + this._selectors.push(new CssSelector(this, selectors[i], i)); + } + return this._selectors; }, @@ -1281,13 +1245,15 @@ CssRule.prototype = { * @constructor * @param {CssRule} aCssRule the CssRule instance from where the selector comes. * @param {string} aSelector The selector that we wish to investigate. + * @param {Number} aIndex The index of the selector within it's rule. */ -this.CssSelector = function CssSelector(aCssRule, aSelector) +this.CssSelector = function CssSelector(aCssRule, aSelector, aIndex) { this._cssRule = aCssRule; this.text = aSelector; this.elementStyle = this.text == "@element.style"; this._specificity = null; + this.selectorIndex = aIndex; } CssSelector.prototype = { @@ -1402,8 +1368,7 @@ CssSelector.prototype = { * @see http://www.w3.org/TR/css3-selectors/#specificity * @see http://www.w3.org/TR/CSS2/selector.html * - * @return {object} an object holding specificity information for the current - * selector. + * @return {Number} The selector's specificity. */ get specificity() { @@ -1411,59 +1376,8 @@ CssSelector.prototype = { return this._specificity; } - let specificity = { - ids: 0, - classes: 0, - tags: 0 - }; - - let text = this.text; - - if (!this.elementStyle) { - // Remove universal selectors as they are not relevant as far as specificity - // is concerned. - text = text.replace(RX_UNIVERSAL_SELECTOR, ""); - - // not() is ignored but any selectors contained by it are counted. Let's - // remove the not() and keep the contents. - text = text.replace(RX_NOT, " $1"); - - // Simplify remaining psuedo classes & elements. - text = text.replace(RX_PSEUDO_CLASS_OR_ELT, " $1)"); - - // Replace connectors with spaces - text = text.replace(RX_CONNECTORS, " "); - - text.split(/\s/).forEach(function(aSimple) { - // Count IDs. - aSimple = aSimple.replace(RX_ID, function() { - specificity.ids++; - return ""; - }); - - // Count class names and attribute matchers. - aSimple = aSimple.replace(RX_CLASS_OR_ATTRIBUTE, function() { - specificity.classes++; - return ""; - }); - - aSimple = aSimple.replace(RX_PSEUDO, function(aDummy, aPseudoName) { - if (this.pseudoElements.has(aPseudoName)) { - // Pseudo elements count as tags. - specificity.tags++; - } else { - // Pseudo classes count as classes. - specificity.classes++; - } - return ""; - }.bind(this)); - - if (aSimple) { - specificity.tags++; - } - }, this); - } - this._specificity = specificity; + this._specificity = domUtils.getSpecificity(this._cssRule._domRule, + this.selectorIndex); return this._specificity; }, @@ -1610,7 +1524,7 @@ CssPropertyInfo.prototype = { if (value && (aStatus == CssLogic.STATUS.MATCHED || (aStatus == CssLogic.STATUS.PARENT_MATCH && - this._cssLogic.domUtils.isInheritedProperty(this.property)))) { + domUtils.isInheritedProperty(this.property)))) { let selectorInfo = new CssSelectorInfo(aSelector, this.property, value, aStatus); this._matchedSelectors.push(selectorInfo); @@ -1677,25 +1591,6 @@ function CssSelectorInfo(aSelector, aProperty, aValue, aStatus) let priority = this.selector._cssRule.getPropertyPriority(this.property); this.important = (priority === "important"); - - /* Score prefix: - 0 UA normal property - 1 UA important property - 2 normal property - 3 inline (element.style) - 4 important - 5 inline important - */ - let scorePrefix = this.contentRule ? 2 : 0; - if (this.elementStyle) { - scorePrefix++; - } - if (this.important) { - scorePrefix += this.contentRule ? 2 : 1; - } - - this.specificityScore = "" + scorePrefix + this.specificity.ids + - this.specificity.classes + this.specificity.tags; } CssSelectorInfo.prototype = { @@ -1824,14 +1719,8 @@ CssSelectorInfo.prototype = { if (this.important && !aThat.important) return -1; if (aThat.important && !this.important) return 1; - if (this.specificity.ids > aThat.specificity.ids) return -1; - if (aThat.specificity.ids > this.specificity.ids) return 1; - - if (this.specificity.classes > aThat.specificity.classes) return -1; - if (aThat.specificity.classes > this.specificity.classes) return 1; - - if (this.specificity.tags > aThat.specificity.tags) return -1; - if (aThat.specificity.tags > this.specificity.tags) return 1; + if (this.specificity > aThat.specificity) return -1; + if (aThat.specificity > this.specificity) return 1; if (this.sheetIndex > aThat.sheetIndex) return -1; if (aThat.sheetIndex > this.sheetIndex) return 1; @@ -1847,3 +1736,7 @@ CssSelectorInfo.prototype = { return this.selector + " -> " + this.value; }, }; + +XPCOMUtils.defineLazyGetter(this, "domUtils", function() { + return Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils); +}); diff --git a/browser/devtools/styleinspector/CssRuleView.jsm b/browser/devtools/styleinspector/CssRuleView.jsm index a56e648d69bb..6417134f7ce4 100644 --- a/browser/devtools/styleinspector/CssRuleView.jsm +++ b/browser/devtools/styleinspector/CssRuleView.jsm @@ -108,8 +108,6 @@ ElementStyle.prototype = { // to figure out how shorthand properties will be parsed. dummyElement: null, - domUtils: Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils), - /** * Called by the Rule object when it has been changed through the * setProperty* methods. @@ -158,7 +156,7 @@ ElementStyle.prototype = { }); // Get the styles that apply to the element. - var domRules = this.domUtils.getCSSStyleRules(aElement); + var domRules = domUtils.getCSSStyleRules(aElement); // getCSStyleRules returns ordered from least-specific to // most-specific. @@ -413,7 +411,7 @@ Rule.prototype = { // No stylesheet, no ruleLine return null; } - return this.elementStyle.domUtils.getRuleLine(this.domRule); + return domUtils.getRuleLine(this.domRule); }, /** @@ -576,8 +574,7 @@ Rule.prototype = { continue; let name = matches[1]; - if (this.inherited && - !this.elementStyle.domUtils.isInheritedProperty(name)) { + if (this.inherited && !domUtils.isInheritedProperty(name)) { continue; } let value = store.userProperties.getProperty(this.style, name, matches[2]); @@ -1448,7 +1445,7 @@ RuleEditor.prototype = { // actually match. For custom selector text (such as for the 'element' // style, just show the text directly. if (this.rule.domRule && this.rule.domRule.selectorText) { - let selectors = CssLogic.getSelectors(this.rule.selectorText); + let selectors = CssLogic.getSelectors(this.rule.domRule); let element = this.rule.inherited || this.ruleView._viewedElement; for (let i = 0; i < selectors.length; i++) { let selector = selectors[i]; @@ -1458,8 +1455,12 @@ RuleEditor.prototype = { textContent: ", " }); } - let cls = element.mozMatchesSelector(selector) ? "ruleview-selector-matched" : - "ruleview-selector-unmatched"; + let cls; + if (domUtils.selectorMatchesElement(element, this.rule.domRule, i)) { + cls = "ruleview-selector-matched"; + } else { + cls = "ruleview-selector-unmatched"; + } createChild(this.selectorText, "span", { class: cls, textContent: selector @@ -2847,3 +2848,7 @@ XPCOMUtils.defineLazyGetter(this, "_strings", function() { XPCOMUtils.defineLazyGetter(this, "osString", function() { return Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).OS; }); + +XPCOMUtils.defineLazyGetter(this, "domUtils", function() { + return Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils); +}); diff --git a/browser/devtools/styleinspector/test/browser_bug_592743_specificity.js b/browser/devtools/styleinspector/test/browser_bug_592743_specificity.js index fb6c169eefb7..ca2e39e1a540 100644 --- a/browser/devtools/styleinspector/test/browser_bug_592743_specificity.js +++ b/browser/devtools/styleinspector/test/browser_bug_592743_specificity.js @@ -9,41 +9,93 @@ Cu.import("resource:///modules/devtools/CssLogic.jsm", tempScope); let CssLogic = tempScope.CssLogic; let CssSelector = tempScope.CssSelector; -function test() +function createDocument() { - let tests = [ - {text: "*", expected: "000"}, - {text: "LI", expected: "001"}, - {text: "UL LI", expected: "002"}, - {text: "UL OL+LI", expected: "003"}, - {text: "H1 + *[REL=up]", expected: "011"}, - {text: "UL OL LI.red", expected: "013"}, - {text: "LI.red.level", expected: "021"}, - {text: ".red .level", expected: "020"}, - {text: "#x34y", expected: "100"}, - {text: "#s12:not(FOO)", expected: "101"}, - {text: "body#home div#warning p.message", expected: "213"}, - {text: "* body#home div#warning p.message", expected: "213"}, - {text: "#footer *:not(nav) li", expected: "102"}, - {text: "bar:nth-child(1n+0)", expected: "011"}, - {text: "li::-moz-list-number", expected: "002"}, - {text: "a:hover", expected: "011"}, - ]; + let doc = content.document; + doc.body.innerHTML = getStylesheetText(); + doc.title = "Computed view specificity test"; + runTests(doc); +} - tests.forEach(function(aTest) { - let selector = new CssSelector(null, aTest.text); - let specificity = selector.specificity; +function runTests(doc) { + let cssLogic = new CssLogic(); + cssLogic.highlight(doc.body); - let result = "" + specificity.ids + specificity.classes + specificity.tags; - is(result, aTest.expected, "selector \"" + aTest.text + - "\" produces expected result"); - }); + let tests = getTests(); + let cssSheet = cssLogic.sheets[0]; + let cssRule = cssSheet.domSheet.cssRules[0]; + let selectors = CssLogic.getSelectors(cssRule); + for (let i = 0; i < selectors.length; i++) { + let selectorText = selectors[i]; + let selector = new CssSelector(cssRule, selectorText, i); + let expected = getExpectedSpecificity(selectorText); + let specificity = selector.domUtils.getSpecificity(selector._cssRule, + selector.selectorIndex) + is(specificity, expected, + 'selector "' + selectorText + '" has a specificity of ' + expected); + } finishUp(); } +function getExpectedSpecificity(selectorText) { + let tests = getTests(); + + for (let test of tests) { + if (test.text == selectorText) { + return test.expected; + } + } +} + +function getTests() { + return [ + {text: "*", expected: 0}, + {text: "LI", expected: 1}, + {text: "UL LI", expected: 2}, + {text: "UL OL + LI", expected: 3}, + {text: "H1 + [REL=\"up\"]", expected: 257}, + {text: "UL OL LI.red", expected: 259}, + {text: "LI.red.level", expected: 513}, + {text: ".red .level", expected: 512}, + {text: "#x34y", expected: 65536}, + {text: "#s12:not(FOO)", expected: 65537}, + {text: "body#home div#warning p.message", expected: 131331}, + {text: "* body#home div#warning p.message", expected: 131331}, + {text: "#footer :not(nav) li", expected: 65538}, + {text: "bar:nth-child(n)", expected: 257}, + {text: "li::-moz-list-number", expected: 1}, + {text: "a:hover", expected: 257}, + ]; +} + +function getStylesheetText() { + let tests = getTests(); + let text = ""; + + tests.forEach(function(test) { + if (text.length > 0) { + text += ","; + } + text += test.text; + }); + return '"; +} + function finishUp() { - CssLogic = CssSelector = null; + CssLogic = CssSelector = tempScope = null; finish(); } + +function test() +{ + waitForExplicitFinish(); + gBrowser.selectedTab = gBrowser.addTab(); + gBrowser.selectedBrowser.addEventListener("load", function onLoad(evt) { + gBrowser.selectedBrowser.removeEventListener(evt.type, onLoad, true); + waitForFocus(createDocument, content); + }, true); + + content.location = "data:text/html,Computed view specificity test"; +} From 0e2b321e111025ed1cd996bb4faec229a6093898 Mon Sep 17 00:00:00 2001 From: Joe Walker Date: Tue, 19 Feb 2013 13:50:34 +0000 Subject: [PATCH 07/15] Backed out changeset c1abd2ac8de9 (bug 734664) for test failures --- browser/devtools/framework/Toolbox.jsm | 37 +--------- browser/devtools/framework/ToolboxHosts.jsm | 21 ------ browser/devtools/framework/test/Makefile.in | 1 - .../browser_toolbox_window_title_changes.js | 69 ------------------- browser/devtools/framework/toolbox-window.xul | 1 + .../en-US/chrome/browser/devtools/toolbox.dtd | 4 +- .../browser/devtools/toolbox.properties | 10 --- 7 files changed, 7 insertions(+), 136 deletions(-) delete mode 100644 browser/devtools/framework/test/browser_toolbox_window_title_changes.js diff --git a/browser/devtools/framework/Toolbox.jsm b/browser/devtools/framework/Toolbox.jsm index d8820b11eb05..13951cc9c727 100644 --- a/browser/devtools/framework/Toolbox.jsm +++ b/browser/devtools/framework/Toolbox.jsm @@ -19,15 +19,11 @@ XPCOMUtils.defineLazyModuleGetter(this, "CommandUtils", XPCOMUtils.defineLazyGetter(this, "toolboxStrings", function() { let bundle = Services.strings.createBundle("chrome://browser/locale/devtools/toolbox.properties"); - let l10n = function(aName, ...aArgs) { + let l10n = function(name) { try { - if (aArgs.length == 0) { - return bundle.GetStringFromName(aName); - } else { - return bundle.formatStringFromName(aName, aArgs, aArgs.length); - } + return bundle.GetStringFromName(name); } catch (ex) { - Services.console.logStringMessage("Error reading '" + aName + "'"); + Services.console.logStringMessage("Error reading '" + name + "'"); } }; return l10n; @@ -144,11 +140,6 @@ this.Toolbox = function Toolbox(target, selectedTool, hostType) { EventEmitter.decorate(this); - this._refreshHostTitle = this._refreshHostTitle.bind(this); - this._target.on("navigate", this._refreshHostTitle); - this.on("host-changed", this._refreshHostTitle); - this.on("select", this._refreshHostTitle); - gDevTools.on("tool-registered", this._toolRegistered); gDevTools.on("tool-unregistered", this._toolUnregistered); } @@ -517,24 +508,6 @@ Toolbox.prototype = { this._host.raise(); }, - /** - * Refresh the host's title. - */ - _refreshHostTitle: function TBOX_refreshHostTitle() { - let toolName; - let toolId = this.currentToolId; - if (toolId) { - let toolDef = gDevTools.getToolDefinitionMap().get(toolId); - toolName = toolDef.label; - } else { - // no tool is selected - toolName = toolboxStrings("toolbox.defaultTitle"); - } - let title = toolboxStrings("toolbox.titleTemplate", - toolName, this.target.url); - this._host.setTitle(title); - }, - /** * Create a host object based on the given host type. * @@ -676,10 +649,6 @@ Toolbox.prototype = { return this._destroyer; } - this._target.off("navigate", this._refreshHostTitle); - this.off("select", this._refreshHostTitle); - this.off("host-changed", this._refreshHostTitle); - let outstanding = []; // Remote targets need to be notified that the toolbox is being torn down. diff --git a/browser/devtools/framework/ToolboxHosts.jsm b/browser/devtools/framework/ToolboxHosts.jsm index f7bac42eaeff..58b25309d600 100644 --- a/browser/devtools/framework/ToolboxHosts.jsm +++ b/browser/devtools/framework/ToolboxHosts.jsm @@ -85,13 +85,6 @@ BottomHost.prototype = { focusTab(this.hostTab); }, - /** - * Set the toolbox title. - */ - setTitle: function BH_setTitle(title) { - // Nothing to do for this host type. - }, - /** * Destroy the bottom dock. */ @@ -165,13 +158,6 @@ SidebarHost.prototype = { focusTab(this.hostTab); }, - /** - * Set the toolbox title. - */ - setTitle: function SH_setTitle(title) { - // Nothing to do for this host type. - }, - /** * Destroy the sidebar. */ @@ -249,13 +235,6 @@ WindowHost.prototype = { this._window.focus(); }, - /** - * Set the toolbox title. - */ - setTitle: function WH_setTitle(title) { - this._window.document.title = title; - }, - /** * Destroy the window. */ diff --git a/browser/devtools/framework/test/Makefile.in b/browser/devtools/framework/test/Makefile.in index 5cc458519284..4c364cbeaf6b 100644 --- a/browser/devtools/framework/test/Makefile.in +++ b/browser/devtools/framework/test/Makefile.in @@ -22,7 +22,6 @@ MOCHITEST_BROWSER_FILES = \ browser_toolbox_tool_ready.js \ browser_toolbox_sidebar.js \ browser_toolbox_window_shortcuts.js \ - browser_toolbox_window_title_changes.js \ $(NULL) include $(topsrcdir)/config/rules.mk diff --git a/browser/devtools/framework/test/browser_toolbox_window_title_changes.js b/browser/devtools/framework/test/browser_toolbox_window_title_changes.js deleted file mode 100644 index ec370db524d8..000000000000 --- a/browser/devtools/framework/test/browser_toolbox_window_title_changes.js +++ /dev/null @@ -1,69 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ */ - -let temp = {}; -Cu.import("resource:///modules/devtools/Toolbox.jsm", temp); -let Toolbox = temp.Toolbox; -temp = null; - -function test() { - waitForExplicitFinish(); - - const URL_1 = "data:text/plain;charset=UTF-8,abcde"; - const URL_2 = "data:text/plain;charset=UTF-8,12345"; - - const TOOL_ID_1 = "webconsole"; - const TOOL_ID_2 = "jsdebugger"; - - const LABEL_1 = "Web Console"; - const LABEL_2 = "Debugger"; - - let toolbox; - - addTab(URL_1, function () { - let target = TargetFactory.forTab(gBrowser.selectedTab); - gDevTools.showToolbox(target, null, Toolbox.HostType.BOTTOM) - .then(function (aToolbox) { toolbox = aToolbox; }) - .then(function () toolbox.selectTool(TOOL_ID_1)) - - // undock toolbox and check title - .then(function () toolbox.switchHost(Toolbox.HostType.WINDOW)) - .then(checkTitle.bind(null, LABEL_1, URL_1, "toolbox undocked")) - - // switch to different tool and check title - .then(function () toolbox.selectTool(TOOL_ID_2)) - .then(checkTitle.bind(null, LABEL_2, URL_1, "tool changed")) - - // navigate to different url and check title - .then(function () { - let deferred = Promise.defer(); - target.once("navigate", function () deferred.resolve()); - gBrowser.loadURI(URL_2); - return deferred.promise; - }) - .then(checkTitle.bind(null, LABEL_2, URL_2, "url changed")) - - // destroy toolbox, create new one hosted in a window (with a - // different tool id), and check title - .then(function () toolbox.destroy()) - .then(function () gDevTools.showToolbox(target, null, - Toolbox.HostType.WINDOW)) - .then(function (aToolbox) { toolbox = aToolbox; }) - .then(function () toolbox.selectTool(TOOL_ID_1)) - .then(checkTitle.bind(null, LABEL_1, URL_2, - "toolbox destroyed and recreated")) - - .then(function cleanUp() { - toolbox.destroy(); - gBrowser.removeCurrentTab(); - finish(); - }); - }); -} - -function checkTitle(toolLabel, url, context) { - let win = Services.wm.getMostRecentWindow("devtools:toolbox"); - let definitions = gDevTools.getToolDefinitionMap(); - let expectedTitle = toolLabel + " - " + url; - is(win.document.title, expectedTitle, context); -} diff --git a/browser/devtools/framework/toolbox-window.xul b/browser/devtools/framework/toolbox-window.xul index ce74feb5cb74..d0eb1acc522a 100644 --- a/browser/devtools/framework/toolbox-window.xul +++ b/browser/devtools/framework/toolbox-window.xul @@ -11,6 +11,7 @@ + + - + \ No newline at end of file diff --git a/browser/locales/en-US/chrome/browser/devtools/toolbox.properties b/browser/locales/en-US/chrome/browser/devtools/toolbox.properties index 2042204bc71e..a9ae06fd9194 100644 --- a/browser/locales/en-US/chrome/browser/devtools/toolbox.properties +++ b/browser/locales/en-US/chrome/browser/devtools/toolbox.properties @@ -20,13 +20,3 @@ toolboxToggleButton.warnings=#1 warning;#1 warnings # toolboxToggleButton.warnings as second argument to show the number of errors # and warnings. toolboxToggleButton.tooltip=%1$S, %2$S\nClick to toggle the developer tools. - -# LOCALIZATION NOTE (toolbox.titleTemplate): This is the template -# used to format the title of the toolbox. -# The name of the selected tool: %1$S. -# The url of the page being tooled: %2$S. -toolbox.titleTemplate=%1$S - %2$S - -# LOCALIZATION NOTE (toolbox.defaultTitle): This is used as the tool -# name when no tool is selected. -toolbox.defaultTitle=Developer Tools \ No newline at end of file From af91da33fb7d69fe07672ee65834a62b028bcdb2 Mon Sep 17 00:00:00 2001 From: Michael Ratcliffe Date: Tue, 19 Feb 2013 15:58:03 +0000 Subject: [PATCH 08/15] Bug 834187 - [Computed view] Restore processing of namespaced type selectors e.g. :not(svg|a) test fix r=me --- .../styleinspector/test/browser_bug_592743_specificity.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/browser/devtools/styleinspector/test/browser_bug_592743_specificity.js b/browser/devtools/styleinspector/test/browser_bug_592743_specificity.js index ca2e39e1a540..e759577906a4 100644 --- a/browser/devtools/styleinspector/test/browser_bug_592743_specificity.js +++ b/browser/devtools/styleinspector/test/browser_bug_592743_specificity.js @@ -6,6 +6,8 @@ let tempScope = {}; Cu.import("resource:///modules/devtools/CssLogic.jsm", tempScope); +const DOMUtils = Cc["@mozilla.org/inspector/dom-utils;1"] + .getService(Ci.inIDOMUtils); let CssLogic = tempScope.CssLogic; let CssSelector = tempScope.CssSelector; @@ -30,8 +32,8 @@ function runTests(doc) { let selectorText = selectors[i]; let selector = new CssSelector(cssRule, selectorText, i); let expected = getExpectedSpecificity(selectorText); - let specificity = selector.domUtils.getSpecificity(selector._cssRule, - selector.selectorIndex) + let specificity = DOMUtils.getSpecificity(selector._cssRule, + selector.selectorIndex) is(specificity, expected, 'selector "' + selectorText + '" has a specificity of ' + expected); } From 2429f89459bd01b5262ef28d5422a32a04a33904 Mon Sep 17 00:00:00 2001 From: Tim Taubert Date: Tue, 19 Feb 2013 19:32:29 +0100 Subject: [PATCH 09/15] Bug 842513 - Specify character sets for sample files and data URLs used in tests; r=felipe --- .../sessionstore/test/browser_248970_b_sample.html | 1 + .../sessionstore/test/browser_339445_sample.html | 1 + .../sessionstore/test/browser_423132_sample.html | 1 + .../sessionstore/test/browser_447951_sample.html | 1 + .../sessionstore/test/browser_459906_sample.html | 2 +- .../sessionstore/test/browser_461743_sample.html | 2 +- browser/components/sessionstore/test/browser_463205.js | 6 +++--- .../sessionstore/test/browser_463205_helper.html | 1 + .../sessionstore/test/browser_463205_sample.html | 9 +++++---- .../sessionstore/test/browser_463206_sample.html | 5 +++-- .../components/sessionstore/test/browser_464620_a.html | 2 +- .../components/sessionstore/test/browser_464620_b.html | 4 ++-- .../sessionstore/test/browser_466937_sample.html | 1 + browser/components/sessionstore/test/browser_483330.js | 2 +- browser/components/sessionstore/test/browser_506482.js | 2 +- browser/components/sessionstore/test/browser_579879.js | 2 +- .../sessionstore/test/browser_739531_sample.html | 3 ++- browser/components/sessionstore/test/browser_739805.js | 2 +- .../test/browser_form_restore_events_sample.html | 1 + 19 files changed, 29 insertions(+), 19 deletions(-) diff --git a/browser/components/sessionstore/test/browser_248970_b_sample.html b/browser/components/sessionstore/test/browser_248970_b_sample.html index c0c229c3fcb3..76c3ae1aa07c 100644 --- a/browser/components/sessionstore/test/browser_248970_b_sample.html +++ b/browser/components/sessionstore/test/browser_248970_b_sample.html @@ -1,4 +1,5 @@ + Test for bug 248970

Text Fields

diff --git a/browser/components/sessionstore/test/browser_339445_sample.html b/browser/components/sessionstore/test/browser_339445_sample.html index d30358f595b2..32656a8d9d8a 100644 --- a/browser/components/sessionstore/test/browser_339445_sample.html +++ b/browser/components/sessionstore/test/browser_339445_sample.html @@ -1,4 +1,5 @@ + Test for bug 339445 storageTestItem = FAIL diff --git a/browser/components/sessionstore/test/browser_423132_sample.html b/browser/components/sessionstore/test/browser_423132_sample.html index 6e8186787e03..6ff7e7aa3e53 100644 --- a/browser/components/sessionstore/test/browser_423132_sample.html +++ b/browser/components/sessionstore/test/browser_423132_sample.html @@ -1,6 +1,7 @@ + - + diff --git a/browser/components/sessionstore/test/browser_739805.js b/browser/components/sessionstore/test/browser_739805.js index a2393cb11ec7..077916456ee9 100644 --- a/browser/components/sessionstore/test/browser_739805.js +++ b/browser/components/sessionstore/test/browser_739805.js @@ -2,7 +2,7 @@ http://creativecommons.org/publicdomain/zero/1.0/ */ let tabState = { - entries: [{url: "data:text/html,", formdata: { id: { "foo": "bar" } } }] + entries: [{url: "data:text/html;charset=utf-8,", formdata: { id: { "foo": "bar" } } }] }; function test() { diff --git a/browser/components/sessionstore/test/browser_form_restore_events_sample.html b/browser/components/sessionstore/test/browser_form_restore_events_sample.html index 5e4b73b3c67c..1d46d40400ec 100644 --- a/browser/components/sessionstore/test/browser_form_restore_events_sample.html +++ b/browser/components/sessionstore/test/browser_form_restore_events_sample.html @@ -1,4 +1,5 @@ + Test for form restore events (originally bug 476161)