From 916bc23890b8f0a8d65d7671d228d2bce0a593ac Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Thu, 19 Dec 2013 21:33:01 -0800 Subject: [PATCH 01/20] Bug 952397 - Merge |mach valgrind-test| and valgrind_test.py. r=ted. --- build/valgrind/mach_commands.py | 135 ++++++++++++++++++++++---------- build/valgrind/valgrind_test.py | 77 ------------------ 2 files changed, 94 insertions(+), 118 deletions(-) delete mode 100644 build/valgrind/valgrind_test.py diff --git a/build/valgrind/mach_commands.py b/build/valgrind/mach_commands.py index 75bfef4f6da..2e32b2d127d 100644 --- a/build/valgrind/mach_commands.py +++ b/build/valgrind/mach_commands.py @@ -7,70 +7,123 @@ from __future__ import print_function, unicode_literals import os import subprocess +from mach.decorators import ( + CommandProvider, + Command, +) from mozbuild.base import ( MachCommandBase, MachCommandConditions as conditions, ) -from mach.decorators import ( - CommandProvider, - Command, -) + +def is_valgrind_build(cls): + """Must be a build with --enable-valgrind and --disable-jemalloc.""" + defines = cls.config_environment.defines + return 'MOZ_VALGRIND' in defines and 'MOZ_MEMORY' not in defines @CommandProvider class MachCommands(MachCommandBase): ''' - Easily run Valgrind tests. + Run Valgrind tests. ''' def __init__(self, context): MachCommandBase.__init__(self, context) @Command('valgrind-test', category='testing', - conditions=[conditions.is_firefox], + conditions=[conditions.is_firefox, is_valgrind_build], description='Run the Valgrind test job.') def valgrind_test(self): - defines = self.config_environment.defines - if 'MOZ_VALGRIND' not in defines or 'MOZ_MEMORY' in defines: - print("sorry, this command requires a build configured with\n" - "--enable-valgrind and --disable-jemalloc build") - return 1 + import json + import sys + import tempfile - debugger_args = [ - '--error-exitcode=1', - '--smc-check=all-non-file', - '--vex-iropt-register-updates=allregs-at-each-insn', - '--gen-suppressions=all', - '--num-callers=20', - '--leak-check=full', - '--show-possibly-lost=no', - '--track-origins=yes' - ] + from mozbuild.base import MozbuildObject + from mozfile import TemporaryDirectory + from mozhttpd import MozHttpd + from mozprofile import FirefoxProfile, Preferences + from mozprofile.permissions import ServerLocations + from mozrunner import FirefoxRunner + from mozrunner.utils import findInPath build_dir = os.path.join(self.topsrcdir, 'build') - supps_dir = os.path.join(build_dir, 'valgrind') - debugger_args.append('--suppressions=' + os.path.join(supps_dir, 'cross-architecture.sup')) - # MACHTYPE is an odd bash-only environment variable that doesn't show - # up in os.environ, so we have to get it another way. - machtype = subprocess.check_output(['bash', '-c', 'echo $MACHTYPE']).rstrip() - arch_specific_supps_file = os.path.join(supps_dir, machtype + '.sup') - if os.path.isfile(arch_specific_supps_file): - debugger_args.append('--suppressions=' + os.path.join(supps_dir, arch_specific_supps_file)) - print('Using platform-specific suppression file: ', - arch_specific_supps_file + '\n') - else: - print('Warning: could not find a platform-specific suppression file\n') + # XXX: currently we just use the PGO inputs for Valgrind runs. This may + # change in the future. + httpd = MozHttpd(docroot=os.path.join(build_dir, 'pgo')) + httpd.start(block=False) - env = os.environ.copy() - env['G_SLICE'] = 'always-malloc' - env['XPCOM_CC_RUN_DURING_SHUTDOWN'] = '1' + with TemporaryDirectory() as profilePath: + #TODO: refactor this into mozprofile + prefpath = os.path.join(self.topsrcdir, 'testing', 'profiles', 'prefs_general.js') + prefs = {} + prefs.update(Preferences.read_prefs(prefpath)) + interpolation = { 'server': '%s:%d' % httpd.httpd.server_address, + 'OOP': 'false'} + prefs = json.loads(json.dumps(prefs) % interpolation) + for pref in prefs: + prefs[pref] = Preferences.cast(prefs[pref]) - script = os.path.join(build_dir, 'valgrind', 'valgrind_test.py') + quitter = os.path.join(self.distdir, 'xpi-stage', 'quitter') + locations = ServerLocations() + locations.add_host(host='127.0.0.1', + port=httpd.httpd.server_port, + options='primary') - return subprocess.call([self.virtualenv_manager.python_path, script, - '--debugger=valgrind', - '--debugger-args=' + ' '.join(debugger_args) + ''], - env=env) + profile = FirefoxProfile(profile=profilePath, + preferences=prefs, + addons=[quitter], + locations=locations) + firefox_args = [httpd.get_url()] + + env = os.environ.copy() + env['G_SLICE'] = 'always-malloc' + env['XPCOM_CC_RUN_DURING_SHUTDOWN'] = '1' + env['MOZ_CRASHREPORTER_NO_REPORT'] = '1' + env['XPCOM_DEBUG_BREAK'] = 'warn' + + valgrind = 'valgrind' + if not os.path.exists(valgrind): + valgrind = findInPath(valgrind) + + valgrind_args = [ + valgrind, + '--error-exitcode=1', + '--smc-check=all-non-file', + '--vex-iropt-register-updates=allregs-at-each-insn', + '--gen-suppressions=all', + '--num-callers=20', + '--leak-check=full', + '--show-possibly-lost=no', + '--track-origins=yes' + ] + + supps_dir = os.path.join(build_dir, 'valgrind') + supps_file1 = os.path.join(supps_dir, 'cross-architecture.sup') + valgrind_args.append('--suppressions=' + supps_file1) + + # MACHTYPE is an odd bash-only environment variable that doesn't + # show up in os.environ, so we have to get it another way. + machtype = subprocess.check_output(['bash', '-c', 'echo $MACHTYPE']).rstrip() + supps_file2 = os.path.join(supps_dir, machtype + '.sup') + if os.path.isfile(supps_file2): + valgrind_args.append('--suppressions=' + supps_file2) + + try: + runner = FirefoxRunner(profile=profile, + binary=self.get_binary_path(), + cmdargs=firefox_args, + env=env) + runner.start(debug_args=valgrind_args) + status = runner.wait() + + finally: + httpd.stop() + if status != 0: + status = 1 # normalize status, in case it's larger than 127 + print('TEST-UNEXPECTED-FAIL | valgrind-test | non-zero exit code') + + return status diff --git a/build/valgrind/valgrind_test.py b/build/valgrind/valgrind_test.py deleted file mode 100644 index cc43d8f88c4..00000000000 --- a/build/valgrind/valgrind_test.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/python -# -# 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/. - -from mozprofile import FirefoxProfile, Profile, Preferences -from mozprofile.permissions import ServerLocations -from mozrunner import FirefoxRunner, CLI -from mozhttpd import MozHttpd -import json -import socket -import threading -import os -import sys -import shutil -import tempfile -from datetime import datetime -from mozbuild.base import MozbuildObject - -PORT = 8888 - -if __name__ == '__main__': - cli = CLI() - debug_args, interactive = cli.debugger_arguments() - - build = MozbuildObject.from_environment() - # XXX: currently we just use the PGO inputs for Valgrind runs. This may - # change in the future. - httpd = MozHttpd(port=PORT, - docroot=os.path.join(build.topsrcdir, "build", "pgo")) - httpd.start(block=False) - - locations = ServerLocations() - locations.add_host(host='127.0.0.1', - port=PORT, - options='primary,privileged') - - #TODO: mozfile.TemporaryDirectory - profilePath = tempfile.mkdtemp() - try: - #TODO: refactor this into mozprofile - prefpath = os.path.join(build.topsrcdir, "testing", "profiles", "prefs_general.js") - prefs = {} - prefs.update(Preferences.read_prefs(prefpath)) - interpolation = { "server": "%s:%d" % httpd.httpd.server_address, - "OOP": "false"} - prefs = json.loads(json.dumps(prefs) % interpolation) - for pref in prefs: - prefs[pref] = Preferences.cast(prefs[pref]) - profile = FirefoxProfile(profile=profilePath, - preferences=prefs, - addons=[os.path.join(build.distdir, 'xpi-stage', 'quitter')], - locations=locations) - - env = os.environ.copy() - env["MOZ_CRASHREPORTER_NO_REPORT"] = "1" - env["XPCOM_DEBUG_BREAK"] = "warn" - jarlog = os.getenv("JARLOG_FILE") - if jarlog: - env["MOZ_JAR_LOG_FILE"] = os.path.abspath(jarlog) - print "jarlog: %s" % env["MOZ_JAR_LOG_FILE"] - - cmdargs = ["http://localhost:%d/index.html" % PORT] - runner = FirefoxRunner(profile=profile, - binary=build.get_binary_path(), - cmdargs=cmdargs, - env=env) - runner.start(debug_args=debug_args, interactive=interactive) - status = runner.wait() - httpd.stop() - if status != 0: - status = 1 # normalize status, in case it's larger than 127 - - sys.exit(status) - finally: - shutil.rmtree(profilePath) From 97b8e1b80d3fbb60d976df06841511c1e9f990cf Mon Sep 17 00:00:00 2001 From: Brian Grinstead Date: Fri, 3 Jan 2014 13:32:26 -0600 Subject: [PATCH 02/20] Bug 947309 - DevTools themes - use new icons for toolbar;r=paul --- browser/devtools/main.js | 20 +-- .../linux/devtools/command-paintflashing.png | Bin 961 -> 0 bytes .../linux/devtools/command-responsivemode.png | Bin 1083 -> 0 bytes .../linux/devtools/command-scratchpad.png | Bin 584 -> 0 bytes .../themes/linux/devtools/command-tilt.png | Bin 1668 -> 0 bytes browser/themes/linux/devtools/dock-bottom.png | Bin 1383 -> 0 bytes browser/themes/linux/devtools/dock-side.png | Bin 1415 -> 0 bytes .../linux/devtools/tool-debugger-paused.png | Bin 441 -> 0 bytes .../themes/linux/devtools/tool-debugger.png | Bin 1698 -> 0 bytes .../themes/linux/devtools/tool-inspector.png | Bin 214 -> 0 bytes .../themes/linux/devtools/tool-network.png | Bin 380 -> 0 bytes .../themes/linux/devtools/tool-options.png | Bin 477 -> 0 bytes .../themes/linux/devtools/tool-profiler.png | Bin 1834 -> 0 bytes .../themes/linux/devtools/tool-scratchpad.png | Bin 1251 -> 0 bytes .../linux/devtools/tool-styleeditor.png | Bin 1541 -> 0 bytes .../themes/linux/devtools/tool-webconsole.png | Bin 1456 -> 0 bytes browser/themes/linux/devtools/undock.png | Bin 1430 -> 0 bytes browser/themes/linux/jar.mn | 37 +++--- browser/themes/osx/devtools/close.png | Bin 1466 -> 0 bytes .../osx/devtools/command-paintflashing.png | Bin 961 -> 0 bytes .../osx/devtools/command-responsivemode.png | Bin 1083 -> 0 bytes .../osx/devtools/command-scratchpad.png | Bin 584 -> 0 bytes browser/themes/osx/devtools/command-tilt.png | Bin 1668 -> 0 bytes browser/themes/osx/devtools/dock-bottom.png | Bin 1383 -> 0 bytes browser/themes/osx/devtools/dock-side.png | Bin 1415 -> 0 bytes .../osx/devtools/tool-debugger-paused.png | Bin 441 -> 0 bytes browser/themes/osx/devtools/tool-debugger.png | Bin 1698 -> 0 bytes .../themes/osx/devtools/tool-inspector.png | Bin 214 -> 0 bytes browser/themes/osx/devtools/tool-network.png | Bin 380 -> 0 bytes browser/themes/osx/devtools/tool-options.png | Bin 477 -> 0 bytes browser/themes/osx/devtools/tool-profiler.png | Bin 1834 -> 0 bytes .../themes/osx/devtools/tool-scratchpad.png | Bin 1251 -> 0 bytes .../themes/osx/devtools/tool-styleeditor.png | Bin 1541 -> 0 bytes .../themes/osx/devtools/tool-webconsole.png | Bin 1456 -> 0 bytes browser/themes/osx/devtools/undock.png | Bin 1430 -> 0 bytes browser/themes/osx/jar.mn | 37 +++--- .../devtools/images}/close.png | Bin .../shared/devtools/images/close@2x.png | Bin 0 -> 272 bytes .../devtools/images/command-console@2x.png | Bin 0 -> 695 bytes .../images/command-paintflashing@2x.png | Bin 0 -> 1399 bytes .../images/command-responsivemode@2x.png | Bin 0 -> 877 bytes .../devtools/images/command-scratchpad@2x.png | Bin 0 -> 466 bytes .../devtools/images/command-tilt@2x.png | Bin 0 -> 1526 bytes .../shared/devtools/images/dock-bottom@2x.png | Bin 0 -> 154 bytes .../shared/devtools/images/dock-side@2x.png | Bin 0 -> 153 bytes .../images/tool-debugger-paused@2x.png | Bin 0 -> 395 bytes .../devtools/images/tool-debugger@2x.png | Bin 0 -> 554 bytes .../devtools/images/tool-inspector@2x.png | Bin 0 -> 133 bytes .../devtools/images/tool-network@2x.png | Bin 0 -> 409 bytes .../devtools/images/tool-options@2x.png | Bin 0 -> 709 bytes .../devtools/images/tool-profiler@2x.png | Bin 0 -> 836 bytes .../devtools/images/tool-scratchpad@2x.png | Bin 0 -> 219 bytes .../devtools/images/tool-styleeditor@2x.png | Bin 0 -> 238 bytes .../devtools/images/tool-webconsole@2x.png | Bin 0 -> 124 bytes .../shared/devtools/images/undock@2x.png | Bin 0 -> 178 bytes .../themes/shared/devtools/toolbars.inc.css | 118 ++++++++---------- browser/themes/windows/devtools/close.png | Bin 1466 -> 0 bytes .../devtools/command-paintflashing.png | Bin 961 -> 0 bytes .../devtools/command-responsivemode.png | Bin 1083 -> 0 bytes .../windows/devtools/command-scratchpad.png | Bin 15108 -> 0 bytes .../themes/windows/devtools/command-tilt.png | Bin 1668 -> 0 bytes .../themes/windows/devtools/dock-bottom.png | Bin 1383 -> 0 bytes browser/themes/windows/devtools/dock-side.png | Bin 1415 -> 0 bytes .../windows/devtools/tool-debugger-paused.png | Bin 441 -> 0 bytes .../themes/windows/devtools/tool-debugger.png | Bin 1698 -> 0 bytes .../windows/devtools/tool-inspector.png | Bin 214 -> 0 bytes .../themes/windows/devtools/tool-network.png | Bin 380 -> 0 bytes .../themes/windows/devtools/tool-options.png | Bin 477 -> 0 bytes .../themes/windows/devtools/tool-profiler.png | Bin 1834 -> 0 bytes .../windows/devtools/tool-scratchpad.png | Bin 1251 -> 0 bytes .../windows/devtools/tool-styleeditor.png | Bin 1541 -> 0 bytes .../windows/devtools/tool-webconsole.png | Bin 1456 -> 0 bytes browser/themes/windows/devtools/undock.png | Bin 1430 -> 0 bytes browser/themes/windows/jar.mn | 74 +++++------ 74 files changed, 137 insertions(+), 149 deletions(-) delete mode 100644 browser/themes/linux/devtools/command-paintflashing.png delete mode 100644 browser/themes/linux/devtools/command-responsivemode.png delete mode 100644 browser/themes/linux/devtools/command-scratchpad.png delete mode 100644 browser/themes/linux/devtools/command-tilt.png delete mode 100644 browser/themes/linux/devtools/dock-bottom.png delete mode 100644 browser/themes/linux/devtools/dock-side.png delete mode 100644 browser/themes/linux/devtools/tool-debugger-paused.png delete mode 100644 browser/themes/linux/devtools/tool-debugger.png delete mode 100644 browser/themes/linux/devtools/tool-inspector.png delete mode 100644 browser/themes/linux/devtools/tool-network.png delete mode 100644 browser/themes/linux/devtools/tool-options.png delete mode 100644 browser/themes/linux/devtools/tool-profiler.png delete mode 100644 browser/themes/linux/devtools/tool-scratchpad.png delete mode 100644 browser/themes/linux/devtools/tool-styleeditor.png delete mode 100644 browser/themes/linux/devtools/tool-webconsole.png delete mode 100644 browser/themes/linux/devtools/undock.png delete mode 100644 browser/themes/osx/devtools/close.png delete mode 100644 browser/themes/osx/devtools/command-paintflashing.png delete mode 100644 browser/themes/osx/devtools/command-responsivemode.png delete mode 100644 browser/themes/osx/devtools/command-scratchpad.png delete mode 100644 browser/themes/osx/devtools/command-tilt.png delete mode 100644 browser/themes/osx/devtools/dock-bottom.png delete mode 100644 browser/themes/osx/devtools/dock-side.png delete mode 100644 browser/themes/osx/devtools/tool-debugger-paused.png delete mode 100644 browser/themes/osx/devtools/tool-debugger.png delete mode 100644 browser/themes/osx/devtools/tool-inspector.png delete mode 100644 browser/themes/osx/devtools/tool-network.png delete mode 100644 browser/themes/osx/devtools/tool-options.png delete mode 100644 browser/themes/osx/devtools/tool-profiler.png delete mode 100644 browser/themes/osx/devtools/tool-scratchpad.png delete mode 100644 browser/themes/osx/devtools/tool-styleeditor.png delete mode 100644 browser/themes/osx/devtools/tool-webconsole.png delete mode 100644 browser/themes/osx/devtools/undock.png rename browser/themes/{linux/devtools => shared/devtools/images}/close.png (100%) create mode 100644 browser/themes/shared/devtools/images/close@2x.png create mode 100644 browser/themes/shared/devtools/images/command-console@2x.png create mode 100644 browser/themes/shared/devtools/images/command-paintflashing@2x.png create mode 100644 browser/themes/shared/devtools/images/command-responsivemode@2x.png create mode 100644 browser/themes/shared/devtools/images/command-scratchpad@2x.png create mode 100644 browser/themes/shared/devtools/images/command-tilt@2x.png create mode 100644 browser/themes/shared/devtools/images/dock-bottom@2x.png create mode 100644 browser/themes/shared/devtools/images/dock-side@2x.png create mode 100644 browser/themes/shared/devtools/images/tool-debugger-paused@2x.png create mode 100644 browser/themes/shared/devtools/images/tool-debugger@2x.png create mode 100644 browser/themes/shared/devtools/images/tool-inspector@2x.png create mode 100644 browser/themes/shared/devtools/images/tool-network@2x.png create mode 100644 browser/themes/shared/devtools/images/tool-options@2x.png create mode 100644 browser/themes/shared/devtools/images/tool-profiler@2x.png create mode 100644 browser/themes/shared/devtools/images/tool-scratchpad@2x.png create mode 100644 browser/themes/shared/devtools/images/tool-styleeditor@2x.png create mode 100644 browser/themes/shared/devtools/images/tool-webconsole@2x.png create mode 100644 browser/themes/shared/devtools/images/undock@2x.png delete mode 100644 browser/themes/windows/devtools/close.png delete mode 100644 browser/themes/windows/devtools/command-paintflashing.png delete mode 100644 browser/themes/windows/devtools/command-responsivemode.png delete mode 100644 browser/themes/windows/devtools/command-scratchpad.png delete mode 100644 browser/themes/windows/devtools/command-tilt.png delete mode 100644 browser/themes/windows/devtools/dock-bottom.png delete mode 100644 browser/themes/windows/devtools/dock-side.png delete mode 100644 browser/themes/windows/devtools/tool-debugger-paused.png delete mode 100644 browser/themes/windows/devtools/tool-debugger.png delete mode 100644 browser/themes/windows/devtools/tool-inspector.png delete mode 100644 browser/themes/windows/devtools/tool-network.png delete mode 100644 browser/themes/windows/devtools/tool-options.png delete mode 100644 browser/themes/windows/devtools/tool-profiler.png delete mode 100644 browser/themes/windows/devtools/tool-scratchpad.png delete mode 100644 browser/themes/windows/devtools/tool-styleeditor.png delete mode 100644 browser/themes/windows/devtools/tool-webconsole.png delete mode 100644 browser/themes/windows/devtools/undock.png diff --git a/browser/devtools/main.js b/browser/devtools/main.js index e7925acf42b..8821a9bd49b 100644 --- a/browser/devtools/main.js +++ b/browser/devtools/main.js @@ -60,7 +60,7 @@ Tools.options = { id: "options", ordinal: 0, url: "chrome://browser/content/devtools/framework/toolbox-options.xul", - icon: "chrome://browser/skin/devtools/tool-options.png", + icon: "chrome://browser/skin/devtools/tool-options@2x.png", bgTheme: "theme-body", tooltip: l10n("optionsButton.tooltip", toolboxStrings), inMenu: false, @@ -79,7 +79,7 @@ Tools.webConsole = { accesskey: l10n("webConsoleCmd.accesskey", webConsoleStrings), modifiers: Services.appinfo.OS == "Darwin" ? "accel,alt" : "accel,shift", ordinal: 1, - icon: "chrome://browser/skin/devtools/tool-webconsole.png", + icon: "chrome://browser/skin/devtools/tool-webconsole@2x.png", url: "chrome://browser/content/devtools/webconsole.xul", label: l10n("ToolboxTabWebconsole.label", webConsoleStrings), menuLabel: l10n("MenuWebconsole.label", webConsoleStrings), @@ -101,7 +101,7 @@ Tools.inspector = { key: l10n("inspector.commandkey", inspectorStrings), ordinal: 2, modifiers: osString == "Darwin" ? "accel,alt" : "accel,shift", - icon: "chrome://browser/skin/devtools/tool-inspector.png", + icon: "chrome://browser/skin/devtools/tool-inspector@2x.png", url: "chrome://browser/content/devtools/inspector/inspector.xul", label: l10n("inspector.label", inspectorStrings), tooltip: l10n("inspector.tooltip", inspectorStrings), @@ -130,8 +130,8 @@ Tools.jsdebugger = { accesskey: l10n("debuggerMenu.accesskey", debuggerStrings), modifiers: osString == "Darwin" ? "accel,alt" : "accel,shift", ordinal: 3, - icon: "chrome://browser/skin/devtools/tool-debugger.png", - highlightedicon: "chrome://browser/skin/devtools/tool-debugger-paused.png", + icon: "chrome://browser/skin/devtools/tool-debugger@2x.png", + highlightedicon: "chrome://browser/skin/devtools/tool-debugger-paused@2x.png", url: "chrome://browser/content/devtools/debugger.xul", label: l10n("ToolboxDebugger.label", debuggerStrings), tooltip: l10n("ToolboxDebugger.tooltip", debuggerStrings), @@ -153,7 +153,7 @@ Tools.styleEditor = { ordinal: 4, accesskey: l10n("open.accesskey", styleEditorStrings), modifiers: "shift", - icon: "chrome://browser/skin/devtools/tool-styleeditor.png", + icon: "chrome://browser/skin/devtools/tool-styleeditor@2x.png", url: "chrome://browser/content/devtools/styleeditor.xul", label: l10n("ToolboxStyleEditor.label", styleEditorStrings), tooltip: l10n("ToolboxStyleEditor.tooltip2", styleEditorStrings), @@ -173,7 +173,7 @@ Tools.shaderEditor = { id: "shadereditor", ordinal: 5, visibilityswitch: "devtools.shadereditor.enabled", - icon: "chrome://browser/skin/devtools/tool-styleeditor.png", + icon: "chrome://browser/skin/devtools/tool-styleeditor@2x.png", url: "chrome://browser/content/devtools/shadereditor.xul", label: l10n("ToolboxShaderEditor.label", shaderEditorStrings), tooltip: l10n("ToolboxShaderEditor.tooltip", shaderEditorStrings), @@ -195,7 +195,7 @@ Tools.jsprofiler = { ordinal: 6, modifiers: "shift", visibilityswitch: "devtools.profiler.enabled", - icon: "chrome://browser/skin/devtools/tool-profiler.png", + icon: "chrome://browser/skin/devtools/tool-profiler@2x.png", url: "chrome://browser/content/devtools/profiler.xul", label: l10n("profiler.label", profilerStrings), tooltip: l10n("profiler.tooltip2", profilerStrings), @@ -218,7 +218,7 @@ Tools.netMonitor = { ordinal: 7, modifiers: osString == "Darwin" ? "accel,alt" : "accel,shift", visibilityswitch: "devtools.netmonitor.enabled", - icon: "chrome://browser/skin/devtools/tool-network.png", + icon: "chrome://browser/skin/devtools/tool-network@2x.png", url: "chrome://browser/content/devtools/netmonitor.xul", label: l10n("netmonitor.label", netMonitorStrings), tooltip: l10n("netmonitor.tooltip", netMonitorStrings), @@ -238,7 +238,7 @@ Tools.scratchpad = { id: "scratchpad", ordinal: 8, visibilityswitch: "devtools.scratchpad.enabled", - icon: "chrome://browser/skin/devtools/tool-scratchpad.png", + icon: "chrome://browser/skin/devtools/tool-scratchpad@2x.png", url: "chrome://browser/content/devtools/scratchpad.xul", label: l10n("scratchpad.label", scratchpadStrings), tooltip: l10n("scratchpad.tooltip", scratchpadStrings), diff --git a/browser/themes/linux/devtools/command-paintflashing.png b/browser/themes/linux/devtools/command-paintflashing.png deleted file mode 100644 index b785131a23d98b5fdedacf04e2fcbeeaf066f57d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 961 zcmV;y13vtTP)|&Xz)kM6^%<0fBKBQ9C zTa-yJ5(b6fOWJd9y+k>;bIvZFe&4mh|NJ+{I(zWp!}rfQpD)|*x3euqmSrDtYZLy5 zKyStSG1Vi>v6|2VoR{;$z5&7IxdBuTfc{euMSlXQT0p5KDeuY5EWlaq0tP@71AGBd z^nU?03(%atmziz-Dg&I=E}$1gF~Bs4qW=@9TENk|tQ|d{Wq`BV1$2Wb2ABd-^nUH(FcDWZlK3M zaxIa-bol<;NC?xPjRdY2_|9i+Yknt30$g?hEC~_8c2>TRK{T3tV~VE0SfDvjSrQI7 zaM4jLz~%9-BU&Z5_f|OIz(t3}<6Y9aJ>J)JZzvpa;PQR%($admK10q#IN-qL7O+ZZ z?90h%9G4>jE;@<@*d5NTqT5?Tk60ODM1}$mTz&wjAZF8oEaWs2Eyz&7fy?(rNy?=G z-;iS^29cqF1DEY;&a|${Gz}Uzn}%hOaqSs$S>U3hSim2P$R z%Maji3P)(THgaw{CAS&r=PsLY$Svgif+&{Iy%*#>qW*KF9~+x+$UUoAKvA<+f7RBP zQ8^@oP32akkF+Z`MFMiI=>G~ diff --git a/browser/themes/linux/devtools/command-responsivemode.png b/browser/themes/linux/devtools/command-responsivemode.png deleted file mode 100644 index cbfa599048c1065c7250a5cd74b9684724f3ded3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1083 zcmV-B1jPG^P){UzO0owih;|zVdoglM>cwC%#$YhU7`2<(IQxCw_q6}zaJu(MZ+h|J_xtPTd++so zJ)EP$j~+kQsO_iXh4I1^PauOVU#LN7^a3-A^a_`}z>Ffl2!DBj8D(s0Nm}ydo%?w` z1C|$%K~_Ed?*r@^4a|ZIqePKEM~O04@0yv_{;d@_;0)&V(-Q&D#&MBA{H!e9*c-hF?ynud0 z0rdcTU;pKdDbv%?b`mDedI7r69h@D(B~J%9eDWKJJx`wn%xb=20i!Uu@Rh0)MK3Jg zkQtZtRyrom^7F(u58YBg_5l5e0_p(w9cURlCe9HBIDK#iaBpMI&bMJF4xjuAxL?)t zI6L$7S-`8GUbBEvv@?5ATWCxN$HduD z0DbP@Gk8<;UO*MV z{`b&ug}m`JIagxh>?nXfcW?@DZ)U!gvss|$^vO?vdmnTCoPEwbeHJit_XP`}fQ6s* z|Bw~zD#>lUIEaa}@lO2&J}<=SzFt5OV8^v5`1Q#@JXdh|GQo)vT=H~Q3l5+B2%_Xa zcK9q{M%_6J7%R5Vjhp>;8m|8*%qyH>Z2T;BUc;Gvs`S81x~~_o4PbX62Oj{t?sEq{ zM7gj^=oZ}kd&DhYAq+Tt7LZZhYXPI6G7Hzfj@$;vy|(jM`|RLx-1jHzzFxpq;8uWq z3-N*De65-H~ zDBvR?yAS6m_-vn9aD<8xR($B+hXcl>Z_8WH5KZ3k-u@FY|OgvDx-7;DMJ4%mXj$_lD)+ftT{%L2m!> zc~~AEczJ;#!)Q4Kc;KZ1AAwn9A%uB&DPJ%gD=F{-gWy{-)$wJ0<8cj~F%N5+`=kEaG WYW7HKLO22d0000s diff --git a/browser/themes/linux/devtools/command-tilt.png b/browser/themes/linux/devtools/command-tilt.png deleted file mode 100644 index f816bba59cedb2fb2069b4d0a4ff09225e99cdb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1668 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 TBs@G%00000NkvXXu0mjfT(8IR diff --git a/browser/themes/linux/devtools/tool-profiler.png b/browser/themes/linux/devtools/tool-profiler.png deleted file mode 100644 index 8f30f12a9d52bd62ee7b10180dd66fd8f45e72b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1834 zcmV+_2i5qAP)4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER00009a7bBm000XU000XU0RWnu7ytkQtVu*cR5%f( zQ%h)5K@^>N`81{eYe^ScQ%c)_i!NNb5K_An!G&E^QAAt_6$QaA+(=h-VRh455fL;B zrhcJ*T8pTl_<=OoLZo7=lKzsWO-)|j|0UzOPaA_<2kx7hbI(0<=gxgx2*Lhmxc?1a zVQjtEv^%+Adl=)*j0*{zY1oLc+*hiqSh75ZmuH~pb{psX8iF>JlS*sBHO|@TO0O%j zij@TNy4@;qeiy+m-Oyhoe$3pseEsSe5lo%6sw>c z9@hgeIJmNHS>|iTe7|cj^6c@wLQyP9l53Y&H4ctG85+`ca~cO|WV9xXe8jjPfmeNNHuFQn3EF7)-$bFaRV6IaT>QNxF>g9+W}ceBj}i7ny3L{Bl6vVog8j4~;W YU#@V)?0xW-3IG5A07*qoM6N<$g6IHrzW@LL diff --git a/browser/themes/linux/devtools/tool-scratchpad.png b/browser/themes/linux/devtools/tool-scratchpad.png deleted file mode 100644 index 07505167046e3f69067e333a846d7ce989f64051..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1251 zcmbVMTWs4@81|@`(xnycG%-;s^~lo-MT;FfO=FveEQu2uASGl`o5wo#X=}CiaqQE@ z?Z!5$qOKiClaP3z(!}G+WtzkTNUInVw+(F%Ou)*db=r6s64I(NHVv^U9Jfv3p_&ku z>~s6R|MH#x_e`$$#l~$d+bD`^%=E~4GB$ayZ!7t>-Ki>McnYVAcpnM8n^AiC%vl=f zT9ob&XMrNJr$ zk3{LUpo-ZXNFp18FcS`_L9P=-M1~76eTVU)*qU9v$a7f zFQ?aikyVr)#@Lcrwo<7ul@NpMA(j(Gkqz=J&j$!1;EbDCaRa8at7bulj%w=`){zN3 zi%JQN;V4ZaT}#2Rve^y8rn4>-k&JZ}i{+RgYZzW$t7r%3;Xh$)igpU)7G(3#L1VT` z?qhIQjZCzAv?C8lqLE&;b#f`nsEpJx1DZG^M`?1xXu2k83MZ6=5*Oej5g`CeokBq1 zU>6aP7rH_aYO2s#v$Gk$E6pc(ffG3~k>I#gD4ycONuf&?!ii8)j0iPu#&ob^s<7r; zC%)IYg#8Gvl(eCOkzGJ&v{nVVVT6%0j4Y5$f@k}6Q$rP}!@Hrigk@;!`=OS$kpWgE zmh?^B|F_iF_}c%KjwL~{UY-1_ZfaYk7`^F67m&q9A3>8ek4?Jdmn#F)6t%^dk>dsT zYUx3>8mmiD8s+<>yuu%>-o4dwwEf-2%im57p4c%nI<=)Ows83V^7XUN>gV*0Wz4yV&U&}9puYLZO(qijJ7jN$AS^D$9^3ub_PtoAsY{A8i8@5J=&$>)Rp z&2v*nm|T4SxwfYAZ$Ewf!xgl2@JRja>`~vz`T0xj?G2}Hmd_n-Ro;Jl`_>4$_T9wY z-*@*_kIfwOfAHaa_RCw7e))bi_MX3?c%1)nD4kB5+xZ*)J9eIS?yMYdsv8I$I`r_5 b$H5oWuk`nC-plMh>HT&xsb2Y1Vqo%bax<%a diff --git a/browser/themes/linux/devtools/tool-styleeditor.png b/browser/themes/linux/devtools/tool-styleeditor.png deleted file mode 100644 index 83765d9f6e9e89ce9eda425827be7e82e4f98628..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1541 zcmV+g2KxDlP)4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER00009a7bBm000XU000XU0RWnu7ytkPheYJ36_h~AyR-QF#% z^KD$S;3?P9^L+23T+E-@Vi;ub!8nnS zR>(11rzP#Ef72PI@HyP*KHU~Y&O%7xE zfWu-KCk#FM{fJKWy$Nkv8=kjXGM000000NkvXXu0mjfFPPxo diff --git a/browser/themes/linux/devtools/tool-webconsole.png b/browser/themes/linux/devtools/tool-webconsole.png deleted file mode 100644 index 86633249a19bf57ba7747f33938a538f9d0c67a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1456 zcmV;h1yA~kP)4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER00009a7bBm000XU000XU0RWnu7ytkPGD$>1R5%f( zlIu#tKoCZ=RniCOEynjNt(5){#j5B_h`T;?XBjkB#c!H-}Yg6;X|;yP7Y&|WG%vzhu?!FI8hT&2n^ zXoKX;X6V@v;1VSt(br{~nTYl>)29?Jv-N?!M#*~=Uw~jv8zd(-vsF+oezywP4| z`q)aGUjd(;7KGHE?;DsoEu~~O$JTeU*Ul-Go))Y%g<4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER00009a7bBm000XU000XU0RWnu7ytkP7)eAyR5%f( zQ9W>*Vt6o)mJ7U z^Xtp(xfT?uQhi@sV_V>Kb!yRyvV-~1QRk5>(Z4PLS|S1K5X+xl)OoTV@e1Izt-Ir? zijk;brCf7!CJDJgQq?!Y+UFP({~mD8BRVKc{MsGN{G7guh~I{s#bO2kLw%*~Uu*JD kk-)#WH4dNgR-e-y0la?QA$Jn6CIA2c07*qoM6N<$f+A3>MF0Q* diff --git a/browser/themes/linux/jar.mn b/browser/themes/linux/jar.mn index e160e446d43..ebcc4afcf48 100644 --- a/browser/themes/linux/jar.mn +++ b/browser/themes/linux/jar.mn @@ -153,11 +153,11 @@ browser.jar: skin/classic/browser/devtools/controls.png (../shared/devtools/controls.png) * skin/classic/browser/devtools/widgets.css (devtools/widgets.css) skin/classic/browser/devtools/commandline-icon.png (devtools/commandline-icon.png) - skin/classic/browser/devtools/command-paintflashing.png (devtools/command-paintflashing.png) - skin/classic/browser/devtools/command-responsivemode.png (devtools/command-responsivemode.png) - skin/classic/browser/devtools/command-scratchpad.png (devtools/command-scratchpad.png) - skin/classic/browser/devtools/command-tilt.png (devtools/command-tilt.png) - skin/classic/browser/devtools/command-console.png (devtools/command-console.png) + skin/classic/browser/devtools/command-paintflashing@2x.png (../shared/devtools/images/command-paintflashing@2x.png) + skin/classic/browser/devtools/command-responsivemode@2x.png (../shared/devtools/images/command-responsivemode@2x.png) + skin/classic/browser/devtools/command-scratchpad@2x.png (../shared/devtools/images/command-scratchpad@2x.png) + skin/classic/browser/devtools/command-tilt@2x.png (../shared/devtools/images/command-tilt@2x.png) + skin/classic/browser/devtools/command-console@2x.png (../shared/devtools/images/command-console@2x.png) skin/classic/browser/devtools/alerticon-warning.png (devtools/alerticon-warning.png) skin/classic/browser/devtools/ruleview.css (devtools/ruleview.css) * skin/classic/browser/devtools/webconsole.css (devtools/webconsole.css) @@ -228,25 +228,26 @@ browser.jar: skin/classic/browser/devtools/responsive-horizontal-resizer.png (devtools/responsive-horizontal-resizer.png) skin/classic/browser/devtools/responsive-background.png (devtools/responsive-background.png) skin/classic/browser/devtools/toggle-tools.png (devtools/toggle-tools.png) - skin/classic/browser/devtools/dock-bottom.png (devtools/dock-bottom.png) - skin/classic/browser/devtools/dock-side.png (devtools/dock-side.png) + skin/classic/browser/devtools/dock-bottom@2x.png (../shared/devtools/images/dock-bottom@2x.png) + skin/classic/browser/devtools/dock-side@2x.png (../shared/devtools/images/dock-side@2x.png) skin/classic/browser/devtools/floating-scrollbars.css (devtools/floating-scrollbars.css) skin/classic/browser/devtools/floating-scrollbars-light.css (devtools/floating-scrollbars-light.css) skin/classic/browser/devtools/inspector.css (devtools/inspector.css) skin/classic/browser/devtools/profiler-stopwatch.png (devtools/profiler-stopwatch.png) - skin/classic/browser/devtools/tool-options.png (devtools/tool-options.png) - skin/classic/browser/devtools/tool-webconsole.png (devtools/tool-webconsole.png) - skin/classic/browser/devtools/tool-debugger.png (devtools/tool-debugger.png) - skin/classic/browser/devtools/tool-debugger-paused.png (devtools/tool-debugger-paused.png) - skin/classic/browser/devtools/tool-inspector.png (devtools/tool-inspector.png) - skin/classic/browser/devtools/tool-styleeditor.png (devtools/tool-styleeditor.png) - skin/classic/browser/devtools/tool-profiler.png (devtools/tool-profiler.png) - skin/classic/browser/devtools/tool-network.png (devtools/tool-network.png) - skin/classic/browser/devtools/tool-scratchpad.png (devtools/tool-scratchpad.png) - skin/classic/browser/devtools/close.png (devtools/close.png) + skin/classic/browser/devtools/tool-options@2x.png (../shared/devtools/images/tool-options@2x.png) + skin/classic/browser/devtools/tool-webconsole@2x.png (../shared/devtools/images/tool-webconsole@2x.png) + skin/classic/browser/devtools/tool-debugger@2x.png (../shared/devtools/images/tool-debugger@2x.png) + skin/classic/browser/devtools/tool-debugger-paused@2x.png (../shared/devtools/images/tool-debugger-paused@2x.png) + skin/classic/browser/devtools/tool-inspector@2x.png (../shared/devtools/images/tool-inspector@2x.png) + skin/classic/browser/devtools/tool-styleeditor@2x.png (../shared/devtools/images/tool-styleeditor@2x.png) + skin/classic/browser/devtools/tool-profiler@2x.png (../shared/devtools/images/tool-profiler@2x.png) + skin/classic/browser/devtools/tool-network@2x.png (../shared/devtools/images/tool-network@2x.png) + skin/classic/browser/devtools/tool-scratchpad@2x.png (../shared/devtools/images/tool-scratchpad@2x.png) + skin/classic/browser/devtools/close.png (../shared/devtools/images/close.png) + skin/classic/browser/devtools/close@2x.png (../shared/devtools/images/close@2x.png) skin/classic/browser/devtools/vview-delete.png (devtools/vview-delete.png) skin/classic/browser/devtools/vview-edit.png (devtools/vview-edit.png) - skin/classic/browser/devtools/undock.png (devtools/undock.png) + skin/classic/browser/devtools/undock@2x.png (../shared/devtools/images/undock@2x.png) skin/classic/browser/devtools/font-inspector.css (devtools/font-inspector.css) skin/classic/browser/devtools/computedview.css (devtools/computedview.css) skin/classic/browser/devtools/arrow-e.png (devtools/arrow-e.png) diff --git a/browser/themes/osx/devtools/close.png b/browser/themes/osx/devtools/close.png deleted file mode 100644 index b53941253d9ae00682f35b3ea779b4018a4d4c4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1466 zcmV;r1x5OaP)4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER00009a7bBm000XU000XU0RWnu7ytkPJV``BR5%gM zQ#($>KoFfp;aeagrQ(mc2^B~boPZn9atDNzROT1cxJhZ{3=~KpByJGoE)-VmU^_O8 zhBt;tYa1zr8!SET%$qmQJL|P#W~%ed)oGUAe`*kCx<4jrO~(s}n!-)LiOz-S1(|6&O4)pgz7vcB;4+>uCGmbDc| z$pe}_K@cU6UB}tO)>YY{QJ4n_1nhai2P;ZRQ6_c8lpGzLV4~`!$sJ9T5z*R0rX6tm zCQnQQz1TQiCGt(aau3ja2En%0UvF1;H^-gJi$lZ%>}GR5)8}S$9?PywfL!v!=+?IF z9mGn|ZeMQ*CpA+mab*OENGY{~C4nISQILz#GSXP;=JTh4DVP;k&R|wUxnA4g8;W=R UfMG){3;+NC07*qoM6N<$f;BO^bN~PV diff --git a/browser/themes/osx/devtools/command-paintflashing.png b/browser/themes/osx/devtools/command-paintflashing.png deleted file mode 100644 index b785131a23d98b5fdedacf04e2fcbeeaf066f57d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 961 zcmV;y13vtTP)|&Xz)kM6^%<0fBKBQ9C zTa-yJ5(b6fOWJd9y+k>;bIvZFe&4mh|NJ+{I(zWp!}rfQpD)|*x3euqmSrDtYZLy5 zKyStSG1Vi>v6|2VoR{;$z5&7IxdBuTfc{euMSlXQT0p5KDeuY5EWlaq0tP@71AGBd z^nU?03(%atmziz-Dg&I=E}$1gF~Bs4qW=@9TENk|tQ|d{Wq`BV1$2Wb2ABd-^nUH(FcDWZlK3M zaxIa-bol<;NC?xPjRdY2_|9i+Yknt30$g?hEC~_8c2>TRK{T3tV~VE0SfDvjSrQI7 zaM4jLz~%9-BU&Z5_f|OIz(t3}<6Y9aJ>J)JZzvpa;PQR%($admK10q#IN-qL7O+ZZ z?90h%9G4>jE;@<@*d5NTqT5?Tk60ODM1}$mTz&wjAZF8oEaWs2Eyz&7fy?(rNy?=G z-;iS^29cqF1DEY;&a|${Gz}Uzn}%hOaqSs$S>U3hSim2P$R z%Maji3P)(THgaw{CAS&r=PsLY$Svgif+&{Iy%*#>qW*KF9~+x+$UUoAKvA<+f7RBP zQ8^@oP32akkF+Z`MFMiI=>G~ diff --git a/browser/themes/osx/devtools/command-responsivemode.png b/browser/themes/osx/devtools/command-responsivemode.png deleted file mode 100644 index cbfa599048c1065c7250a5cd74b9684724f3ded3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1083 zcmV-B1jPG^P){UzO0owih;|zVdoglM>cwC%#$YhU7`2<(IQxCw_q6}zaJu(MZ+h|J_xtPTd++so zJ)EP$j~+kQsO_iXh4I1^PauOVU#LN7^a3-A^a_`}z>Ffl2!DBj8D(s0Nm}ydo%?w` z1C|$%K~_Ed?*r@^4a|ZIqePKEM~O04@0yv_{;d@_;0)&V(-Q&D#&MBA{H!e9*c-hF?ynud0 z0rdcTU;pKdDbv%?b`mDedI7r69h@D(B~J%9eDWKJJx`wn%xb=20i!Uu@Rh0)MK3Jg zkQtZtRyrom^7F(u58YBg_5l5e0_p(w9cURlCe9HBIDK#iaBpMI&bMJF4xjuAxL?)t zI6L$7S-`8GUbBEvv@?5ATWCxN$HduD z0DbP@Gk8<;UO*MV z{`b&ug}m`JIagxh>?nXfcW?@DZ)U!gvss|$^vO?vdmnTCoPEwbeHJit_XP`}fQ6s* z|Bw~zD#>lUIEaa}@lO2&J}<=SzFt5OV8^v5`1Q#@JXdh|GQo)vT=H~Q3l5+B2%_Xa zcK9q{M%_6J7%R5Vjhp>;8m|8*%qyH>Z2T;BUc;Gvs`S81x~~_o4PbX62Oj{t?sEq{ zM7gj^=oZ}kd&DhYAq+Tt7LZZhYXPI6G7Hzfj@$;vy|(jM`|RLx-1jHzzFxpq;8uWq z3-N*De65-H~ zDBvR?yAS6m_-vn9aD<8xR($B+hXcl>Z_8WH5KZ3k-u@FY|OgvDx-7;DMJ4%mXj$_lD)+ftT{%L2m!> zc~~AEczJ;#!)Q4Kc;KZ1AAwn9A%uB&DPJ%gD=F{-gWy{-)$wJ0<8cj~F%N5+`=kEaG WYW7HKLO22d0000s diff --git a/browser/themes/osx/devtools/command-tilt.png b/browser/themes/osx/devtools/command-tilt.png deleted file mode 100644 index f816bba59cedb2fb2069b4d0a4ff09225e99cdb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1668 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 TBs@G%00000NkvXXu0mjfT(8IR diff --git a/browser/themes/osx/devtools/tool-profiler.png b/browser/themes/osx/devtools/tool-profiler.png deleted file mode 100644 index 8f30f12a9d52bd62ee7b10180dd66fd8f45e72b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1834 zcmV+_2i5qAP)4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER00009a7bBm000XU000XU0RWnu7ytkQtVu*cR5%f( zQ%h)5K@^>N`81{eYe^ScQ%c)_i!NNb5K_An!G&E^QAAt_6$QaA+(=h-VRh455fL;B zrhcJ*T8pTl_<=OoLZo7=lKzsWO-)|j|0UzOPaA_<2kx7hbI(0<=gxgx2*Lhmxc?1a zVQjtEv^%+Adl=)*j0*{zY1oLc+*hiqSh75ZmuH~pb{psX8iF>JlS*sBHO|@TO0O%j zij@TNy4@;qeiy+m-Oyhoe$3pseEsSe5lo%6sw>c z9@hgeIJmNHS>|iTe7|cj^6c@wLQyP9l53Y&H4ctG85+`ca~cO|WV9xXe8jjPfmeNNHuFQn3EF7)-$bFaRV6IaT>QNxF>g9+W}ceBj}i7ny3L{Bl6vVog8j4~;W YU#@V)?0xW-3IG5A07*qoM6N<$g6IHrzW@LL diff --git a/browser/themes/osx/devtools/tool-scratchpad.png b/browser/themes/osx/devtools/tool-scratchpad.png deleted file mode 100644 index 07505167046e3f69067e333a846d7ce989f64051..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1251 zcmbVMTWs4@81|@`(xnycG%-;s^~lo-MT;FfO=FveEQu2uASGl`o5wo#X=}CiaqQE@ z?Z!5$qOKiClaP3z(!}G+WtzkTNUInVw+(F%Ou)*db=r6s64I(NHVv^U9Jfv3p_&ku z>~s6R|MH#x_e`$$#l~$d+bD`^%=E~4GB$ayZ!7t>-Ki>McnYVAcpnM8n^AiC%vl=f zT9ob&XMrNJr$ zk3{LUpo-ZXNFp18FcS`_L9P=-M1~76eTVU)*qU9v$a7f zFQ?aikyVr)#@Lcrwo<7ul@NpMA(j(Gkqz=J&j$!1;EbDCaRa8at7bulj%w=`){zN3 zi%JQN;V4ZaT}#2Rve^y8rn4>-k&JZ}i{+RgYZzW$t7r%3;Xh$)igpU)7G(3#L1VT` z?qhIQjZCzAv?C8lqLE&;b#f`nsEpJx1DZG^M`?1xXu2k83MZ6=5*Oej5g`CeokBq1 zU>6aP7rH_aYO2s#v$Gk$E6pc(ffG3~k>I#gD4ycONuf&?!ii8)j0iPu#&ob^s<7r; zC%)IYg#8Gvl(eCOkzGJ&v{nVVVT6%0j4Y5$f@k}6Q$rP}!@Hrigk@;!`=OS$kpWgE zmh?^B|F_iF_}c%KjwL~{UY-1_ZfaYk7`^F67m&q9A3>8ek4?Jdmn#F)6t%^dk>dsT zYUx3>8mmiD8s+<>yuu%>-o4dwwEf-2%im57p4c%nI<=)Ows83V^7XUN>gV*0Wz4yV&U&}9puYLZO(qijJ7jN$AS^D$9^3ub_PtoAsY{A8i8@5J=&$>)Rp z&2v*nm|T4SxwfYAZ$Ewf!xgl2@JRja>`~vz`T0xj?G2}Hmd_n-Ro;Jl`_>4$_T9wY z-*@*_kIfwOfAHaa_RCw7e))bi_MX3?c%1)nD4kB5+xZ*)J9eIS?yMYdsv8I$I`r_5 b$H5oWuk`nC-plMh>HT&xsb2Y1Vqo%bax<%a diff --git a/browser/themes/osx/devtools/tool-styleeditor.png b/browser/themes/osx/devtools/tool-styleeditor.png deleted file mode 100644 index 83765d9f6e9e89ce9eda425827be7e82e4f98628..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1541 zcmV+g2KxDlP)4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER00009a7bBm000XU000XU0RWnu7ytkPheYJ36_h~AyR-QF#% z^KD$S;3?P9^L+23T+E-@Vi;ub!8nnS zR>(11rzP#Ef72PI@HyP*KHU~Y&O%7xE zfWu-KCk#FM{fJKWy$Nkv8=kjXGM000000NkvXXu0mjfFPPxo diff --git a/browser/themes/osx/devtools/tool-webconsole.png b/browser/themes/osx/devtools/tool-webconsole.png deleted file mode 100644 index 86633249a19bf57ba7747f33938a538f9d0c67a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1456 zcmV;h1yA~kP)4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER00009a7bBm000XU000XU0RWnu7ytkPGD$>1R5%f( zlIu#tKoCZ=RniCOEynjNt(5){#j5B_h`T;?XBjkB#c!H-}Yg6;X|;yP7Y&|WG%vzhu?!FI8hT&2n^ zXoKX;X6V@v;1VSt(br{~nTYl>)29?Jv-N?!M#*~=Uw~jv8zd(-vsF+oezywP4| z`q)aGUjd(;7KGHE?;DsoEu~~O$JTeU*Ul-Go))Y%g<4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER00009a7bBm000XU000XU0RWnu7ytkP7)eAyR5%f( zQ9W>*Vt6o)mJ7U z^Xtp(xfT?uQhi@sV_V>Kb!yRyvV-~1QRk5>(Z4PLS|S1K5X+xl)OoTV@e1Izt-Ir? zijk;brCf7!CJDJgQq?!Y+UFP({~mD8BRVKc{MsGN{G7guh~I{s#bO2kLw%*~Uu*JD kk-)#WH4dNgR-e-y0la?QA$Jn6CIA2c07*qoM6N<$f+A3>MF0Q* diff --git a/browser/themes/osx/jar.mn b/browser/themes/osx/jar.mn index 8cc67fe026d..213dbee5ea2 100644 --- a/browser/themes/osx/jar.mn +++ b/browser/themes/osx/jar.mn @@ -256,11 +256,11 @@ browser.jar: skin/classic/browser/devtools/controls.png (../shared/devtools/controls.png) * skin/classic/browser/devtools/widgets.css (devtools/widgets.css) skin/classic/browser/devtools/commandline-icon.png (devtools/commandline-icon.png) - skin/classic/browser/devtools/command-paintflashing.png (devtools/command-paintflashing.png) - skin/classic/browser/devtools/command-responsivemode.png (devtools/command-responsivemode.png) - skin/classic/browser/devtools/command-scratchpad.png (devtools/command-scratchpad.png) - skin/classic/browser/devtools/command-tilt.png (devtools/command-tilt.png) - skin/classic/browser/devtools/command-console.png (devtools/command-console.png) + skin/classic/browser/devtools/command-paintflashing@2x.png (../shared/devtools/images/command-paintflashing@2x.png) + skin/classic/browser/devtools/command-responsivemode@2x.png (../shared/devtools/images/command-responsivemode@2x.png) + skin/classic/browser/devtools/command-scratchpad@2x.png (../shared/devtools/images/command-scratchpad@2x.png) + skin/classic/browser/devtools/command-tilt@2x.png (../shared/devtools/images/command-tilt@2x.png) + skin/classic/browser/devtools/command-console@2x.png (../shared/devtools/images/command-console@2x.png) skin/classic/browser/devtools/alerticon-warning.png (devtools/alerticon-warning.png) skin/classic/browser/devtools/ruleview.css (devtools/ruleview.css) skin/classic/browser/devtools/commandline.css (devtools/commandline.css) @@ -333,23 +333,24 @@ browser.jar: skin/classic/browser/devtools/responsive-horizontal-resizer.png (devtools/responsive-horizontal-resizer.png) skin/classic/browser/devtools/responsive-background.png (devtools/responsive-background.png) skin/classic/browser/devtools/toggle-tools.png (devtools/toggle-tools.png) - skin/classic/browser/devtools/dock-bottom.png (devtools/dock-bottom.png) - skin/classic/browser/devtools/dock-side.png (devtools/dock-side.png) + skin/classic/browser/devtools/dock-bottom@2x.png (../shared/devtools/images/dock-bottom@2x.png) + skin/classic/browser/devtools/dock-side@2x.png (../shared/devtools/images/dock-side@2x.png) * skin/classic/browser/devtools/inspector.css (devtools/inspector.css) skin/classic/browser/devtools/profiler-stopwatch.png (devtools/profiler-stopwatch.png) - skin/classic/browser/devtools/tool-options.png (devtools/tool-options.png) - skin/classic/browser/devtools/tool-webconsole.png (devtools/tool-webconsole.png) - skin/classic/browser/devtools/tool-debugger.png (devtools/tool-debugger.png) - skin/classic/browser/devtools/tool-debugger-paused.png (devtools/tool-debugger-paused.png) - skin/classic/browser/devtools/tool-inspector.png (devtools/tool-inspector.png) - skin/classic/browser/devtools/tool-styleeditor.png (devtools/tool-styleeditor.png) - skin/classic/browser/devtools/tool-profiler.png (devtools/tool-profiler.png) - skin/classic/browser/devtools/tool-network.png (devtools/tool-network.png) - skin/classic/browser/devtools/tool-scratchpad.png (devtools/tool-scratchpad.png) - skin/classic/browser/devtools/close.png (devtools/close.png) + skin/classic/browser/devtools/tool-options@2x.png (../shared/devtools/images/tool-options@2x.png) + skin/classic/browser/devtools/tool-webconsole@2x.png (../shared/devtools/images/tool-webconsole@2x.png) + skin/classic/browser/devtools/tool-debugger@2x.png (../shared/devtools/images/tool-debugger@2x.png) + skin/classic/browser/devtools/tool-debugger-paused@2x.png (../shared/devtools/images/tool-debugger-paused@2x.png) + skin/classic/browser/devtools/tool-inspector@2x.png (../shared/devtools/images/tool-inspector@2x.png) + skin/classic/browser/devtools/tool-styleeditor@2x.png (../shared/devtools/images/tool-styleeditor@2x.png) + skin/classic/browser/devtools/tool-profiler@2x.png (../shared/devtools/images/tool-profiler@2x.png) + skin/classic/browser/devtools/tool-network@2x.png (../shared/devtools/images/tool-network@2x.png) + skin/classic/browser/devtools/tool-scratchpad@2x.png (../shared/devtools/images/tool-scratchpad@2x.png) + skin/classic/browser/devtools/close.png (../shared/devtools/images/close.png) + skin/classic/browser/devtools/close@2x.png (../shared/devtools/images/close@2x.png) skin/classic/browser/devtools/vview-delete.png (devtools/vview-delete.png) skin/classic/browser/devtools/vview-edit.png (devtools/vview-edit.png) - skin/classic/browser/devtools/undock.png (devtools/undock.png) + skin/classic/browser/devtools/undock@2x.png (../shared/devtools/images/undock@2x.png) skin/classic/browser/devtools/font-inspector.css (devtools/font-inspector.css) skin/classic/browser/devtools/computedview.css (devtools/computedview.css) skin/classic/browser/devtools/arrow-e.png (devtools/arrow-e.png) diff --git a/browser/themes/linux/devtools/close.png b/browser/themes/shared/devtools/images/close.png similarity index 100% rename from browser/themes/linux/devtools/close.png rename to browser/themes/shared/devtools/images/close.png diff --git a/browser/themes/shared/devtools/images/close@2x.png b/browser/themes/shared/devtools/images/close@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..79ef6cecaba92cef68b9f27578edb86c7fb80dbf GIT binary patch literal 272 zcmV+r0q_2aP)N#>&dtot>St@zc_afkG0etz;t942ZZXQoQ*|*(|?LiJd|a1mPc) z!sV#>B-p3E`=a6bSzkpy0lKyjK=r=;r|A`F! zu#nT`Hdo(6s{XGhZ@RD`@&5n~EG1Sm(81kkLVtn!ok-BX4^8MFP`@k*`X3{4#lC#~ z&hYc_k#pZaJibdvFQM_5Vn;9;$vA1ptZKq3Q=y0Q@0QKZ<(Bzoco0sUJQm z;4g{Vq3T(v<^am|Q`1ExqJA0IGiXMuU|q_|sfwi@4+Jq@zIahdNIwS$y9s)L0`;4N zn`kdz^bpd|&dzR&ny3FVyg7IM=AWOR-*PJ|=@HV;#Kq2oQ3e2GpaxVIOGrvBXJlmh zj}K!j1AzM1g7k|^NHjAsG5*7caioCbApK(E5(P|5On>oVY_))>p0YZZuyXsi`wzA; zGc*3hhq2ZIz!+$Owz5K@4kU!pQ$R3Oe>sr)PXPbJ(vq}<>hC1NZj5%o>q~cU0$EO? zI$HJ&|A1ED#s4s~0MOzJm}7uRl;m0fsDCAt{hy7EjU4@lVQf}bR#No80<{Fiv=r1q z9mF3$elW1GGvhD7{(!=d@f8bF$D)UU0szz>Nuhpw3bbE-adgK5W)41XqD#;ppT3G{ ddR_(yFaXq#Q#&@V%y|F+002ovPDHLkV1i|uIRO9w literal 0 HcmV?d00001 diff --git a/browser/themes/shared/devtools/images/command-paintflashing@2x.png b/browser/themes/shared/devtools/images/command-paintflashing@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..840cd4efa9a4fe75041fa7b2ecc5db523d12a0b0 GIT binary patch literal 1399 zcmZ`(X;71A5PrXeBT!>d z>I@XaA#znY6^FOJcph$4Aw{wpfUG(w|(j)2ZoqJM@nRN7cTI^X){ju;U z)M0EuwmYziQ4+Kfk4O@3!iEG+DwJsYFZ1ODF>QQq2`IEDcg<|g?;2rWb) z_|L3m*r`mC>$6ki1tTskRu<;)e0WO4cmPW0KL^U3%y_fyBwZkH=Lb5t^eKVT4xTZEoLo@+|^cUydzs zKa|n7reB^u#}J<~W?jw0WGb^Y^S@6DG05Syn}#OMh&Jyv$)juCq0?M4-y+Vr@Dle~e^*82LTQ6;WH2xQE4iAIAc>U1a zv%|R~HZkX!hfZ=8DXG2PK6iuCQZJsmdXTj@Fr>!i-#Us)Aw9}|4f?MwaX#2E;4j#n z`xrX|T7S7!MYmOsH!?3)gdNn=XJ;TYc2c4XksLUf0CP?J1^zvg)h% z+5x+IngS``4av^dVD<)4#%ILQ?)=S?#rvK7dTGxZ z4F5kjZqV-P_{}#V1NpHXQ&pY=v1?*M+AfjjE)gaatkAn9;V10#P`wwB@YpfP6{+BF zBmnn3{*dGrE!_?Vj4>lHL*FqJfKHVYMDl_v9&keU6UFqzYh$!g;KN^EcIs4H4}GKU z&tJu+xye}w(1w2#*8YAFl8lCR65!FT5o0I^;Cz;&BV|ce@Bk>|6AE6*oU#-o>cptp zSM=YNGIVeitUywo3&IkL%A#yD)+WRYwNQ}~vEmbCYK^8WWWosup-3~?QJ0tteUkvR z8loJyR!}w01{F?2mRW##Wb;dk9A2vx=M@HX3T>gDv43OU)w#4Dkao`PH#|Nay62=0x9>?cH2IW< z-9H2zTeM7D55Y1}mSBndfw oh3-AAL~Wd|OzZ-}lG$y=gAwDBq3M=(`9lQ`B#M3I8Na)K1I{CZ$N&HU literal 0 HcmV?d00001 diff --git a/browser/themes/shared/devtools/images/command-responsivemode@2x.png b/browser/themes/shared/devtools/images/command-responsivemode@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5a2a30c644f6cf2a3254576fe3857b0bdd84573a GIT binary patch literal 877 zcmeAS@N?(olHy`uVBq!ia0vp^4M42G!3-qd{%H^gQlA5SLR^9L*Ka?+eE(&!=IPh3 zznFQYzW(^}`s*K{$g3~EzkUB@x#sEXZ+|VYzyJF34MYMJ00qDP_{G92 z_3hiw5C8u&@X37p{`>2%U;qFA|NQyqw;#V>e);|C>z|k3euE5r^@@RC4yYce45Se# z^7Z%2Pas2Heft9>fog!HLVC~RkNi>0(1b-OpBF| zELT0@Gw}pk^!3N@SFeBy9)A4z@zc+rUw-`pT4%ZXsnx0{-+ufAY6m(1q<-ZiAOmQ= z&pAF@ptt=?g8YIRHsAC$_Vx8$bp6ov>({ScTeR@d;fjhh>kvVqJ%)msU6+qqt>6)y zqjGf4CF{#aE-gQjA*AVP)FmjGF?a8kYu7xvck>7eX&6{qS$3~HcJfr@pCz>n42-ut zT^vIy;@)1np7+>+hc&<}_{pTwYn@NxE>*w3d8>NjzyH}xNeao26knQG%hxbEDZD$) zXp_Knn&FOX&aoTwkLPULXn*!*PEvi~21^DX6_(!-9N%^dyx~?9J|I-U>*!|p!0ZjX z-2;m^+iMOi<}CWj!{AcGaP>FCs_%?#Cqy1>SX3&U-p^LECUSS%<>id-S5+d9-dw<7 zYq47U>H$l}>3209o-VzXm*J3mH_F^(!LCUvc^V83e_Mm{PStTO_^KXLwq+UPwYr0; z8M?e4leA-Yc{(vq*>#ZpL!74A11`A-RUnjL(8g+_z2m`jwl!Bb9M$KISew)xFLhzX z_kx?bS0o*N-u|3_;Oigh0^9#=8;-s|RL69kJ3oPaI=@Xqhxc^$lER(O8TohAh}~=0 z%?wmk-cZl{j_*UhgQhu8!umbT>oXko1If$-Zk6o!E;MX^DqG>sJa4)2W0CD?a~_$n z%`*i#L%-+q4m@#FQ^ zKVQH80&-t{{R1Sw{rLU*>;JD{?x+7i#?P-`zyAOK|LwQ`pMl)3KVE+Q`{mnDi27IG z{(SrK6Ucr2^)FD%*B^g?2*?H+we!vWl_0xIg8YIRZf^GVHBLObqDyl2HjxHNL0M6+ zjIQO!j&!fgNb>Sb=Q#HMI8g0BPZ!6KinzO1P8J8bv2f3kNB{R5xk|Dv z-KBZIW&wX~ZTmXOP>*Si+n(%RuKV+4h4-sj+m@`#@Sby6k1HaJ|H=*Lhy|Yw+n~f4BrTv&!+h7g?WQ(f^I4EVTL-+5@v74I?fzsz7O6SAH+R*{<{jDt)F;=Dd7Rr5B*0B xF$aG&@^Ue^$rRKw*7EJx+n~oD6TLNh|i^ znMt=S>?P-I9BO?ij@Bub84|Z|)M}TULc3UMD1V7J?^o^!x*u=HD2WC_20{$gwsu6AOIoizesp zO^d$ORO5Odk=D8D74UmcsjYkklFYPVPBRo2!$TTuA28-_`HoE_bn38{ z3=s0%@tLvt@G68y#oP4TcJDAsVQJB=w%I!&#zxm)gbf$6JbRL#*M63*(k0l3&BCkSnf}W213>2sG%@< zS=<-bYMmpe;e|m&q&e`)+vhw)@v4gLkG{Gi2pI_)!uFstpDyHj(pHwC=xeD+qZ*H7 z#++bVyMHk2YvSmIfbD|{zkYv{%<1@C@PTV{ zo`A4eRau7On6yXiCSpjzcRL`nY}0p#t6PCAPyuWBN$HntSsyy)dJMpAeX~@dsS)ZH z1=fM)6z|5BnM-<6bCPGWc7QX~SCxf(EXd`oOw!Jpi;cFNk5g7o;NHY!5rG{sO44xQ z1^An!)I3)kb0NnI^wId&Tf%&5Y#3nSS#B$du!c3c*7jfqJNa&)iYtT^H(nE15s5S| zU{+g%{#p})-H91KC-?u!dr={CQDO_AXQgKbsl|9NPA@{En*_I{;rpl zH6K?-hEe)=QOW{#UwP(shGUR}QIY~PJmEC1Ucf^7xXurqGM?O42q>q@$m%MHm~^b^ zsE;2rFF|-kE%P;-xkVhU`DJEwOh#5mL8PrKxl67ElXNNetw;P>KCSd!`?9O|fJ#G@ z&_R%TloNEH^@lF6ZbNpc7{8g{%2_IMtV`oM9RMN9JuNQebT7i@08cdN%{I#M)d%xy zE=lhV{fBL>!QsvjkzI=;R=nkpcdspc%cCd2( PKL=J8w&vBx(bxY1v!Lr) literal 0 HcmV?d00001 diff --git a/browser/themes/shared/devtools/images/dock-bottom@2x.png b/browser/themes/shared/devtools/images/dock-bottom@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d5df16feaa2025608f015fa2a311832bae06d807 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJL{AsTkcwMxuWjUQFyL{y*y9|= z`*?#SoAz>(4#uE_<&MANcNtw;y+%Z7R_V@LZ>_@4{LYxq`2O%zZf2FMLT7wTc{NS~ zjrmaD5cx-7?xkrgPuLk48VnBnj`*Q^Ij$q)67!|>% z_VJFH7cb0@Tf#gg=%i~Ue-Tg3b``;kD^7>zT^BTri;iUba`Z$c?}RCrRg9k&9C)P! yGzJJh#5dghBQyV!8FS5h#gDg`;*H*RcCgt_+MXGnvr)_fq{P$J&t;ucLK6U8(>O!` literal 0 HcmV?d00001 diff --git a/browser/themes/shared/devtools/images/tool-debugger-paused@2x.png b/browser/themes/shared/devtools/images/tool-debugger-paused@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b49fc1fa026243f93008332e109739701ecaf7ad GIT binary patch literal 395 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyApt%iu0XorKrq99hJyXUK-AFC zkasXRAH)s;lR!pL!GR#4RN>x`f&(E1hl29=2IcPy2I?x@7g%^8xB$!sDL4?4w>J>T z`2Srs5NNJ+NswPK!%xOrpO{oDUbG)dIC;vgQ_{};pnX@;wr<-*V`0~~KxL;rT^vIy z;`UCy-FL`CS{ci%bx369ihzO>`DG zXq!o;@wpT(et4=;gNt`2b6|>;4*Q}F^P7cr^cPmA{PVcG_(T3HIrDoOcatBly|%af zRpQ3u@2h*}_C^1Y+aD*9c6HsItgDU$FkT(Zhr}z`HR6uXLoj za6wwmiV3X+ANbA`Jk@&7ku^bD(VF0>6g*ez*bx{I&1eQ(QwK+FDOtbf^-SnPk2zqY{J=T!vX_6keR@}Fm-Fv*KDVT@4`nL>ZnoiQ&4n`G&aS5~p{c=_ z_Qcr6MCa1Xnc!>^ln*gR?sIG(y6heoLZ9Z+zQHi|^BfKix}KW8cF~vMiQupI9oRx3{qa!FzxUq?DJR& zfQ#Vmp#*51+_M%d0dUd&ViSPE{b>TU1d!KXEy4VoaQ@qn7a|-iL})zr>gPE;%RV+4 zAtF*tR)I<_$U~{+aB#3vOb;VswU~!dF3lx(94GWR22rHrI6;i67m`QjLK4=z&Rj^C z?6p1_b0xdSwvtkAyRTV=VT?Ioqx`^0!thDNx|A}(*>WT^1W&46%V}dub2aUc34Gui s_16pnB9yr+`!&NHFbJC8=L_-t0IciS9EN~P(EtDd07*qoM6N<$f+7I>BLDyZ literal 0 HcmV?d00001 diff --git a/browser/themes/shared/devtools/images/tool-inspector@2x.png b/browser/themes/shared/devtools/images/tool-inspector@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..106ab48e2db0a2270bb64874d7dbaf5af2a23895 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzA5Ry@kch*{2@O z!RA%N!{-g#!nL8nAz4dC$MtyTt3D4;v0_~d(X1QK=z(%tc&?1 ga)tY>5?q)Wo(4PKmdKI;Vst0D4a>EC2ui literal 0 HcmV?d00001 diff --git a/browser/themes/shared/devtools/images/tool-network@2x.png b/browser/themes/shared/devtools/images/tool-network@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2a2d6605d0252e86cdc2f81f502cf0f5dacab1a5 GIT binary patch literal 409 zcmV;K0cQS*P)?>#-fHdr|`ZI~^7iOT`qlPoR1z-)2B;lomEsQ}` z!uYLBWfH2le7f?;`P_fvEWf644xd zKTtP2+tt<88^KrB`f%0VneJp}(wBe@&CG6h*W;_IuWN?>j}I*4j-W19g4&_a1qz&lAZEFzoL`@ZahDx#Aw)jkUhn zNoGKs_~d|a>p!Z;BmH~G$({Z^D4vb^1#Q7h}s5@d|7}gjaFzhE|&_hwQQb@MPL*_pNF=pOeuI!wD8i0Me z1Zz$P446~rMl066n7kmwdr1SVI}?EYdkx|dn->HKYZw6P{!*2EMnVZm>>tz#0dCTg zoIk%F9;l-CF@{5;Es})WLP>~wf}Gqn#_a*K#tx6E;;$vjs0AY;6);zV2WE+A<8p~; z0Z;=i%*Dz!R?0Cde%0Slkduj!fQpRyB!}P|@J%d%4(ox3>eXp$?YbTxTv>+lYmkB7 zfSlYk*3TO&$7@{2{&EfF*Wqc(hGeF~4LC8Ba-cUTCZRkBq#zlcpK|MBj9Ht^05mAM zi)AVorcpGi1DQ_lR6_WrH6Yx|p@NalpDnOvs-fN-{nIUhqLEyouOeJJJ%m0O<|C;; r%^DyOG%m3{Xf!gCeZ6mnl`(z+w9QX*t7ov%noZxu~dLjru&_EGXd;}UBsDY`9k%GRtq(H* z0cb=bU=3^>xy=Bx!q9UL?+GEq1`csmDYaS%yOViWq@kBm(=T5SSimeF_VmerGsu&6 zJDOy}tNIn0lyV{<+Rn1CvmycP!h%cXT-i<_%{lO86zvWq9b+dprW}u=Ny$8|zwcq3 z<;u{*teVIzOjNFaat_@Y$A{s+M(ja93d-7P@V;rinIo~O8wq0{`A)z_-#+(S4X5yB z*wBo$b{F#R_G`6T1$#nAhuG*1PQe>QfvJ+wMe~^{#E|JN912ljS!v3QUPwEHqW9gX z37T^I7)*W?0%Z@R05HXpLik^DP*p=^?g(vvKu_uDsV{>lc-Z$-Kp3Sxo(kGmWIWJ% zFYA3uL`}A=U6+cE)VGq@809H2%=1Lw{uCyfWjf+W%6P&9z3umWD9v@(jy<}XZhC2G zWkp~i(RyE?h^lskLUXcTtzGLIXZ?>TJXe%SUFKc$2UD&C3?4KZjcSAQ>j*MQ2T*KI z-Y-0?q%J0%<9fz*eAdZmt=FLCgtn*Purks4P}!5%0}nDe*Kr*-hJBDc zE>rOV(KdGO)ld%-w}dgX{hnk@&-moW!?3d+C&j#A;4Qp=SsHrL?@0zshhN%>aXm_b zHOjNRK7#Rj*|6sqrlL!OewaW9x?}w`!vK+*9%Ox*VGleEG}q^gV*LRR88`rMDIw4R O0000 literal 0 HcmV?d00001 diff --git a/browser/themes/shared/devtools/images/tool-scratchpad@2x.png b/browser/themes/shared/devtools/images/tool-scratchpad@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a44249bd0e94e8353d3c94e2beea2f1d79d3de18 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv#Q>iWS0MfR_1Cv=-@beI>D`CV zVD#zT$4~Fx1G%5xe)wdcn_&o4#8ndH7tA0j>zkgj?a0w%>FQgofuixAE{-7@6O$7Z zxI+{a4I)}wI)qn59o@jy7S`2yQq}+f literal 0 HcmV?d00001 diff --git a/browser/themes/shared/devtools/images/tool-styleeditor@2x.png b/browser/themes/shared/devtools/images/tool-styleeditor@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7b0cf2e796bd808d3b2342c0e7de53287f5bb264 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJt)4E9Ar-gYUbE$DF%WP_>`#9D zciYB|ANAzYrS&KF{M>k7b?Q+L;ff9}$r*Yd>@KOq&OYA5|I+=M=dXy~qGdUv4ay}k zbB!4|7C!!UN0ou|_nJp$Va&TuX*w$BB?vxnXs}?P!dS?_P{{BAintyW@0?t5jyHer7%^B&0q+Zpe% c?Wq5E{jcuyTz02;pa&Q{UHx3vIVCg!0NWE@kpKVy literal 0 HcmV?d00001 diff --git a/browser/themes/shared/devtools/images/tool-webconsole@2x.png b/browser/themes/shared/devtools/images/tool-webconsole@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e9b6bba5873de9da28be372f5c2830518d51f739 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzXHOT$kch)?&pC1dC0qjg-}3HR z)7kOc%4zMQ2mEJ#*$W3NZkcwMxr#f;SP~c(tJ?B^G z?>Yb0WHxtCf5hB%#D!}UbM-`x;)s)O92<+YKP|S6<3gv=;7+mCUC(+Jg_A|HM?6n16eEFn;u4|D{Br>mdKI;Vst0No} image { + width: 16px; + height: 16px; + -moz-appearance: none; + background-size: 16px 16px; + background-image: url("chrome://browser/skin/devtools/close@2x.png"); + background-position: center center; + background-repeat: no-repeat; +} + .devtools-closebutton > .toolbarbutton-icon { /* XXX Buttons have padding in widget/ that we don't want here but can't override with good CSS, so we must use evil CSS to give the impression of smaller content */ @@ -330,16 +339,25 @@ display: none; } -#toolbox-dock-bottom { - list-style-image: url("chrome://browser/skin/devtools/dock-bottom.png"); +#toolbox-dock-buttons > toolbarbutton > image { + -moz-appearance: none; + width: 16px; + height: 16px; + background-size: 16px 16px; + background-position: 0 center; + background-repeat: no-repeat; } -#toolbox-dock-side { - list-style-image: url("chrome://browser/skin/devtools/dock-side.png"); +#toolbox-dock-bottom > image { + background-image: url("chrome://browser/skin/devtools/dock-bottom@2x.png"); } -#toolbox-dock-window { - list-style-image: url("chrome://browser/skin/devtools/undock.png"); +#toolbox-dock-side > image { + background-image: url("chrome://browser/skin/devtools/dock-side@2x.png"); +} + +#toolbox-dock-window > image { + background-image: url("chrome://browser/skin/devtools/undock@2x.png"); } #toolbox-dock-window, @@ -372,7 +390,8 @@ border: none; padding: 0 8px; margin: 0; - width: 16px; + width: 32px; + position: relative; } .command-button:hover { @@ -382,78 +401,43 @@ background-color: hsla(206,37%,4%,.4); } -#command-button-paintflashing { - list-style-image: url("chrome://browser/skin/devtools/command-paintflashing.png"); - -moz-image-region: rect(0px, 16px, 16px, 0px); +.command-button > image { + -moz-appearance: none; + width: 16px; + height: 16px; + background-size: 64px 16px; + background-position: 0 center; + background-repeat: no-repeat; } -#command-button-paintflashing:hover { - -moz-image-region: rect(0px, 32px, 16px, 16px); +.command-button:hover > image { + background-position: -16px center; } -#command-button-paintflashing:hover:active { - -moz-image-region: rect(0px, 48px, 16px, 32px); +.command-button:hover:active > image { + background-position: -32px center; } -#command-button-paintflashing[checked=true] { - -moz-image-region: rect(0px, 64px, 16px, 48px); +.command-button[checked=true] > image { + background-position: -48px center; } -#command-button-responsive { - list-style-image: url("chrome://browser/skin/devtools/command-responsivemode.png"); - -moz-image-region: rect(0px, 16px, 16px, 0px); -} -#command-button-responsive:hover { - -moz-image-region: rect(0px, 32px, 16px, 16px); -} -#command-button-responsive:hover:active { - -moz-image-region: rect(0px, 48px, 16px, 32px); -} -#command-button-responsive[checked=true] { - -moz-image-region: rect(0px, 64px, 16px, 48px); +#command-button-paintflashing > image { + background-image: url("chrome://browser/skin/devtools/command-paintflashing@2x.png"); } -#command-button-tilt { - list-style-image: url("chrome://browser/skin/devtools/command-tilt.png"); - -moz-image-region: rect(0px, 16px, 16px, 0px); -} -#command-button-tilt:hover { - -moz-image-region: rect(0px, 32px, 16px, 16px); +#command-button-responsive > image { + background-image: url("chrome://browser/skin/devtools/command-responsivemode@2x.png"); } -#command-button-tilt:hover:active { - -moz-image-region: rect(0px, 48px, 16px, 32px); +#command-button-tilt > image { + background-image: url("chrome://browser/skin/devtools/command-tilt@2x.png"); } -#command-button-tilt[checked=true] { - -moz-image-region: rect(0px, 64px, 16px, 48px); +#command-button-scratchpad > image { + background-image: url("chrome://browser/skin/devtools/command-scratchpad@2x.png"); + background-size: 48px 16px; } -#command-button-scratchpad { - list-style-image: url("chrome://browser/skin/devtools/command-scratchpad.png"); - -moz-image-region: rect(0px, 16px, 16px, 0px); -} - -#command-button-scratchpad:hover { - -moz-image-region: rect(0px, 32px, 16px, 16px); -} - -#command-button-scratchpad:hover:active { - -moz-image-region: rect(0px, 48px, 16px, 32px); -} - -#command-button-splitconsole { - list-style-image: url("chrome://browser/skin/devtools/command-console.png"); - -moz-image-region: rect(0px, 16px, 16px, 0px); -} - -#command-button-splitconsole:hover { - -moz-image-region: rect(0px, 32px, 16px, 16px); -} - -#command-button-splitconsole:hover:active { - -moz-image-region: rect(0px, 48px, 16px, 32px); -} - -#command-button-splitconsole[checked=true] { - -moz-image-region: rect(0px, 64px, 16px, 48px); +#command-button-splitconsole > image { + background-image: url("chrome://browser/skin/devtools/command-console@2x.png"); } /* Tabs */ diff --git a/browser/themes/windows/devtools/close.png b/browser/themes/windows/devtools/close.png deleted file mode 100644 index b53941253d9ae00682f35b3ea779b4018a4d4c4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1466 zcmV;r1x5OaP)4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER00009a7bBm000XU000XU0RWnu7ytkPJV``BR5%gM zQ#($>KoFfp;aeagrQ(mc2^B~boPZn9atDNzROT1cxJhZ{3=~KpByJGoE)-VmU^_O8 zhBt;tYa1zr8!SET%$qmQJL|P#W~%ed)oGUAe`*kCx<4jrO~(s}n!-)LiOz-S1(|6&O4)pgz7vcB;4+>uCGmbDc| z$pe}_K@cU6UB}tO)>YY{QJ4n_1nhai2P;ZRQ6_c8lpGzLV4~`!$sJ9T5z*R0rX6tm zCQnQQz1TQiCGt(aau3ja2En%0UvF1;H^-gJi$lZ%>}GR5)8}S$9?PywfL!v!=+?IF z9mGn|ZeMQ*CpA+mab*OENGY{~C4nISQILz#GSXP;=JTh4DVP;k&R|wUxnA4g8;W=R UfMG){3;+NC07*qoM6N<$f;BO^bN~PV diff --git a/browser/themes/windows/devtools/command-paintflashing.png b/browser/themes/windows/devtools/command-paintflashing.png deleted file mode 100644 index b785131a23d98b5fdedacf04e2fcbeeaf066f57d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 961 zcmV;y13vtTP)|&Xz)kM6^%<0fBKBQ9C zTa-yJ5(b6fOWJd9y+k>;bIvZFe&4mh|NJ+{I(zWp!}rfQpD)|*x3euqmSrDtYZLy5 zKyStSG1Vi>v6|2VoR{;$z5&7IxdBuTfc{euMSlXQT0p5KDeuY5EWlaq0tP@71AGBd z^nU?03(%atmziz-Dg&I=E}$1gF~Bs4qW=@9TENk|tQ|d{Wq`BV1$2Wb2ABd-^nUH(FcDWZlK3M zaxIa-bol<;NC?xPjRdY2_|9i+Yknt30$g?hEC~_8c2>TRK{T3tV~VE0SfDvjSrQI7 zaM4jLz~%9-BU&Z5_f|OIz(t3}<6Y9aJ>J)JZzvpa;PQR%($admK10q#IN-qL7O+ZZ z?90h%9G4>jE;@<@*d5NTqT5?Tk60ODM1}$mTz&wjAZF8oEaWs2Eyz&7fy?(rNy?=G z-;iS^29cqF1DEY;&a|${Gz}Uzn}%hOaqSs$S>U3hSim2P$R z%Maji3P)(THgaw{CAS&r=PsLY$Svgif+&{Iy%*#>qW*KF9~+x+$UUoAKvA<+f7RBP zQ8^@oP32akkF+Z`MFMiI=>G~ diff --git a/browser/themes/windows/devtools/command-responsivemode.png b/browser/themes/windows/devtools/command-responsivemode.png deleted file mode 100644 index cbfa599048c1065c7250a5cd74b9684724f3ded3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1083 zcmV-B1jPG^P){UzO0owih;|zVdoglM>cwC%#$YhU7`2<(IQxCw_q6}zaJu(MZ+h|J_xtPTd++so zJ)EP$j~+kQsO_iXh4I1^PauOVU#LN7^a3-A^a_`}z>Ffl2!DBj8D(s0Nm}ydo%?w` z1C|$%K~_Ed?*r@^4a|ZIqePKEM~O04@0yv_{;d@_;0)&V(-Q&D#&MBA{H!e9*c-hF?ynud0 z0rdcTU;pKdDbv%?b`mDedI7r69h@D(B~J%9eDWKJJx`wn%xb=20i!Uu@Rh0)MK3Jg zkQtZtRyrom^7F(u58YBg_5l5e0_p(w9cURlCe9HBIDK#iaBpMI&bMJF4xjuAxL?)t zI6L$7S-`8GUbBEvv@?5ATWCxN$HduD z0DbP@Gk8<;UO*MV z{`b&ug}m`JIagxh>?nXfcW?@DZ)U!gvss|$^vO?vdmnTCoPEwbeHJit_XP`}fQ6s* z|Bw~zD#>lUIEaa}@lO2&J}<=SzFt5OV8^v5`1Q#@JXdh|GQo)vT=H~Q3l5+B2%_Xa zcK9q{M%_6J7%R5Vjhp>;8m|8*%qyH>Z2T;BUc;Gvs`S81x~~_o4PbX62Oj{t?sEq{ zM7gj^=oZ}kd&DhYAq+Tt7LZZhYXPI6G7Hzfj@$;vy|(jM`|RLx-1jHzzFxpq;8uWq z3-N*De65-H~ zDBvR?yAS6m_-vn9aD?;pL?Nd{n|qP0zE}hg z=H+3mH8Tb}DN%Qp8OpVSwBJ`nS11uc+e|j2$Z}TNUTWfOoYldtpv^32VOR^pS&W>S zXG?j`MyEdpmmWsWh}6JWyVs=4!N1B3O{yB^873BsnPL``5@}?(($Z3fH8W5Uu4E>Xl}-%wW(8Wj^Wq3WhUm&X`PE&!l4qad{G()|0X&mqKcW zobX=xiU<%?B~qg(0at33RgEH~D=O%vPst%kiA9$=nOt>tsZTZ%^3VPx$! z9Lrnmyv+_{o@J3FDP>L$pCZW(tw@eiBU@U-Id~h(TdimgM46idZXHQbh5soFszvfh zBHy4yf`aOjgF+)N%s?Zg&_#z13lKaG(V4XtSfl0)QkstVxJIA8H?$+O3Gq+D1vImcC96azX&nXruqGB_>ESu9QcP!ll`YELpg4lgHQw@UyY4qa6V`c^rj>NEB$B zt;{gG+cM`@=6KRP$xX`(qIQtEL~Sns$;pgq%?>N$OxxuDcLG!S5&PsdVoe})zYUd2 zl~hfhB&sy1F(CrV8{wM3Z1YsYv5wr#PDVTP1M=88NVSfgn$g8Nekz^XQO3h%0EZ+b z@pDdQTwAtsO7GXEGtivW+s!QeFr4XR$bcO z7fJ&g6I@tCsDR)?X<%c53yTO95L_q?Y)o)r5upNt3#EaL2`(%mR6uZ{G_Wzjg++u4 z2riTcHYT{Rh)@B+h0?&r1Q!+&Dj>K}8rb;0xb)c<{y+%6r5 ze%_#lP9L68blS6Ji|5qE$8M~t9Z1a1dvWP?qq?l{&FXr&skB7vxdW0 z3$C62cZgYgPIuDs_{;@E>%Od)W-c9S=_>wsWWkbIh2f50y!CYA#YehcJ}|u1Fz@Xt zd*1l)xn1X&WgYhJ-2>70Zrys~g?8RbC63hGnWdcY*d@#Iz76(IAEGaJ_P;yw-j3a^ zl;Ctftma6ebRDU+BE#x;JFp_;r*wl&!u{=>rZXh3qvCm9X!^#<;o{}*^vhl zC#QvfG;L90dQbaC%fqqdU&Tf$VW3-fLEok8{cU&4qv!v&?y;$`aE$5|ZMBvsPhM*3 zr>ghQ`g7~tzvusHJN=G65bx66X#N3MHBh(fqpQas3cBb#PxsQnm5J0;-Bt^%PTF<9x}d#UdcW8b4^+6xoI`PPo#=(b(Ipu1SH z`NUsenKNT}>sDRQyw~BS=$ixIf~koeuWub@mVXUGD~?ok70nkJapdx%2c{icnMb|k X@4x%I&~cCUo~pNUz5D3ux@Z0irlGlo diff --git a/browser/themes/windows/devtools/command-tilt.png b/browser/themes/windows/devtools/command-tilt.png deleted file mode 100644 index f816bba59cedb2fb2069b4d0a4ff09225e99cdb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1668 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 TBs@G%00000NkvXXu0mjfT(8IR diff --git a/browser/themes/windows/devtools/tool-profiler.png b/browser/themes/windows/devtools/tool-profiler.png deleted file mode 100644 index 8f30f12a9d52bd62ee7b10180dd66fd8f45e72b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1834 zcmV+_2i5qAP)4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER00009a7bBm000XU000XU0RWnu7ytkQtVu*cR5%f( zQ%h)5K@^>N`81{eYe^ScQ%c)_i!NNb5K_An!G&E^QAAt_6$QaA+(=h-VRh455fL;B zrhcJ*T8pTl_<=OoLZo7=lKzsWO-)|j|0UzOPaA_<2kx7hbI(0<=gxgx2*Lhmxc?1a zVQjtEv^%+Adl=)*j0*{zY1oLc+*hiqSh75ZmuH~pb{psX8iF>JlS*sBHO|@TO0O%j zij@TNy4@;qeiy+m-Oyhoe$3pseEsSe5lo%6sw>c z9@hgeIJmNHS>|iTe7|cj^6c@wLQyP9l53Y&H4ctG85+`ca~cO|WV9xXe8jjPfmeNNHuFQn3EF7)-$bFaRV6IaT>QNxF>g9+W}ceBj}i7ny3L{Bl6vVog8j4~;W YU#@V)?0xW-3IG5A07*qoM6N<$g6IHrzW@LL diff --git a/browser/themes/windows/devtools/tool-scratchpad.png b/browser/themes/windows/devtools/tool-scratchpad.png deleted file mode 100644 index 07505167046e3f69067e333a846d7ce989f64051..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1251 zcmbVMTWs4@81|@`(xnycG%-;s^~lo-MT;FfO=FveEQu2uASGl`o5wo#X=}CiaqQE@ z?Z!5$qOKiClaP3z(!}G+WtzkTNUInVw+(F%Ou)*db=r6s64I(NHVv^U9Jfv3p_&ku z>~s6R|MH#x_e`$$#l~$d+bD`^%=E~4GB$ayZ!7t>-Ki>McnYVAcpnM8n^AiC%vl=f zT9ob&XMrNJr$ zk3{LUpo-ZXNFp18FcS`_L9P=-M1~76eTVU)*qU9v$a7f zFQ?aikyVr)#@Lcrwo<7ul@NpMA(j(Gkqz=J&j$!1;EbDCaRa8at7bulj%w=`){zN3 zi%JQN;V4ZaT}#2Rve^y8rn4>-k&JZ}i{+RgYZzW$t7r%3;Xh$)igpU)7G(3#L1VT` z?qhIQjZCzAv?C8lqLE&;b#f`nsEpJx1DZG^M`?1xXu2k83MZ6=5*Oej5g`CeokBq1 zU>6aP7rH_aYO2s#v$Gk$E6pc(ffG3~k>I#gD4ycONuf&?!ii8)j0iPu#&ob^s<7r; zC%)IYg#8Gvl(eCOkzGJ&v{nVVVT6%0j4Y5$f@k}6Q$rP}!@Hrigk@;!`=OS$kpWgE zmh?^B|F_iF_}c%KjwL~{UY-1_ZfaYk7`^F67m&q9A3>8ek4?Jdmn#F)6t%^dk>dsT zYUx3>8mmiD8s+<>yuu%>-o4dwwEf-2%im57p4c%nI<=)Ows83V^7XUN>gV*0Wz4yV&U&}9puYLZO(qijJ7jN$AS^D$9^3ub_PtoAsY{A8i8@5J=&$>)Rp z&2v*nm|T4SxwfYAZ$Ewf!xgl2@JRja>`~vz`T0xj?G2}Hmd_n-Ro;Jl`_>4$_T9wY z-*@*_kIfwOfAHaa_RCw7e))bi_MX3?c%1)nD4kB5+xZ*)J9eIS?yMYdsv8I$I`r_5 b$H5oWuk`nC-plMh>HT&xsb2Y1Vqo%bax<%a diff --git a/browser/themes/windows/devtools/tool-styleeditor.png b/browser/themes/windows/devtools/tool-styleeditor.png deleted file mode 100644 index 83765d9f6e9e89ce9eda425827be7e82e4f98628..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1541 zcmV+g2KxDlP)4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER00009a7bBm000XU000XU0RWnu7ytkPheYJ36_h~AyR-QF#% z^KD$S;3?P9^L+23T+E-@Vi;ub!8nnS zR>(11rzP#Ef72PI@HyP*KHU~Y&O%7xE zfWu-KCk#FM{fJKWy$Nkv8=kjXGM000000NkvXXu0mjfFPPxo diff --git a/browser/themes/windows/devtools/tool-webconsole.png b/browser/themes/windows/devtools/tool-webconsole.png deleted file mode 100644 index 86633249a19bf57ba7747f33938a538f9d0c67a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1456 zcmV;h1yA~kP)4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER00009a7bBm000XU000XU0RWnu7ytkPGD$>1R5%f( zlIu#tKoCZ=RniCOEynjNt(5){#j5B_h`T;?XBjkB#c!H-}Yg6;X|;yP7Y&|WG%vzhu?!FI8hT&2n^ zXoKX;X6V@v;1VSt(br{~nTYl>)29?Jv-N?!M#*~=Uw~jv8zd(-vsF+oezywP4| z`q)aGUjd(;7KGHE?;DsoEu~~O$JTeU*Ul-Go))Y%g<4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER00009a7bBm000XU000XU0RWnu7ytkP7)eAyR5%f( zQ9W>*Vt6o)mJ7U z^Xtp(xfT?uQhi@sV_V>Kb!yRyvV-~1QRk5>(Z4PLS|S1K5X+xl)OoTV@e1Izt-Ir? zijk;brCf7!CJDJgQq?!Y+UFP({~mD8BRVKc{MsGN{G7guh~I{s#bO2kLw%*~Uu*JD kk-)#WH4dNgR-e-y0la?QA$Jn6CIA2c07*qoM6N<$f+A3>MF0Q* diff --git a/browser/themes/windows/jar.mn b/browser/themes/windows/jar.mn index 4e71cec52b4..3411d94de80 100644 --- a/browser/themes/windows/jar.mn +++ b/browser/themes/windows/jar.mn @@ -184,11 +184,11 @@ browser.jar: skin/classic/browser/devtools/alerticon-warning.png (devtools/alerticon-warning.png) skin/classic/browser/devtools/ruleview.css (devtools/ruleview.css) skin/classic/browser/devtools/commandline.css (devtools/commandline.css) - skin/classic/browser/devtools/command-paintflashing.png (devtools/command-paintflashing.png) - skin/classic/browser/devtools/command-responsivemode.png (devtools/command-responsivemode.png) - skin/classic/browser/devtools/command-scratchpad.png (devtools/command-scratchpad.png) - skin/classic/browser/devtools/command-tilt.png (devtools/command-tilt.png) - skin/classic/browser/devtools/command-console.png (devtools/command-console.png) + skin/classic/browser/devtools/command-paintflashing@2x.png (../shared/devtools/images/command-paintflashing@2x.png) + skin/classic/browser/devtools/command-responsivemode@2x.png (../shared/devtools/images/command-responsivemode@2x.png) + skin/classic/browser/devtools/command-scratchpad@2x.png (../shared/devtools/images/command-scratchpad@2x.png) + skin/classic/browser/devtools/command-tilt@2x.png (../shared/devtools/images/command-tilt@2x.png) + skin/classic/browser/devtools/command-console@2x.png (../shared/devtools/images/command-console@2x.png) skin/classic/browser/devtools/markup-view.css (../shared/devtools/markup-view.css) skin/classic/browser/devtools/editor-error.png (devtools/editor-error.png) skin/classic/browser/devtools/editor-breakpoint.png (devtools/editor-breakpoint.png) @@ -256,25 +256,26 @@ browser.jar: skin/classic/browser/devtools/responsive-horizontal-resizer.png (devtools/responsive-horizontal-resizer.png) skin/classic/browser/devtools/responsive-background.png (devtools/responsive-background.png) skin/classic/browser/devtools/toggle-tools.png (devtools/toggle-tools.png) - skin/classic/browser/devtools/dock-bottom.png (devtools/dock-bottom.png) - skin/classic/browser/devtools/dock-side.png (devtools/dock-side.png) + skin/classic/browser/devtools/dock-bottom@2x.png (../shared/devtools/images/dock-bottom@2x.png) + skin/classic/browser/devtools/dock-side@2x.png (../shared/devtools/images/dock-side@2x.png) skin/classic/browser/devtools/floating-scrollbars.css (devtools/floating-scrollbars.css) skin/classic/browser/devtools/floating-scrollbars-light.css (devtools/floating-scrollbars-light.css) skin/classic/browser/devtools/inspector.css (devtools/inspector.css) skin/classic/browser/devtools/profiler-stopwatch.png (devtools/profiler-stopwatch.png) - skin/classic/browser/devtools/tool-options.png (devtools/tool-options.png) - skin/classic/browser/devtools/tool-webconsole.png (devtools/tool-webconsole.png) - skin/classic/browser/devtools/tool-debugger.png (devtools/tool-debugger.png) - skin/classic/browser/devtools/tool-debugger-paused.png (devtools/tool-debugger-paused.png) - skin/classic/browser/devtools/tool-inspector.png (devtools/tool-inspector.png) - skin/classic/browser/devtools/tool-styleeditor.png (devtools/tool-styleeditor.png) - skin/classic/browser/devtools/tool-profiler.png (devtools/tool-profiler.png) - skin/classic/browser/devtools/tool-network.png (devtools/tool-network.png) - skin/classic/browser/devtools/tool-scratchpad.png (devtools/tool-scratchpad.png) - skin/classic/browser/devtools/close.png (devtools/close.png) + skin/classic/browser/devtools/tool-options@2x.png (../shared/devtools/images/tool-options@2x.png) + skin/classic/browser/devtools/tool-webconsole@2x.png (../shared/devtools/images/tool-webconsole@2x.png) + skin/classic/browser/devtools/tool-debugger@2x.png (../shared/devtools/images/tool-debugger@2x.png) + skin/classic/browser/devtools/tool-debugger-paused@2x.png (../shared/devtools/images/tool-debugger-paused@2x.png) + skin/classic/browser/devtools/tool-inspector@2x.png (../shared/devtools/images/tool-inspector@2x.png) + skin/classic/browser/devtools/tool-styleeditor@2x.png (../shared/devtools/images/tool-styleeditor@2x.png) + skin/classic/browser/devtools/tool-profiler@2x.png (../shared/devtools/images/tool-profiler@2x.png) + skin/classic/browser/devtools/tool-network@2x.png (../shared/devtools/images/tool-network@2x.png) + skin/classic/browser/devtools/tool-scratchpad@2x.png (../shared/devtools/images/tool-scratchpad@2x.png) + skin/classic/browser/devtools/close.png (../shared/devtools/images/close.png) + skin/classic/browser/devtools/close@2x.png (../shared/devtools/images/close@2x.png) skin/classic/browser/devtools/vview-delete.png (devtools/vview-delete.png) skin/classic/browser/devtools/vview-edit.png (devtools/vview-edit.png) - skin/classic/browser/devtools/undock.png (devtools/undock.png) + skin/classic/browser/devtools/undock@2x.png (../shared/devtools/images/undock@2x.png) skin/classic/browser/devtools/font-inspector.css (devtools/font-inspector.css) skin/classic/browser/devtools/computedview.css (devtools/computedview.css) skin/classic/browser/devtools/arrow-e.png (devtools/arrow-e.png) @@ -491,11 +492,11 @@ browser.jar: skin/classic/aero/browser/devtools/controls.png (../shared/devtools/controls.png) * skin/classic/aero/browser/devtools/widgets.css (devtools/widgets.css) skin/classic/aero/browser/devtools/commandline-icon.png (devtools/commandline-icon.png) - skin/classic/aero/browser/devtools/command-paintflashing.png (devtools/command-paintflashing.png) - skin/classic/aero/browser/devtools/command-responsivemode.png (devtools/command-responsivemode.png) - skin/classic/aero/browser/devtools/command-scratchpad.png (devtools/command-scratchpad.png) - skin/classic/aero/browser/devtools/command-tilt.png (devtools/command-tilt.png) - skin/classic/aero/browser/devtools/command-console.png (devtools/command-console.png) + skin/classic/aero/browser/devtools/command-paintflashing@2x.png (../shared/devtools/images/command-paintflashing@2x.png) + skin/classic/aero/browser/devtools/command-responsivemode@2x.png (../shared/devtools/images/command-responsivemode@2x.png) + skin/classic/aero/browser/devtools/command-scratchpad@2x.png (../shared/devtools/images/command-scratchpad@2x.png) + skin/classic/aero/browser/devtools/command-tilt@2x.png (../shared/devtools/images/command-tilt@2x.png) + skin/classic/aero/browser/devtools/command-console@2x.png (../shared/devtools/images/command-console@2x.png) skin/classic/aero/browser/devtools/alerticon-warning.png (devtools/alerticon-warning.png) skin/classic/aero/browser/devtools/ruleview.css (devtools/ruleview.css) skin/classic/aero/browser/devtools/commandline.css (devtools/commandline.css) @@ -566,25 +567,26 @@ browser.jar: skin/classic/aero/browser/devtools/responsive-horizontal-resizer.png (devtools/responsive-horizontal-resizer.png) skin/classic/aero/browser/devtools/responsive-background.png (devtools/responsive-background.png) skin/classic/aero/browser/devtools/toggle-tools.png (devtools/toggle-tools.png) - skin/classic/aero/browser/devtools/dock-bottom.png (devtools/dock-bottom.png) - skin/classic/aero/browser/devtools/dock-side.png (devtools/dock-side.png) + skin/classic/aero/browser/devtools/dock-bottom@2x.png (../shared/devtools/images/dock-bottom@2x.png) + skin/classic/aero/browser/devtools/dock-side@2x.png (../shared/devtools/images/dock-side@2x.png) skin/classic/aero/browser/devtools/floating-scrollbars.css (devtools/floating-scrollbars.css) skin/classic/aero/browser/devtools/floating-scrollbars-light.css (devtools/floating-scrollbars-light.css) skin/classic/aero/browser/devtools/inspector.css (devtools/inspector.css) skin/classic/aero/browser/devtools/profiler-stopwatch.png (devtools/profiler-stopwatch.png) - skin/classic/aero/browser/devtools/tool-options.png (devtools/tool-options.png) - skin/classic/aero/browser/devtools/tool-webconsole.png (devtools/tool-webconsole.png) - skin/classic/aero/browser/devtools/tool-debugger.png (devtools/tool-debugger.png) - skin/classic/aero/browser/devtools/tool-debugger-paused.png (devtools/tool-debugger-paused.png) - skin/classic/aero/browser/devtools/tool-inspector.png (devtools/tool-inspector.png) - skin/classic/aero/browser/devtools/tool-styleeditor.png (devtools/tool-styleeditor.png) - skin/classic/aero/browser/devtools/tool-profiler.png (devtools/tool-profiler.png) - skin/classic/aero/browser/devtools/tool-network.png (devtools/tool-network.png) - skin/classic/aero/browser/devtools/tool-scratchpad.png (devtools/tool-scratchpad.png) - skin/classic/aero/browser/devtools/close.png (devtools/close.png) + skin/classic/aero/browser/devtools/tool-options@2x.png (../shared/devtools/images/tool-options@2x.png) + skin/classic/aero/browser/devtools/tool-webconsole@2x.png (../shared/devtools/images/tool-webconsole@2x.png) + skin/classic/aero/browser/devtools/tool-debugger@2x.png (../shared/devtools/images/tool-debugger@2x.png) + skin/classic/aero/browser/devtools/tool-debugger-paused@2x.png (../shared/devtools/images/tool-debugger-paused@2x.png) + skin/classic/aero/browser/devtools/tool-inspector@2x.png (../shared/devtools/images/tool-inspector@2x.png) + skin/classic/aero/browser/devtools/tool-styleeditor@2x.png (../shared/devtools/images/tool-styleeditor@2x.png) + skin/classic/aero/browser/devtools/tool-profiler@2x.png (../shared/devtools/images/tool-profiler@2x.png) + skin/classic/aero/browser/devtools/tool-network@2x.png (../shared/devtools/images/tool-network@2x.png) + skin/classic/aero/browser/devtools/tool-scratchpad@2x.png (../shared/devtools/images/tool-scratchpad@2x.png) + skin/classic/aero/browser/devtools/close.png (../shared/devtools/images/close.png) + skin/classic/aero/browser/devtools/close@2x.png (../shared/devtools/images/close@2x.png) skin/classic/aero/browser/devtools/vview-delete.png (devtools/vview-delete.png) skin/classic/aero/browser/devtools/vview-edit.png (devtools/vview-edit.png) - skin/classic/aero/browser/devtools/undock.png (devtools/undock.png) + skin/classic/aero/browser/devtools/undock@2x.png (../shared/devtools/images/undock@2x.png) skin/classic/aero/browser/devtools/font-inspector.css (devtools/font-inspector.css) skin/classic/aero/browser/devtools/computedview.css (devtools/computedview.css) skin/classic/aero/browser/devtools/arrow-e.png (devtools/arrow-e.png) From ede43ec4ed819f75650e1141208d90b3cf98a55a Mon Sep 17 00:00:00 2001 From: Sam Foster Date: Fri, 3 Jan 2014 11:47:45 -0800 Subject: [PATCH 03/20] Bug 948139 - Use UITelemetry to capture clicks on the 'switch to desktop' appbar item. r=mbrubeck --- browser/metro/base/content/appbar.js | 26 +++++++++++++++++++ browser/metro/base/content/browser-scripts.js | 2 ++ 2 files changed, 28 insertions(+) diff --git a/browser/metro/base/content/appbar.js b/browser/metro/base/content/appbar.js index e4629ed4196..d0b89160d1e 100644 --- a/browser/metro/base/content/appbar.js +++ b/browser/metro/base/content/appbar.js @@ -25,6 +25,14 @@ var Appbar = { // tilegroup selection events for all modules get bubbled up window.addEventListener("selectionchange", this, false); + + // gather appbar telemetry data + try { + UITelemetry.addSimpleMeasureFunction("metro-appbar", + this.getAppbarMeasures.bind(this)); + } catch (ex) { + // swallow exception that occurs if metro-appbar measure is already set up + } }, handleEvent: function Appbar_handleEvent(aEvent) { @@ -149,6 +157,7 @@ var Appbar = { getService(Components.interfaces.nsIAppStartup); Services.prefs.setBoolPref('browser.sessionstore.resume_session_once', true); + this._incrementCountableEvent("switch-to-desktop-button"); appStartup.quit(Components.interfaces.nsIAppStartup.eAttemptQuit | Components.interfaces.nsIAppStartup.eRestart); }, @@ -273,6 +282,22 @@ var Appbar = { } }, + // track certain appbar events and interactions for the UITelemetry probe + _countableEvents: {}, + + _incrementCountableEvent: function(aName) { + if (!(aName in this._countableEvents)) { + this._countableEvents[aName] = 0; + } + this._countableEvents[aName]++; + }, + + getAppbarMeasures: function() { + return { + countableEvents: this._countableEvents + }; + }, + _updatePinButton: function() { this.pinButton.checked = Browser.isSitePinned(); }, @@ -282,4 +307,5 @@ var Appbar = { this.starButton.checked = isStarred; }.bind(this)); }, + }; diff --git a/browser/metro/base/content/browser-scripts.js b/browser/metro/base/content/browser-scripts.js index bbbdc3f42c9..0e1290326ad 100644 --- a/browser/metro/base/content/browser-scripts.js +++ b/browser/metro/base/content/browser-scripts.js @@ -54,6 +54,8 @@ XPCOMUtils.defineLazyModuleGetter(this, "Task", XPCOMUtils.defineLazyModuleGetter(this, "OS", "resource://gre/modules/osfile.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "UITelemetry", + "resource://gre/modules/UITelemetry.jsm"); /* * Services */ From ed86b484a76a93171034f8133bfc41bdcbca7786 Mon Sep 17 00:00:00 2001 From: Jared Wein Date: Fri, 3 Jan 2014 14:57:19 -0500 Subject: [PATCH 04/20] Bug 946320 - [Australis] history widget missing a "Tabs From Other Devices" entry. r=Gijs --- browser/base/content/browser-places.js | 10 +--- .../customizableui/content/panelUI.inc.xul | 7 +++ .../src/CustomizableWidgets.jsm | 17 +++++++ .../customizableui/test/browser.ini | 1 + ...rowser_946320_tabs_from_other_computers.js | 50 +++++++++++++++++++ .../components/customizableui/test/head.js | 30 +++++++++++ .../components/places/src/PlacesUIUtils.jsm | 21 +++++++- browser/components/places/src/moz.build | 2 +- 8 files changed, 128 insertions(+), 10 deletions(-) create mode 100644 browser/components/customizableui/test/browser_946320_tabs_from_other_computers.js diff --git a/browser/base/content/browser-places.js b/browser/base/content/browser-places.js index 8f3469c0e64..3c0087fb431 100644 --- a/browser/base/content/browser-places.js +++ b/browser/base/content/browser-places.js @@ -569,18 +569,12 @@ HistoryMenu.prototype = { if (!menuitem) return; - // If Sync isn't configured yet, then don't show the menuitem. - if (Weave.Status.checkSetup() == Weave.CLIENT_NOT_CONFIGURED || - Weave.Svc.Prefs.get("firstSync", "") == "notReady") { + if (!PlacesUIUtils.shouldShowTabsFromOtherComputersMenuitem()) { menuitem.setAttribute("hidden", true); return; } - // The tabs engine might never be inited (if services.sync.registerEngines - // is modified), so make sure we avoid undefined errors. - let enabled = Weave.Service.isLoggedIn && - Weave.Service.engineManager.get("tabs") && - Weave.Service.engineManager.get("tabs").enabled; + let enabled = PlacesUIUtils.shouldEnableTabsFromOtherComputersMenuitem(); menuitem.setAttribute("disabled", !enabled); menuitem.setAttribute("hidden", false); #endif diff --git a/browser/components/customizableui/content/panelUI.inc.xul b/browser/components/customizableui/content/panelUI.inc.xul index 60b7a18eca3..ef4bf5ebb68 100644 --- a/browser/components/customizableui/content/panelUI.inc.xul +++ b/browser/components/customizableui/content/panelUI.inc.xul @@ -45,6 +45,13 @@ +#ifdef MOZ_SERVICES_SYNC + +#endif diff --git a/browser/components/customizableui/src/CustomizableWidgets.jsm b/browser/components/customizableui/src/CustomizableWidgets.jsm index 5f4391e4163..602d3d3b0f9 100644 --- a/browser/components/customizableui/src/CustomizableWidgets.jsm +++ b/browser/components/customizableui/src/CustomizableWidgets.jsm @@ -12,6 +12,8 @@ Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils", "resource://gre/modules/PlacesUtils.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "PlacesUIUtils", + "resource:///modules/PlacesUIUtils.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "RecentlyClosedTabsAndWindowsMenuUtils", "resource:///modules/sessionstore/RecentlyClosedTabsAndWindowsMenuUtils.jsm"); XPCOMUtils.defineLazyServiceGetter(this, "CharsetManager", @@ -133,6 +135,21 @@ const CustomizableWidgets = [{ recentlyClosedWindows.removeChild(recentlyClosedWindows.firstChild); } +#ifdef MOZ_SERVICES_SYNC + let tabsFromOtherComputers = doc.getElementById("sync-tabs-menuitem2"); + if (PlacesUIUtils.shouldShowTabsFromOtherComputersMenuitem()) { + tabsFromOtherComputers.removeAttribute("hidden"); + } else { + tabsFromOtherComputers.setAttribute("hidden", true); + } + + if (PlacesUIUtils.shouldEnableTabsFromOtherComputersMenuitem()) { + tabsFromOtherComputers.removeAttribute("disabled"); + } else { + tabsFromOtherComputers.setAttribute("disabled", true); + } +#endif + let tabsFragment = RecentlyClosedTabsAndWindowsMenuUtils.getTabsFragment(doc.defaultView, "toolbarbutton"); let separator = doc.getElementById("PanelUI-recentlyClosedTabs-separator"); separator.hidden = !tabsFragment.childElementCount; diff --git a/browser/components/customizableui/test/browser.ini b/browser/components/customizableui/test/browser.ini index 87612bd56a6..278a1618787 100644 --- a/browser/components/customizableui/test/browser.ini +++ b/browser/components/customizableui/test/browser.ini @@ -49,6 +49,7 @@ skip-if = os == "mac" [browser_943683_migration_test.js] [browser_944887_destroyWidget_should_destroy_in_palette.js] [browser_945739_showInPrivateBrowsing_customize_mode.js] +[browser_946320_tabs_from_other_computers.js] [browser_947987_removable_default.js] [browser_948985_non_removable_defaultArea.js] [browser_952963_areaType_getter_no_area.js] diff --git a/browser/components/customizableui/test/browser_946320_tabs_from_other_computers.js b/browser/components/customizableui/test/browser_946320_tabs_from_other_computers.js new file mode 100644 index 00000000000..99a7e50021d --- /dev/null +++ b/browser/components/customizableui/test/browser_946320_tabs_from_other_computers.js @@ -0,0 +1,50 @@ +/* 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/. */ + +"use strict"; + +let Preferences = Cu.import("resource://gre/modules/Preferences.jsm", {}).Preferences; +Cu.import("resource://gre/modules/Promise.jsm"); + +add_task(function() { + let shownPanelPromise = promisePanelShown(window); + PanelUI.toggle({type: "command"}); + yield shownPanelPromise; + + let historyButton = document.getElementById("history-panelmenu"); + let historySubview = document.getElementById("PanelUI-history"); + let subviewShownPromise = subviewShown(historySubview); + EventUtils.synthesizeMouseAtCenter(historyButton, {}); + yield subviewShownPromise; + + let tabsFromOtherComputers = document.getElementById("sync-tabs-menuitem2"); + is(tabsFromOtherComputers.hidden, true, "The Tabs From Other Computers menuitem should be hidden when sync isn't enabled."); + + let subviewHiddenPromise = subviewHidden(historySubview); + let panelMultiView = document.getElementById("PanelUI-multiView"); + panelMultiView.showMainView(); + yield subviewHiddenPromise; + + // Part 2 - When Sync is enabled the menuitem should be shown. + Weave.Service.createAccount("john@doe.com", "mysecretpw", + "challenge", "response"); + Weave.Service.identity.account = "john@doe.com"; + Weave.Service.identity.basicPassword = "mysecretpw"; + Weave.Service.identity.syncKey = Weave.Utils.generatePassphrase(); + Weave.Svc.Prefs.set("firstSync", "newAccount"); + Weave.Service.persistLogin(); + + subviewShownPromise = subviewShown(historySubview); + EventUtils.synthesizeMouseAtCenter(historyButton, {}); + yield subviewShownPromise; + + is(tabsFromOtherComputers.hidden, false, "The Tabs From Other Computers menuitem should be shown when sync is enabled."); + + let syncPrefBranch = new Preferences("services.sync."); + syncPrefBranch.resetBranch(""); + + let hiddenPanelPromise = promisePanelHidden(window); + PanelUI.toggle({type: "command"}); + yield hiddenPanelPromise; +}); diff --git a/browser/components/customizableui/test/head.js b/browser/components/customizableui/test/head.js index 7121743608f..ed528bd2431 100644 --- a/browser/components/customizableui/test/head.js +++ b/browser/components/customizableui/test/head.js @@ -246,6 +246,36 @@ function promisePanelElementHidden(win, aPanel) { return deferred.promise; } +function subviewShown(aSubview) { + let deferred = Promise.defer(); + let win = aSubview.ownerDocument.defaultView; + let timeoutId = win.setTimeout(() => { + deferred.reject("Subview (" + aSubview.id + ") did not show within 20 seconds."); + }, 20000); + function onViewShowing(e) { + aSubview.removeEventListener("ViewShowing", onViewShowing); + win.clearTimeout(timeoutId); + deferred.resolve(); + }; + aSubview.addEventListener("ViewShowing", onViewShowing); + return deferred.promise; +} + +function subviewHidden(aSubview) { + let deferred = Promise.defer(); + let win = aSubview.ownerDocument.defaultView; + let timeoutId = win.setTimeout(() => { + deferred.reject("Subview (" + aSubview.id + ") did not hide within 20 seconds."); + }, 20000); + function onViewHiding(e) { + aSubview.removeEventListener("ViewHiding", onViewHiding); + win.clearTimeout(timeoutId); + deferred.resolve(); + }; + aSubview.addEventListener("ViewHiding", onViewHiding); + return deferred.promise; +} + function waitForCondition(aConditionFn, aMaxTries=50, aCheckInterval=100) { function tryNow() { tries++; diff --git a/browser/components/places/src/PlacesUIUtils.jsm b/browser/components/places/src/PlacesUIUtils.jsm index ffbeeab4005..16d8c3ff8db 100644 --- a/browser/components/places/src/PlacesUIUtils.jsm +++ b/browser/components/places/src/PlacesUIUtils.jsm @@ -19,6 +19,11 @@ XPCOMUtils.defineLazyModuleGetter(this, "PluralForm", XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils", "resource://gre/modules/PrivateBrowsingUtils.jsm"); +#ifdef MOZ_SERVICES_SYNC +XPCOMUtils.defineLazyModuleGetter(this, "Weave", + "resource://services-sync/main.js"); +#endif + XPCOMUtils.defineLazyGetter(this, "PlacesUtils", function() { Cu.import("resource://gre/modules/PlacesUtils.jsm"); return PlacesUtils; @@ -987,7 +992,21 @@ this.PlacesUIUtils = { } } return queryName; - } + }, + + shouldShowTabsFromOtherComputersMenuitem: function() { + // If Sync isn't configured yet, then don't show the menuitem. + return Weave.Status.checkSetup() != Weave.CLIENT_NOT_CONFIGURED && + Weave.Svc.Prefs.get("firstSync", "") != "notReady"; + }, + + shouldEnableTabsFromOtherComputersMenuitem: function() { + // The tabs engine might never be inited (if services.sync.registerEngines + // is modified), so make sure we avoid undefined errors. + return Weave.Service.isLoggedIn && + Weave.Service.engineManager.get("tabs") && + Weave.Service.engineManager.get("tabs").enabled; + }, }; XPCOMUtils.defineLazyServiceGetter(PlacesUIUtils, "RDF", diff --git a/browser/components/places/src/moz.build b/browser/components/places/src/moz.build index 58c9712f49b..cbeaf1cc811 100644 --- a/browser/components/places/src/moz.build +++ b/browser/components/places/src/moz.build @@ -9,7 +9,7 @@ EXTRA_COMPONENTS += [ 'PlacesProtocolHandler.js', ] -EXTRA_JS_MODULES += [ +EXTRA_PP_JS_MODULES += [ 'PlacesUIUtils.jsm', ] From e119c6ef4052453a121854784f78a776a390e436 Mon Sep 17 00:00:00 2001 From: Jared Wein Date: Fri, 3 Jan 2014 14:57:22 -0500 Subject: [PATCH 05/20] Bug 933926 - [Australis] Hide customization palette during transition phase. r=Unfocused --- .../customizableui/src/CustomizeMode.jsm | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/browser/components/customizableui/src/CustomizeMode.jsm b/browser/components/customizableui/src/CustomizeMode.jsm index f78e8aa3d76..dd93450b3df 100644 --- a/browser/components/customizableui/src/CustomizeMode.jsm +++ b/browser/components/customizableui/src/CustomizeMode.jsm @@ -129,10 +129,13 @@ CustomizeMode.prototype = { window.PanelUI.menuButton.open = true; window.PanelUI.beginBatchUpdate(); + // Hide the palette before starting the transition for increased perf. + this.visiblePalette.hidden = true; + // Move the mainView in the panel to the holder so that we can see it // while customizing. - let panelHolder = document.getElementById("customization-panelHolder"); let mainView = window.PanelUI.mainView; + let panelHolder = document.getElementById("customization-panelHolder"); panelHolder.appendChild(mainView); let customizeButton = document.getElementById("PanelUI-customize"); @@ -191,6 +194,10 @@ CustomizeMode.prototype = { window.PanelUI.endBatchUpdate(); this._customizing = true; this._transitioning = false; + + // Show the palette now that the transition has finished. + this.visiblePalette.hidden = false; + this.dispatchToolboxEvent("customizationready"); }.bind(this)).then(null, function(e) { ERROR(e); @@ -214,12 +221,15 @@ CustomizeMode.prototype = { this._removePanelCustomizationPlaceholders(); - this._transitioning = true; - let window = this.window; let document = this.document; let documentElement = document.documentElement; + // Hide the palette before starting the transition for increased perf. + this.visiblePalette.hidden = true; + + this._transitioning = true; + Task.spawn(function() { yield this.depopulatePalette(); @@ -541,9 +551,9 @@ CustomizeMode.prototype = { aNode.removeAttribute("observes"); } - if (aNode.checked) { + if (aNode.getAttribute("checked") == "true") { wrapper.setAttribute("itemchecked", "true"); - aNode.checked = false; + aNode.removeAttribute("checked"); } if (aNode.hasAttribute("id")) { From 76db2bc33fb8fb01c0f057e0b8439066407dac94 Mon Sep 17 00:00:00 2001 From: Victor Porof Date: Fri, 3 Jan 2014 23:41:28 +0200 Subject: [PATCH 06/20] Bug 952734 - Sources with LabeledStatements makes ParserHelpers.getNodeLocation puke, r=past --- .../debugger/test/browser_dbg_parser-06.js | 8 ++++++++ browser/devtools/shared/Parser.jsm | 18 +++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/browser/devtools/debugger/test/browser_dbg_parser-06.js b/browser/devtools/debugger/test/browser_dbg_parser-06.js index e875d66a0b3..09d36a65523 100644 --- a/browser/devtools/debugger/test/browser_dbg_parser-06.js +++ b/browser/devtools/debugger/test/browser_dbg_parser-06.js @@ -60,5 +60,13 @@ function test() { verify("foo = bar", e => e.name == "bar", [1, 6], [1, 9]); verify("\nfoo\n=\nbar\n", e => e.name == "bar", [4, 0], [4, 3]); + // LabeledStatement and ContinueStatement, because it's 1968 again + + verify("foo: bar", e => e.name == "foo", [1, 0], [1, 3]); + verify("\nfoo\n:\nbar\n", e => e.name == "foo", [2, 0], [2, 3]); + + verify("foo: for(;;) continue foo", e => e.name == "foo", [1, 22], [1, 25]); + verify("\nfoo\n:\nfor(\n;\n;\n)\ncontinue\nfoo\n", e => e.name == "foo", [9, 0], [9, 3]); + finish(); } diff --git a/browser/devtools/shared/Parser.jsm b/browser/devtools/shared/Parser.jsm index 822e95f3879..ac1e13ef4ab 100644 --- a/browser/devtools/shared/Parser.jsm +++ b/browser/devtools/shared/Parser.jsm @@ -436,7 +436,7 @@ let ParserHelpers = { loc.end.line = loc.start.line; loc.end.column = loc.start.column + aNode.name.length; return loc; - } + } if (parentType == "MemberExpression") { // e.g. "foo.bar" // The location is unavailable for the identifier node "bar". @@ -445,6 +445,22 @@ let ParserHelpers = { loc.start.column = loc.end.column - aNode.name.length; return loc; } + if (parentType == "LabeledStatement") { + // e.g. label: ... + // The location is unavailable for the identifier node "label". + let loc = JSON.parse(JSON.stringify(parentLocation)); + loc.end.line = loc.start.line; + loc.end.column = loc.start.column + aNode.name.length; + return loc; + } + if (parentType == "ContinueStatement") { + // e.g. continue label + // The location is unavailable for the identifier node "label". + let loc = JSON.parse(JSON.stringify(parentLocation)); + loc.start.line = loc.end.line; + loc.start.column = loc.end.column - aNode.name.length; + return loc; + } } else { if (parentType == "VariableDeclarator") { // e.g. "let foo = 42" From 51c2d7c78ff51b75b1b1be14c8178669ddb10f20 Mon Sep 17 00:00:00 2001 From: Victor Porof Date: Fri, 3 Jan 2014 23:41:28 +0200 Subject: [PATCH 07/20] Bug 952767 - Variables view scopes should always be lazily populated, r=past --- .../devtools/debugger/debugger-controller.js | 10 +- browser/devtools/debugger/debugger-view.js | 3 + .../test/browser_dbg_closure-inspection.js | 128 +++++----------- .../browser_dbg_variables-view-override-01.js | 18 ++- .../browser_dbg_variables-view-override-02.js | 40 +++-- .../devtools/shared/widgets/VariablesView.jsm | 1 - .../widgets/VariablesViewController.jsm | 142 +++++++----------- 7 files changed, 133 insertions(+), 209 deletions(-) diff --git a/browser/devtools/debugger/debugger-controller.js b/browser/devtools/debugger/debugger-controller.js index ccfe2207758..06f781eee1c 100644 --- a/browser/devtools/debugger/debugger-controller.js +++ b/browser/devtools/debugger/debugger-controller.js @@ -887,11 +887,8 @@ StackFrames.prototype = { } } while ((environment = environment.parent)); - // Signal that scope environments have been shown and commit the current - // variables view hierarchy to briefly flash items that changed between the - // previous and current scope/variables/properties. + // Signal that scope environments have been shown. window.emit(EVENTS.FETCHED_SCOPES); - DebuggerView.Variables.commitHierarchy(); }, /** @@ -1005,11 +1002,8 @@ StackFrames.prototype = { expRef.separatorStr = L10N.getStr("variablesSeparatorLabel"); } - // Signal that watch expressions have been fetched and commit the - // current variables view hierarchy to briefly flash items that changed - // between the previous and current scope/variables/properties. + // Signal that watch expressions have been fetched. window.emit(EVENTS.FETCHED_WATCH_EXPRESSIONS); - DebuggerView.Variables.commitHierarchy(); }); }, diff --git a/browser/devtools/debugger/debugger-view.js b/browser/devtools/debugger/debugger-view.js index 9b4467318e2..233b6b55b11 100644 --- a/browser/devtools/debugger/debugger-view.js +++ b/browser/devtools/debugger/debugger-view.js @@ -181,6 +181,9 @@ let DebuggerView = { // Relay events from the VariablesView. this.Variables.on("fetched", (aEvent, aType) => { switch (aType) { + case "scopes": + window.emit(EVENTS.FETCHED_SCOPES); + break; case "variables": window.emit(EVENTS.FETCHED_VARIABLES); break; diff --git a/browser/devtools/debugger/test/browser_dbg_closure-inspection.js b/browser/devtools/debugger/test/browser_dbg_closure-inspection.js index f04c12837d2..4087f3d17ee 100644 --- a/browser/devtools/debugger/test/browser_dbg_closure-inspection.js +++ b/browser/devtools/debugger/test/browser_dbg_closure-inspection.js @@ -1,7 +1,5 @@ -/* - * Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ - */ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ const TAB_URL = EXAMPLE_URL + "doc_closures.html"; @@ -15,6 +13,7 @@ function test() { gDebuggee = aDebuggee; gPanel = aPanel; gDebugger = gPanel.panelWin; + gDebuggee.gRecurseLimit = 2; waitForSourceShown(gPanel, ".html") .then(testClosure) @@ -33,45 +32,25 @@ function test() { gDebuggee); }); - gDebuggee.gRecurseLimit = 2; - return waitForDebuggerEvents(gPanel, gDebugger.EVENTS.FETCHED_SCOPES).then(() => { - let deferred = promise.defer(); - - let gVars = gDebugger.DebuggerView.Variables, - localScope = gVars.getScopeAtIndex(0), - globalScope = gVars.getScopeAtIndex(1), - localNodes = localScope.target.querySelector(".variables-view-element-details").childNodes, - globalNodes = globalScope.target.querySelector(".variables-view-element-details").childNodes; + let gVars = gDebugger.DebuggerView.Variables; + let localScope = gVars.getScopeAtIndex(0); + let localNodes = localScope.target.querySelector(".variables-view-element-details").childNodes; is(localNodes[4].querySelector(".name").getAttribute("value"), "person", "Should have the right property name for |person|."); - is(localNodes[4].querySelector(".value").getAttribute("value"), "Object", "Should have the right property value for |person|."); // Expand the 'person' tree node. This causes its properties to be // retrieved and displayed. let personNode = gVars.getItemForNode(localNodes[4]); + let personFetched = waitForDebuggerEvents(gPanel, gDebugger.EVENTS.FETCHED_PROPERTIES); personNode.expand(); - is(personNode.expanded, true, "person should be expanded at this point."); - // Poll every few milliseconds until the properties are retrieved. - // It's important to set the timer in the chrome window, because the - // content window timers are disabled while the debuggee is paused. - let count1 = 0; - let intervalID = window.setInterval(function(){ - info("count1: " + count1); - if (++count1 > 50) { - ok(false, "Timed out while polling for the properties."); - window.clearInterval(intervalID); - deferred.reject("Timed out."); - return; - } - if (!personNode._retrieved) { - return; - } - window.clearInterval(intervalID); + return personFetched.then(() => { + is(personNode.expanded, true, + "|person| should be expanded at this point."); is(personNode.get("getName").target.querySelector(".name") .getAttribute("value"), "getName", @@ -90,27 +69,16 @@ function test() { // retrieved and displayed. let getFooNode = personNode.get("getFoo"); let getNameNode = personNode.get("getName"); + let funcsFetched = waitForDebuggerEvents(gPanel, gDebugger.EVENTS.FETCHED_PROPERTIES, 2); + let funcClosuresFetched = waitForDebuggerEvents(gPanel, gDebugger.EVENTS.FETCHED_SCOPES, 2); getFooNode.expand(); getNameNode.expand(); - is(getFooNode.expanded, true, "person.getFoo should be expanded at this point."); - is(getNameNode.expanded, true, "person.getName should be expanded at this point."); - // Poll every few milliseconds until the properties are retrieved. - // It's important to set the timer in the chrome window, because the - // content window timers are disabled while the debuggee is paused. - let count2 = 0; - let intervalID1 = window.setInterval(function(){ - info("count2: " + count2); - if (++count2 > 50) { - ok(false, "Timed out while polling for the properties."); - window.clearInterval(intervalID1); - deferred.reject("Timed out."); - return; - } - if (!getFooNode._retrieved || !getNameNode._retrieved) { - return; - } - window.clearInterval(intervalID1); + return funcsFetched.then(() => { + is(getFooNode.expanded, true, + "|person.getFoo| should be expanded at this point."); + is(getNameNode.expanded, true, + "|person.getName| should be expanded at this point."); is(getFooNode.get("").target.querySelector(".name") .getAttribute("value"), "", @@ -125,30 +93,18 @@ function test() { .getAttribute("value"), "", "The closure node has no value for getName."); - // Expand the Closure nodes. + // Expand the closure nodes. This causes their environments to be + // retrieved and displayed. let getFooClosure = getFooNode.get(""); let getNameClosure = getNameNode.get(""); getFooClosure.expand(); getNameClosure.expand(); - is(getFooClosure.expanded, true, "person.getFoo closure should be expanded at this point."); - is(getNameClosure.expanded, true, "person.getName closure should be expanded at this point."); - // Poll every few milliseconds until the properties are retrieved. - // It's important to set the timer in the chrome window, because the - // content window timers are disabled while the debuggee is paused. - let count3 = 0; - let intervalID2 = window.setInterval(function(){ - info("count3: " + count3); - if (++count3 > 50) { - ok(false, "Timed out while polling for the properties."); - window.clearInterval(intervalID2); - deferred.reject("Timed out."); - return; - } - if (!getFooClosure._retrieved || !getNameClosure._retrieved) { - return; - } - window.clearInterval(intervalID2); + return funcClosuresFetched.then(() => { + is(getFooClosure.expanded, true, + "|person.getFoo| closure should be expanded at this point."); + is(getNameClosure.expanded, true, + "|person.getName| closure should be expanded at this point."); is(getFooClosure.get("Function scope [_pfactory]").target.querySelector(".name") .getAttribute("value"), "Function scope [_pfactory]", @@ -166,27 +122,15 @@ function test() { // Expand the scope nodes. let getFooInnerScope = getFooClosure.get("Function scope [_pfactory]"); let getNameInnerScope = getNameClosure.get("Function scope [_pfactory]"); + let innerFuncsFetched = waitForDebuggerEvents(gPanel, gDebugger.EVENTS.FETCHED_PROPERTIES, 2); getFooInnerScope.expand(); getNameInnerScope.expand(); - is(getFooInnerScope.expanded, true, "person.getFoo inner scope should be expanded at this point."); - is(getNameInnerScope.expanded, true, "person.getName inner scope should be expanded at this point."); - // Poll every few milliseconds until the properties are retrieved. - // It's important to set the timer in the chrome window, because the - // content window timers are disabled while the debuggee is paused. - let count4 = 0; - let intervalID3 = window.setInterval(function(){ - info("count4: " + count4); - if (++count4 > 50) { - ok(false, "Timed out while polling for the properties."); - window.clearInterval(intervalID3); - deferred.reject("Timed out."); - return; - } - if (!getFooInnerScope._retrieved || !getNameInnerScope._retrieved) { - return; - } - window.clearInterval(intervalID3); + return funcsFetched.then(() => { + is(getFooInnerScope.expanded, true, + "|person.getFoo| inner scope should be expanded at this point."); + is(getNameInnerScope.expanded, true, + "|person.getName| inner scope should be expanded at this point."); // Only test that each function closes over the necessary variable. // We wouldn't want future SpiderMonkey closure space @@ -203,14 +147,10 @@ function test() { is(getNameInnerScope.get("name").target.querySelector(".value") .getAttribute("value"), '"Bob"', "The name node has the expected value."); - - deferred.resolve(); - }, 100); - }, 100); - }, 100); - }, 100); - - return deferred.promise; + }); + }); + }); + }); }); } } diff --git a/browser/devtools/debugger/test/browser_dbg_variables-view-override-01.js b/browser/devtools/debugger/test/browser_dbg_variables-view-override-01.js index 48dcf2ca85f..5f44741d8ef 100644 --- a/browser/devtools/debugger/test/browser_dbg_variables-view-override-01.js +++ b/browser/devtools/debugger/test/browser_dbg_variables-view-override-01.js @@ -49,12 +49,12 @@ function test() { is(firstScope._store.size, 3, "The first scope should have all the variables available."); - is(secondScope._store.size, 3, - "The second scope shoild have all the variables available."); - is(thirdScope._store.size, 3, - "The third scope shoild have all the variables available."); + is(secondScope._store.size, 0, + "The second scope shoild have no variables available yet."); + is(thirdScope._store.size, 0, + "The third scope shoild have no variables available yet."); is(globalScope._store.size, 0, - "The global scope shoild have no variables available."); + "The global scope shoild have no variables available yet."); // Test getOwnerScopeForVariableOrProperty with simple variables. @@ -95,6 +95,14 @@ function test() { // Test getOwnerScopeForVariableOrProperty with a simple variable // from non-topmost scopes. + // Only need to wait for a single FETCHED_VARIABLES event, just for the + // global scope, because the other local scopes already have the + // arguments and variables available as evironment bindings. + let fetched = waitForDebuggerEvents(panel, events.FETCHED_VARIABLES); + secondScope.expand(); + thirdScope.expand(); + globalScope.expand(); + let someVar2 = secondScope.get("a"); let someOwner2 = variables.getOwnerScopeForVariableOrProperty(someVar2); is(someOwner2, secondScope, diff --git a/browser/devtools/debugger/test/browser_dbg_variables-view-override-02.js b/browser/devtools/debugger/test/browser_dbg_variables-view-override-02.js index f9da58be687..dadfa3ba3e5 100644 --- a/browser/devtools/debugger/test/browser_dbg_variables-view-override-02.js +++ b/browser/devtools/debugger/test/browser_dbg_variables-view-override-02.js @@ -15,37 +15,51 @@ function test() { let variables = win.DebuggerView.Variables; // Wait for the hierarchy to be committed by the VariablesViewController. - let committed = promise.defer(); - variables.oncommit = committed.resolve; + let committedLocalScopeHierarchy = promise.defer(); + variables.oncommit = committedLocalScopeHierarchy.resolve; // Allow this generator function to yield first. executeSoon(() => debuggee.test()); yield waitForSourceAndCaretAndScopes(panel, ".html", 23); - yield committed.promise; + yield committedLocalScopeHierarchy.promise; let firstScope = variables.getScopeAtIndex(0); let secondScope = variables.getScopeAtIndex(1); let thirdScope = variables.getScopeAtIndex(2); let someVar1 = firstScope.get("a"); - let someVar2 = secondScope.get("a"); - let someVar3 = thirdScope.get("a"); - let argsVar1 = firstScope.get("arguments"); - let argsVar2 = secondScope.get("arguments"); - let argsVar3 = thirdScope.get("arguments"); is(someVar1.target.hasAttribute("overridden"), false, "The first 'a' variable should not be marked as being overridden."); - is(someVar2.target.hasAttribute("overridden"), true, - "The second 'a' variable should be marked as being overridden."); - is(someVar3.target.hasAttribute("overridden"), true, - "The third 'a' variable should be marked as being overridden."); - is(argsVar1.target.hasAttribute("overridden"), false, "The first 'arguments' variable should not be marked as being overridden."); + + // Wait for the hierarchy to be committed by the VariablesViewController. + let committedSecondScopeHierarchy = promise.defer(); + variables.oncommit = committedSecondScopeHierarchy.resolve; + secondScope.expand(); + yield committedSecondScopeHierarchy.promise; + + let someVar2 = secondScope.get("a"); + let argsVar2 = secondScope.get("arguments"); + + is(someVar2.target.hasAttribute("overridden"), true, + "The second 'a' variable should be marked as being overridden."); is(argsVar2.target.hasAttribute("overridden"), true, "The second 'arguments' variable should be marked as being overridden."); + + // Wait for the hierarchy to be committed by the VariablesViewController. + let committedThirdScopeHierarchy = promise.defer(); + variables.oncommit = committedThirdScopeHierarchy.resolve; + thirdScope.expand(); + yield committedThirdScopeHierarchy.promise; + + let someVar3 = thirdScope.get("a"); + let argsVar3 = thirdScope.get("arguments"); + + is(someVar3.target.hasAttribute("overridden"), true, + "The third 'a' variable should be marked as being overridden."); is(argsVar3.target.hasAttribute("overridden"), true, "The third 'arguments' variable should be marked as being overridden."); diff --git a/browser/devtools/shared/widgets/VariablesView.jsm b/browser/devtools/shared/widgets/VariablesView.jsm index 5c29fbc40fe..aadc0b26afd 100644 --- a/browser/devtools/shared/widgets/VariablesView.jsm +++ b/browser/devtools/shared/widgets/VariablesView.jsm @@ -2078,7 +2078,6 @@ Scope.prototype = { _enumItems: null, _nonEnumItems: null, _fetched: false, - _retrieved: false, _committed: false, _isLocked: false, _isExpanded: false, diff --git a/browser/devtools/shared/widgets/VariablesViewController.jsm b/browser/devtools/shared/widgets/VariablesViewController.jsm index 45866f96ed9..14c7d2aa8a5 100644 --- a/browser/devtools/shared/widgets/VariablesViewController.jsm +++ b/browser/devtools/shared/widgets/VariablesViewController.jsm @@ -152,8 +152,6 @@ VariablesViewController.prototype = { aTarget.setGrip(aGrip.initial + aResponse.substring); aTarget.hideArrow(); - // Mark the string as having retrieved. - aTarget._retrieved = true; deferred.resolve(); }); @@ -172,13 +170,6 @@ VariablesViewController.prototype = { _populateFromObject: function(aTarget, aGrip) { let deferred = promise.defer(); - // Mark the specified variable as having retrieved all its properties. - let finish = variable => { - variable._retrieved = true; - this.view.commitHierarchy(); - deferred.resolve(); - }; - let objectClient = this._getObjectClient(aGrip); objectClient.getPrototypeAndProperties(aResponse => { let { ownProperties, prototype } = aResponse; @@ -224,12 +215,12 @@ VariablesViewController.prototype = { // in the current scope chain. Not necessarily an actual error, // it just means that there's no closure for the function. console.warn(aResponse.error + ": " + aResponse.message); - return void finish(aTarget); + return void deferred.resolve(); } - this._addVarScope(aTarget, aResponse.scope).then(() => finish(aTarget)); + this._populateWithClosure(aTarget, aResponse.scope).then(deferred.resolve); }); } else { - finish(aTarget); + deferred.resolve(); } }); @@ -237,48 +228,43 @@ VariablesViewController.prototype = { }, /** - * Adds the scope chain elements (closures) of a function variable to the - * view. + * Adds the scope chain elements (closures) of a function variable. * * @param Variable aTarget * The variable where the properties will be placed into. * @param Scope aScope * The lexical environment form as specified in the protocol. */ - _addVarScope: function(aTarget, aScope) { + _populateWithClosure: function(aTarget, aScope) { let objectScopes = []; let environment = aScope; let funcScope = aTarget.addItem(""); - funcScope._target.setAttribute("scope", ""); - funcScope._fetched = true; + funcScope.target.setAttribute("scope", ""); funcScope.showArrow(); + do { // Create a scope to contain all the inspected variables. let label = StackFrameUtils.getScopeLabel(environment); - // Block scopes have the same label, so make addItem allow duplicates. + + // Block scopes may have the same label, so make addItem allow duplicates. let closure = funcScope.addItem(label, undefined, true); - closure._target.setAttribute("scope", ""); - closure._fetched = environment.class == "Function"; + closure.target.setAttribute("scope", ""); closure.showArrow(); + // Add nodes for every argument and every other variable in scope. if (environment.bindings) { - this._addBindings(closure, environment.bindings); - funcScope._retrieved = true; - closure._retrieved = true; + this._populateWithEnvironmentBindings(closure, environment.bindings); } else { - let deferred = Promise.defer(); + let deferred = promise.defer(); objectScopes.push(deferred.promise); this._getEnvironmentClient(environment).getBindings(response => { - this._addBindings(closure, response.bindings); - funcScope._retrieved = true; - closure._retrieved = true; + this._populateWithEnvironmentBindings(closure, response.bindings); deferred.resolve(); }); } } while ((environment = environment.parent)); - aTarget.expand(); - return Promise.all(objectScopes).then(() => { + return promise.all(objectScopes).then(() => { // Signal that scopes have been fetched. this.view.emit("fetched", "scopes", funcScope); }); @@ -287,32 +273,32 @@ VariablesViewController.prototype = { /** * Adds nodes for every specified binding to the closure node. * - * @param Variable closure - * The node where the bindings will be placed into. - * @param object bindings + * @param Variable aTarget + * The variable where the bindings will be placed into. + * @param object aBindings * The bindings form as specified in the protocol. */ - _addBindings: function(closure, bindings) { - for (let argument of bindings.arguments) { - let name = Object.getOwnPropertyNames(argument)[0]; - let argRef = closure.addItem(name, argument[name]); - let argVal = argument[name].value; - this.addExpander(argRef, argVal); - } + _populateWithEnvironmentBindings: function(aTarget, aBindings) { + // Add nodes for every argument in the scope. + aTarget.addItems(aBindings.arguments.reduce((accumulator, arg) => { + let name = Object.getOwnPropertyNames(arg)[0]; + let descriptor = arg[name]; + accumulator[name] = descriptor; + return accumulator; + }, {}), { + // Arguments aren't sorted. + sorted: false, + // Expansion handlers must be set after the properties are added. + callback: this.addExpander + }); - let aVariables = bindings.variables; - let variableNames = Object.keys(aVariables); - - // Sort all of the variables before adding them, if preferred. - if (VARIABLES_SORTING_ENABLED) { - variableNames.sort(); - } - // Add the variables to the specified scope. - for (let name of variableNames) { - let varRef = closure.addItem(name, aVariables[name]); - let varVal = aVariables[name].value; - this.addExpander(varRef, varVal); - } + // Add nodes for every other variable in the scope. + aTarget.addItems(aBindings.variables, { + // Not all variables need to force sorted properties. + sorted: VARIABLES_SORTING_ENABLED, + // Expansion handlers must be set after the properties are added. + callback: this.addExpander + }); }, /** @@ -328,12 +314,10 @@ VariablesViewController.prototype = { // Attach evaluation macros as necessary. if (aTarget.getter || aTarget.setter) { aTarget.evaluationMacro = this._overrideValueEvalMacro; - let getter = aTarget.get("get"); if (getter) { getter.evaluationMacro = this._getterOrSetterEvalMacro; } - let setter = aTarget.get("set"); if (setter) { setter.evaluationMacro = this._getterOrSetterEvalMacro; @@ -352,19 +336,13 @@ VariablesViewController.prototype = { aTarget.showArrow(); } - if (aSource.type == "block" || aSource.type == "function") { - // Block and function environments already contain scope arguments and - // corresponding variables as bindings. - this.populate(aTarget, aSource); - } else { - // Make sure that properties are always available on expansion. - aTarget.onexpand = () => this.populate(aTarget, aSource); + // Make sure that properties are always available on expansion. + aTarget.onexpand = () => this.populate(aTarget, aSource); - // Some variables are likely to contain a very large number of properties. - // It's a good idea to be prepared in case of an expansion. - if (aTarget.shouldPrefetch) { - aTarget.addEventListener("mouseover", aTarget.onexpand, false); - } + // Some variables are likely to contain a very large number of properties. + // It's a good idea to be prepared in case of an expansion. + if (aTarget.shouldPrefetch) { + aTarget.addEventListener("mouseover", aTarget.onexpand, false); } // Register all the actors that this controller now depends on. @@ -404,9 +382,11 @@ VariablesViewController.prototype = { // If the target is a Variable or Property then we're fetching properties. if (VariablesView.isVariable(aTarget)) { this._populateFromObject(aTarget, aSource).then(() => { - deferred.resolve(); // Signal that properties have been fetched. this.view.emit("fetched", "properties", aTarget); + // Commit the hierarchy because new items were added. + this.view.commitHierarchy(); + deferred.resolve(); }); return deferred.promise; } @@ -414,43 +394,29 @@ VariablesViewController.prototype = { switch (aSource.type) { case "longString": this._populateFromLongString(aTarget, aSource).then(() => { - deferred.resolve(); // Signal that a long string has been fetched. this.view.emit("fetched", "longString", aTarget); + deferred.resolve(); }); break; case "with": case "object": this._populateFromObject(aTarget, aSource.object).then(() => { - deferred.resolve(); // Signal that variables have been fetched. this.view.emit("fetched", "variables", aTarget); + // Commit the hierarchy because new items were added. + this.view.commitHierarchy(); + deferred.resolve(); }); break; case "block": case "function": - // Add nodes for every argument and every other variable in scope. - let args = aSource.bindings.arguments; - if (args) { - for (let arg of args) { - let name = Object.getOwnPropertyNames(arg)[0]; - let ref = aTarget.addItem(name, arg[name]); - let val = arg[name].value; - this.addExpander(ref, val); - } - } - - aTarget.addItems(aSource.bindings.variables, { - // Not all variables need to force sorted properties. - sorted: VARIABLES_SORTING_ENABLED, - // Expansion handlers must be set after the properties are added. - callback: this.addExpander - }); - + this._populateWithEnvironmentBindings(aTarget, aSource.bindings); // No need to signal that variables have been fetched, since // the scope arguments and variables are already attached to the // environment bindings, so pausing the active thread is unnecessary. - + // Commit the hierarchy because new items were added. + this.view.commitHierarchy(); deferred.resolve(); break; default: From 1070182c259a90a6a805e9c1bb98b65083d4a247 Mon Sep 17 00:00:00 2001 From: Victor Porof Date: Fri, 3 Jan 2014 23:42:16 +0200 Subject: [PATCH 08/20] Bug 951633 - Drop the support for WidgetMethods, r=past --- browser/devtools/debugger/CmdDebugger.jsm | 2 +- .../devtools/debugger/debugger-controller.js | 1 + browser/devtools/debugger/debugger-panes.js | 164 ++++---- browser/devtools/debugger/debugger-toolbar.js | 151 ++------ browser/devtools/debugger/debugger-view.js | 291 ++------------ browser/devtools/debugger/debugger.css | 9 - browser/devtools/debugger/debugger.xul | 5 +- .../devtools/netmonitor/netmonitor-view.js | 4 +- browser/devtools/profiler/sidebar.js | 2 +- browser/devtools/shadereditor/shadereditor.js | 8 +- .../shared/widgets/BreadcrumbsWidget.jsm | 58 ++- .../devtools/shared/widgets/FastListWidget.js | 15 +- .../shared/widgets/SideMenuWidget.jsm | 171 +++------ .../shared/widgets/SimpleListWidget.jsm | 253 ++++++++++++ .../devtools/shared/widgets/ViewHelpers.jsm | 362 ++++++++---------- browser/devtools/shared/widgets/widgets.css | 7 + browser/themes/linux/devtools/debugger.css | 56 +-- browser/themes/linux/devtools/netmonitor.css | 8 +- browser/themes/linux/devtools/widgets.css | 37 +- browser/themes/osx/devtools/debugger.css | 56 +-- browser/themes/osx/devtools/netmonitor.css | 8 +- browser/themes/osx/devtools/widgets.css | 37 +- browser/themes/windows/devtools/debugger.css | 56 +-- .../themes/windows/devtools/netmonitor.css | 8 +- browser/themes/windows/devtools/widgets.css | 37 +- 25 files changed, 792 insertions(+), 1014 deletions(-) create mode 100644 browser/devtools/shared/widgets/SimpleListWidget.jsm diff --git a/browser/devtools/debugger/CmdDebugger.jsm b/browser/devtools/debugger/CmdDebugger.jsm index 59231e23eeb..561317bcde1 100644 --- a/browser/devtools/debugger/CmdDebugger.jsm +++ b/browser/devtools/debugger/CmdDebugger.jsm @@ -41,7 +41,7 @@ function getAllBreakpoints(dbg) { for (let { attachment: breakpoint } of source) { breakpoints.push({ url: source.value, - label: source.label + ":" + breakpoint.line, + label: source.attachment.label + ":" + breakpoint.line, lineNumber: breakpoint.line, lineText: breakpoint.text, truncatedLineText: trim(breakpoint.text, MAX_LINE_TEXT_LENGTH, "end") diff --git a/browser/devtools/debugger/debugger-controller.js b/browser/devtools/debugger/debugger-controller.js index 06f781eee1c..8dbd12ecbd6 100644 --- a/browser/devtools/debugger/debugger-controller.js +++ b/browser/devtools/debugger/debugger-controller.js @@ -88,6 +88,7 @@ Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/devtools/dbg-client.jsm"); Cu.import("resource:///modules/devtools/shared/event-emitter.js"); +Cu.import("resource:///modules/devtools/SimpleListWidget.jsm"); Cu.import("resource:///modules/devtools/BreadcrumbsWidget.jsm"); Cu.import("resource:///modules/devtools/SideMenuWidget.jsm"); Cu.import("resource:///modules/devtools/VariablesView.jsm"); diff --git a/browser/devtools/debugger/debugger-panes.js b/browser/devtools/debugger/debugger-panes.js index 65898aafae8..984358b9fea 100644 --- a/browser/devtools/debugger/debugger-panes.js +++ b/browser/devtools/debugger/debugger-panes.js @@ -24,7 +24,6 @@ function SourcesView() { this._onEditorUnload = this._onEditorUnload.bind(this); this._onEditorCursorActivity = this._onEditorCursorActivity.bind(this); this._onSourceSelect = this._onSourceSelect.bind(this); - this._onSourceClick = this._onSourceClick.bind(this); this._onStopBlackBoxing = this._onStopBlackBoxing.bind(this); this._onBreakpointRemoved = this._onBreakpointRemoved.bind(this); this._onBreakpointClick = this._onBreakpointClick.bind(this); @@ -69,7 +68,6 @@ SourcesView.prototype = Heritage.extend(WidgetMethods, { window.on(EVENTS.EDITOR_LOADED, this._onEditorLoad, false); window.on(EVENTS.EDITOR_UNLOADED, this._onEditorUnload, false); this.widget.addEventListener("select", this._onSourceSelect, false); - this.widget.addEventListener("click", this._onSourceClick, false); this._stopBlackBoxButton.addEventListener("click", this._onStopBlackBoxing, false); this._cbPanel.addEventListener("popupshowing", this._onConditionalPopupShowing, false); this._cbPanel.addEventListener("popupshown", this._onConditionalPopupShown, false); @@ -79,8 +77,11 @@ SourcesView.prototype = Heritage.extend(WidgetMethods, { this.autoFocusOnSelection = false; - // Show an empty label by default. - this.empty(); + // Sort the contents by the displayed label. + this.sortContents((aFirst, aSecond) => { + return +(aFirst.attachment.label.toLowerCase() > + aSecond.attachment.label.toLowerCase()); + }); }, /** @@ -92,7 +93,6 @@ SourcesView.prototype = Heritage.extend(WidgetMethods, { window.off(EVENTS.EDITOR_LOADED, this._onEditorLoad, false); window.off(EVENTS.EDITOR_UNLOADED, this._onEditorUnload, false); this.widget.removeEventListener("select", this._onSourceSelect, false); - this.widget.removeEventListener("click", this._onSourceClick, false); this._stopBlackBoxButton.removeEventListener("click", this._onStopBlackBoxing, false); this._cbPanel.removeEventListener("popupshowing", this._onConditionalPopupShowing, false); this._cbPanel.removeEventListener("popupshowing", this._onConditionalPopupShown, false); @@ -129,10 +129,17 @@ SourcesView.prototype = Heritage.extend(WidgetMethods, { let label = SourceUtils.getSourceLabel(url.split(" -> ").pop()); let group = SourceUtils.getSourceGroup(url.split(" -> ").pop()); + let contents = document.createElement("label"); + contents.setAttribute("value", label); + contents.setAttribute("crop", "start"); + contents.setAttribute("flex", "1"); + // Append a source item to this container. - this.push([label, url, group], { + this.push([contents, url], { staged: aOptions.staged, /* stage the item to be appended later? */ attachment: { + label: label, + group: group, checkboxState: !aSource.isBlackBoxed, checkboxTooltip: this._blackBoxCheckboxTooltip, source: aSource @@ -796,14 +803,6 @@ SourcesView.prototype = Heritage.extend(WidgetMethods, { this.updateToolbarButtonsState(); }, - /** - * The click listener for the sources container. - */ - _onSourceClick: function() { - // Use this container as a filtering target. - DebuggerView.Filtering.target = this; - }, - /** * The click listener for the "stop black boxing" button. */ @@ -1115,8 +1114,6 @@ TracerView.prototype = Heritage.extend(WidgetMethods, { this._traceButton = null; this._tracerTab.remove(); this._tracerTab = null; - document.getElementById("tracer-tabpanel").remove(); - this.widget = null; return; } @@ -1214,8 +1211,8 @@ TracerView.prototype = Heritage.extend(WidgetMethods, { _populateVariable: function(aName, aParent, aValue) { let item = aParent.addItem(aName, { value: aValue }); if (aValue) { - DebuggerView.Variables.controller.populate( - item, new DebuggerController.Tracer.WrappedObject(aValue)); + let wrappedValue = new DebuggerController.Tracer.WrappedObject(aValue); + DebuggerView.Variables.controller.populate(item, wrappedValue); item.expand(); item.twisty = false; } @@ -1251,9 +1248,7 @@ TracerView.prototype = Heritage.extend(WidgetMethods, { } } } else { - const varName = "<" + - (data.type == "throw" ? "exception" : data.type) + - ">"; + const varName = "<" + (data.type == "throw" ? "exception" : data.type) + ">"; this._populateVariable(varName, scope, data.returnVal); } @@ -1265,8 +1260,11 @@ TracerView.prototype = Heritage.extend(WidgetMethods, { * Add the hover frame enter/exit highlighting to a given item. */ _highlightItem: function(aItem) { - aItem.target.querySelector(".trace-item") - .classList.add("selected-matching"); + if (!aItem || !aItem.target) { + return; + } + const trace = aItem.target.querySelector(".trace-item"); + trace.classList.add("selected-matching"); }, /** @@ -1303,8 +1301,11 @@ TracerView.prototype = Heritage.extend(WidgetMethods, { * Highlight the frame enter/exit pair of items for the given item. */ _highlightMatchingItems: function(aItem) { + const frameId = aItem.attachment.trace.frameId; + const predicate = e => e.attachment.trace.frameId == frameId; + this._unhighlightMatchingItems(); - this._matchingItems = this.items.filter(t => t.value == aItem.value); + this._matchingItems = this.items.filter(predicate); this._matchingItems .filter(this._isNotSelectedItem) .forEach(this._highlightItem); @@ -1325,8 +1326,8 @@ TracerView.prototype = Heritage.extend(WidgetMethods, { */ _onSearch: function() { const query = this._search.value.trim().toLowerCase(); - this.filterContents(item => - item.attachment.trace.name.toLowerCase().contains(query)); + const predicate = name => name.toLowerCase().contains(query); + this.filterContents(item => predicate(item.attachment.trace.name)); }, /** @@ -1356,13 +1357,11 @@ TracerView.prototype = Heritage.extend(WidgetMethods, { * The trace record coming from the tracer actor. */ addTrace: function(aTrace) { - const { type, frameId } = aTrace; - // Create the element node for the trace item. let view = this._createView(aTrace); // Append a source item to this container. - this.push([view, aTrace.frameId, ""], { + this.push([view], { staged: true, attachment: { trace: aTrace @@ -1376,8 +1375,9 @@ TracerView.prototype = Heritage.extend(WidgetMethods, { * @return nsIDOMNode * The network request view. */ - _createView: function({ type, name, frameId, parameterNames, returnVal, - location, depth, arguments: args }) { + _createView: function(aTrace) { + let { type, name, location, depth, frameId } = aTrace; + let { parameterNames, returnVal, arguments: args } = aTrace; let fragment = document.createDocumentFragment(); this._templateItem.setAttribute("tooltiptext", SourceUtils.trimUrl(location.url)); @@ -1659,7 +1659,7 @@ let SourceUtils = { if (aLabel && aLabel.indexOf("?") != 0) { // A page may contain multiple requests to the same url but with different // queries. It is *not* redundant to show each one. - if (!DebuggerView.Sources.containsLabel(aLabel)) { + if (!DebuggerView.Sources.getItemForAttachment(e => e.label == aLabel)) { return aLabel; } } @@ -1984,11 +1984,11 @@ WatchExpressionsView.prototype = Heritage.extend(WidgetMethods, { initialize: function() { dumpn("Initializing the WatchExpressionsView"); - this.widget = new ListWidget(document.getElementById("expressions")); - this.widget.permaText = L10N.getStr("addWatchExpressionText"); - this.widget.itemFactory = this._createItemView; + this.widget = new SimpleListWidget(document.getElementById("expressions")); this.widget.setAttribute("context", "debuggerWatchExpressionsContextMenu"); this.widget.addEventListener("click", this._onClick, false); + + this.headerText = L10N.getStr("addWatchExpressionText"); }, /** @@ -2010,19 +2010,22 @@ WatchExpressionsView.prototype = Heritage.extend(WidgetMethods, { // Watch expressions are UI elements which benefit from visible panes. DebuggerView.showInstrumentsPane(); + // Create the element node for the watch expression item. + let itemView = this._createItemView(aExpression); + // Append a watch expression item to this container. - let expressionItem = this.push([, aExpression], { + let expressionItem = this.push([itemView.container], { index: 0, /* specifies on which position should the item be appended */ - relaxed: true, /* this container should allow dupes & degenerates */ attachment: { + view: itemView, initialExpression: aExpression, - currentExpression: "" + currentExpression: "", } }); // Automatically focus the new watch expression input. - expressionItem.attachment.inputNode.select(); - expressionItem.attachment.inputNode.focus(); + expressionItem.attachment.view.inputNode.select(); + expressionItem.attachment.view.inputNode.focus(); DebuggerView.Variables.parentNode.scrollTop = 0; }, @@ -2048,7 +2051,7 @@ WatchExpressionsView.prototype = Heritage.extend(WidgetMethods, { // Save the watch expression code string. expressionItem.attachment.currentExpression = aExpression; - expressionItem.attachment.inputNode.value = aExpression; + expressionItem.attachment.view.inputNode.value = aExpression; // Synchronize with the controller's watch expressions store. DebuggerController.StackFrames.syncWatchExpressions(); @@ -2098,18 +2101,19 @@ WatchExpressionsView.prototype = Heritage.extend(WidgetMethods, { /** * Customization function for creating an item's UI. * - * @param nsIDOMNode aElementNode - * The element associated with the displayed item. - * @param any aAttachment - * Some attached primitive/object. + * @param string aExpression + * The watch expression string. */ - _createItemView: function(aElementNode, aAttachment) { - let arrowNode = document.createElement("box"); + _createItemView: function(aExpression) { + let container = document.createElement("hbox"); + container.className = "list-widget-item dbg-expression"; + + let arrowNode = document.createElement("hbox"); arrowNode.className = "dbg-expression-arrow"; let inputNode = document.createElement("textbox"); inputNode.className = "plain dbg-expression-input devtools-monospace"; - inputNode.setAttribute("value", aAttachment.initialExpression); + inputNode.setAttribute("value", aExpression); inputNode.setAttribute("flex", "1"); let closeNode = document.createElement("toolbarbutton"); @@ -2119,14 +2123,16 @@ WatchExpressionsView.prototype = Heritage.extend(WidgetMethods, { inputNode.addEventListener("blur", this._onBlur, false); inputNode.addEventListener("keypress", this._onKeyPress, false); - aElementNode.className = "dbg-expression"; - aElementNode.appendChild(arrowNode); - aElementNode.appendChild(inputNode); - aElementNode.appendChild(closeNode); + container.appendChild(arrowNode); + container.appendChild(inputNode); + container.appendChild(closeNode); - aAttachment.arrowNode = arrowNode; - aAttachment.inputNode = inputNode; - aAttachment.closeNode = closeNode; + return { + container: container, + arrowNode: arrowNode, + inputNode: inputNode, + closeNode: closeNode + }; }, /** @@ -2251,9 +2257,6 @@ EventListenersView.prototype = Heritage.extend(WidgetMethods, { this.widget.addEventListener("check", this._onCheck, false); this.widget.addEventListener("click", this._onClick, false); - - // Show an empty label by default. - this.empty(); }, /** @@ -2368,13 +2371,14 @@ EventListenersView.prototype = Heritage.extend(WidgetMethods, { DebuggerController.Breakpoints.DOM.activeEventNames.indexOf(type) != -1; // Append an event listener item to this container. - this.push([itemView.container, url, group], { + this.push([itemView.container], { staged: aOptions.staged, /* stage the item to be appended later? */ attachment: { url: url, type: type, view: itemView, selectors: [selector], + group: group, checkboxState: checkboxState, checkboxTooltip: this._eventCheckboxTooltip } @@ -2494,7 +2498,6 @@ EventListenersView.prototype = Heritage.extend(WidgetMethods, { function GlobalSearchView() { dumpn("GlobalSearchView was instantiated"); - this._createItemView = this._createItemView.bind(this); this._onHeaderClick = this._onHeaderClick.bind(this); this._onLineClick = this._onLineClick.bind(this); this._onMatchClick = this._onMatchClick.bind(this); @@ -2507,11 +2510,10 @@ GlobalSearchView.prototype = Heritage.extend(WidgetMethods, { initialize: function() { dumpn("Initializing the GlobalSearchView"); - this.widget = new ListWidget(document.getElementById("globalsearch")); + this.widget = new SimpleListWidget(document.getElementById("globalsearch")); this._splitter = document.querySelector("#globalsearch + .devtools-horizontal-splitter"); - this.widget.emptyText = L10N.getStr("noMatchingStringsText"); - this.widget.itemFactory = this._createItemView; + this.emptyText = L10N.getStr("noMatchingStringsText"); }, /** @@ -2718,30 +2720,21 @@ GlobalSearchView.prototype = Heritage.extend(WidgetMethods, { * An object containing all the matched lines for a specific source. */ _createSourceResultsUI: function(aSourceResults) { - // Append a source results item to this container. - this.push([], { - index: -1, /* specifies on which position should the item be appended */ - relaxed: true, /* this container should allow dupes & degenerates */ - attachment: { - sourceResults: aSourceResults - } - }); - }, - - /** - * Customization function for creating an item's UI. - * - * @param nsIDOMNode aElementNode - * The element associated with the displayed item. - * @param any aAttachment - * Some attached primitive/object. - */ - _createItemView: function(aElementNode, aAttachment) { - aAttachment.sourceResults.createView(aElementNode, { + // Create the element node for the source results item. + let container = document.createElement("hbox"); + aSourceResults.createView(container, { onHeaderClick: this._onHeaderClick, onLineClick: this._onLineClick, onMatchClick: this._onMatchClick }); + + // Append a source results item to this container. + let item = this.push([container], { + index: -1, /* specifies on which position should the item be appended */ + attachment: { + sourceResults: aSourceResults + } + }); }, /** @@ -2792,10 +2785,7 @@ GlobalSearchView.prototype = Heritage.extend(WidgetMethods, { * The match to scroll into view. */ _scrollMatchIntoViewIfNeeded: function(aMatch) { - // TODO: Accessing private widget properties. Figure out what's the best - // way to expose such things. Bug 876271. - let boxObject = this.widget._parent.boxObject.QueryInterface(Ci.nsIScrollBoxObject); - boxObject.ensureElementIsVisible(aMatch); + this.widget.ensureElementIsVisible(aMatch); }, /** diff --git a/browser/devtools/debugger/debugger-toolbar.js b/browser/devtools/debugger/debugger-toolbar.js index 719f3f3642a..874da2c0494 100644 --- a/browser/devtools/debugger/debugger-toolbar.js +++ b/browser/devtools/debugger/debugger-toolbar.js @@ -36,7 +36,6 @@ ToolbarView.prototype = { this._stepOverButton = document.getElementById("step-over"); this._stepInButton = document.getElementById("step-in"); this._stepOutButton = document.getElementById("step-out"); - this._chromeGlobals = document.getElementById("chrome-globals"); let resumeKey = ShortcutUtils.prettifyShortcut(document.getElementById("resumeKey")); let stepOverKey = ShortcutUtils.prettifyShortcut(document.getElementById("stepOverKey")); @@ -57,9 +56,6 @@ ToolbarView.prototype = { this._stepOverButton.setAttribute("tooltiptext", this._stepOverTooltip); this._stepInButton.setAttribute("tooltiptext", this._stepInTooltip); this._stepOutButton.setAttribute("tooltiptext", this._stepOutTooltip); - - // TODO: bug 806775 - group scripts by globals using hostAnnotations. - // this.toggleChromeGlobalsContainer(window._isChromeDebugger); }, /** @@ -109,16 +105,6 @@ ToolbarView.prototype = { } }, - /** - * Sets the chrome globals container hidden or visible. It's hidden by default. - * - * @param boolean aVisibleFlag - * Specifies the intended visibility. - */ - toggleChromeGlobalsContainer: function(aVisibleFlag) { - this._chromeGlobals.setAttribute("hidden", !aVisibleFlag); - }, - /** * Listener handling the toggle button click event. */ @@ -182,7 +168,6 @@ ToolbarView.prototype = { _stepOverButton: null, _stepInButton: null, _stepOutButton: null, - _chromeGlobals: null, _resumeTooltip: "", _pauseTooltip: "", _stepOverTooltip: "", @@ -341,59 +326,6 @@ OptionsView.prototype = { _showOriginalSourceItem: null }; -/** - * Functions handling the chrome globals UI. - */ -function ChromeGlobalsView() { - dumpn("ChromeGlobalsView was instantiated"); - - this._onSelect = this._onSelect.bind(this); - this._onClick = this._onClick.bind(this); -} - -ChromeGlobalsView.prototype = Heritage.extend(WidgetMethods, { - /** - * Initialization function, called when the debugger is started. - */ - initialize: function() { - dumpn("Initializing the ChromeGlobalsView"); - - this.widget = document.getElementById("chrome-globals"); - this.emptyText = L10N.getStr("noGlobalsText"); - - this.widget.addEventListener("select", this._onSelect, false); - this.widget.addEventListener("click", this._onClick, false); - - // Show an empty label by default. - this.empty(); - }, - - /** - * Destruction function, called when the debugger is closed. - */ - destroy: function() { - dumpn("Destroying the ChromeGlobalsView"); - - this.widget.removeEventListener("select", this._onSelect, false); - this.widget.removeEventListener("click", this._onClick, false); - }, - - /** - * The select listener for the chrome globals container. - */ - _onSelect: function() { - // TODO: bug 806775, do something useful for chrome debugging. - }, - - /** - * The click listener for the chrome globals container. - */ - _onClick: function() { - // Use this container as a filtering target. - DebuggerView.Filtering.target = this; - } -}); - /** * Functions handling the stackframes UI. */ @@ -466,9 +398,12 @@ StackFramesView.prototype = Heritage.extend(WidgetMethods, { let frameView = this._createFrameView.apply(this, arguments); // Append a stack frame item to this container. - this.push([frameView, aTitle, aUrl], { + this.push([frameView], { index: 0, /* specifies on which position should the item be appended */ attachment: { + title: aTitle, + url: aUrl, + line: aLine, depth: aDepth }, // Make sure that when the stack frame item is removed, the corresponding @@ -599,16 +534,13 @@ StackFramesView.prototype = Heritage.extend(WidgetMethods, { * Requests the addition of more frames from the controller. */ _afterScroll: function() { - // TODO: Accessing private widget properties. Figure out what's the best - // way to expose such things. Bug 876271. - let list = this.widget._list; - let scrollPosition = list.scrollPosition; - let scrollWidth = list.scrollWidth; + let scrollPosition = this.widget.getAttribute("scrollPosition"); + let scrollWidth = this.widget.getAttribute("scrollWidth"); // If the stackframes container scrolled almost to the end, with only // 1/10 of a breadcrumb remaining, load more content. if (scrollPosition - scrollWidth / 10 < 1) { - list.ensureElementIsVisible(this.getItemAtIndex(CALL_STACK_PAGE_SIZE - 1).target); + this.ensureIndexIsVisible(CALL_STACK_PAGE_SIZE - 1); this.dirty = false; // Loads more stack frames from the debugger server cache. @@ -648,9 +580,6 @@ StackFramesClassicListView.prototype = Heritage.extend(WidgetMethods, { // This view's contents are also mirrored in a different container. this._mirror = DebuggerView.StackFrames; - - // Show an empty label by default. - this.empty(); }, /** @@ -679,7 +608,7 @@ StackFramesClassicListView.prototype = Heritage.extend(WidgetMethods, { let frameView = this._createFrameView.apply(this, arguments); // Append a stack frame item to this container. - this.push([frameView, aUrl], { + this.push([frameView], { attachment: { depth: aDepth } @@ -798,6 +727,9 @@ FilterView.prototype = { this._searchbox.addEventListener("keypress", this._onKeyPress, false); this._searchbox.addEventListener("blur", this._onBlur, false); + let placeholder = L10N.getFormatStr("emptySearchText", this._fileSearchKey); + this._searchbox.setAttribute("placeholder", placeholder); + this._globalOperatorButton.setAttribute("label", SEARCH_GLOBAL_FLAG); this._functionOperatorButton.setAttribute("label", SEARCH_FUNCTION_FLAG); this._tokenOperatorButton.setAttribute("label", SEARCH_TOKEN_FLAG); @@ -816,13 +748,6 @@ FilterView.prototype = { L10N.getFormatStr("searchPanelGoToLine", this._lineSearchKey)); this._variableOperatorLabel.setAttribute("value", L10N.getFormatStr("searchPanelVariable", this._variableSearchKey)); - - // TODO: bug 806775 - group scripts by globals using hostAnnotations. - // if (window._isChromeDebugger) { - // this.target = DebuggerView.ChromeGlobals; - // } else { - this.target = DebuggerView.Sources; - // } }, /** @@ -838,30 +763,6 @@ FilterView.prototype = { this._searchbox.removeEventListener("blur", this._onBlur, false); }, - /** - * Sets the target container to be currently filtered. - * @param object aView - */ - set target(aView) { - let placeholder = ""; - switch (aView) { - case DebuggerView.ChromeGlobals: - placeholder = L10N.getFormatStr("emptyChromeGlobalsFilterText", this._fileSearchKey); - break; - case DebuggerView.Sources: - placeholder = L10N.getFormatStr("emptySearchText", this._fileSearchKey); - break; - } - this._searchbox.setAttribute("placeholder", placeholder); - this._target = aView; - }, - - /** - * Gets the target container to be currently filtered. - * @return object - */ - get target() this._target, - /** * Gets the entered operator and arguments in the searchbox. * @return array @@ -1241,7 +1142,6 @@ FilterView.prototype = { _tokenSearchKey: "", _lineSearchKey: "", _variableSearchKey: "", - _target: null }; /** @@ -1309,7 +1209,7 @@ FilteredSourcesView.prototype = Heritage.extend(ResultsPanelContainer.prototype, } for (let item of DebuggerView.Sources.items) { - let lowerCaseLabel = item.label.toLowerCase(); + let lowerCaseLabel = item.attachment.label.toLowerCase(); let lowerCaseToken = aToken.toLowerCase(); if (lowerCaseLabel.match(lowerCaseToken)) { aStore.push(item); @@ -1343,13 +1243,15 @@ FilteredSourcesView.prototype = Heritage.extend(ResultsPanelContainer.prototype, } for (let item of aSearchResults) { - // Append a location item to this container for each match. - let trimmedLabel = SourceUtils.trimUrlLength(item.label); - let trimmedValue = SourceUtils.trimUrlLength(item.value, 0, "start"); + // Create the element node for the location item. + let itemView = this._createItemView( + SourceUtils.trimUrlLength(item.attachment.label), + SourceUtils.trimUrlLength(item.value, 0, "start") + ); - this.push([trimmedLabel, trimmedValue], { + // Append a location item to this container for each match. + this.push([itemView], { index: -1, /* specifies on which position should the item be appended */ - relaxed: true, /* this container should allow dupes & degenerates */ attachment: { url: item.value } @@ -1543,14 +1445,16 @@ FilteredFunctionsView.prototype = Heritage.extend(ResultsPanelContainer.prototyp item.actualLocation = item.functionLocation; } - // Append a function item to this container for each match. - let trimmedLabel = SourceUtils.trimUrlLength(item.displayedName + "()"); - let trimmedValue = SourceUtils.trimUrlLength(item.sourceUrl, 0, "start"); - let description = (item.inferredChain || []).join("."); + // Create the element node for the function item. + let itemView = this._createItemView( + SourceUtils.trimUrlLength(item.displayedName + "()"), + SourceUtils.trimUrlLength(item.sourceUrl, 0, "start"), + (item.inferredChain || []).join(".") + ); - this.push([trimmedLabel, trimmedValue, description], { + // Append a function item to this container for each match. + this.push([itemView], { index: -1, /* specifies on which position should the item be appended */ - relaxed: true, /* this container should allow dupes & degenerates */ attachment: item }); } @@ -1605,6 +1509,5 @@ DebuggerView.Options = new OptionsView(); DebuggerView.Filtering = new FilterView(); DebuggerView.FilteredSources = new FilteredSourcesView(); DebuggerView.FilteredFunctions = new FilteredFunctionsView(); -DebuggerView.ChromeGlobals = new ChromeGlobalsView(); DebuggerView.StackFrames = new StackFramesView(); DebuggerView.StackFramesClassicList = new StackFramesClassicListView(); diff --git a/browser/devtools/debugger/debugger-view.js b/browser/devtools/debugger/debugger-view.js index 233b6b55b11..47497b16ab5 100644 --- a/browser/devtools/debugger/debugger-view.js +++ b/browser/devtools/debugger/debugger-view.js @@ -55,7 +55,6 @@ let DebuggerView = { this.Filtering.initialize(); this.FilteredSources.initialize(); this.FilteredFunctions.initialize(); - this.ChromeGlobals.initialize(); this.StackFrames.initialize(); this.StackFramesClassicList.initialize(); this.Sources.initialize(); @@ -91,7 +90,6 @@ let DebuggerView = { this.Filtering.destroy(); this.FilteredSources.destroy(); this.FilteredFunctions.destroy(); - this.ChromeGlobals.destroy(); this.StackFrames.destroy(); this.StackFramesClassicList.destroy(); this.Sources.destroy(); @@ -621,7 +619,6 @@ let DebuggerView = { this.FilteredSources.clearView(); this.FilteredFunctions.clearView(); this.GlobalSearch.clearView(); - this.ChromeGlobals.empty(); this.StackFrames.empty(); this.Sources.empty(); this.Variables.empty(); @@ -643,7 +640,6 @@ let DebuggerView = { FilteredSources: null, FilteredFunctions: null, GlobalSearch: null, - ChromeGlobals: null, StackFrames: null, Sources: null, Tracer: null, @@ -663,225 +659,6 @@ let DebuggerView = { _expandPaneString: "" }; -/** - * A stacked list of items, compatible with WidgetMethods instances, used for - * displaying views like the watch expressions, filtering or search results etc. - * - * You should never need to access these methods directly, use the wrapped - * WidgetMethods instead. - * - * @param nsIDOMNode aNode - * The element associated with the widget. - */ -function ListWidget(aNode) { - this._parent = aNode; - - // Create an internal list container. - this._list = document.createElement("vbox"); - this._parent.appendChild(this._list); - - // Delegate some of the associated node's methods to satisfy the interface - // required by WidgetMethods instances. - ViewHelpers.delegateWidgetAttributeMethods(this, aNode); - ViewHelpers.delegateWidgetEventMethods(this, aNode); -} - -ListWidget.prototype = { - /** - * Overrides an item's element type (e.g. "vbox" or "hbox") in this container. - * @param string aType - */ - itemType: "hbox", - - /** - * Customization function for creating an item's UI in this container. - * - * @param nsIDOMNode aElementNode - * The element associated with the displayed item. - * @param string aLabel - * The item's label. - * @param string aValue - * The item's value. - */ - itemFactory: null, - - /** - * Immediately inserts an item in this container at the specified index. - * - * @param number aIndex - * The position in the container intended for this item. - * @param string aLabel - * The label displayed in the container. - * @param string aValue - * The actual internal value of the item. - * @param string aDescription [optional] - * An optional description of the item. - * @param any aAttachment [optional] - * Some attached primitive/object. - * @return nsIDOMNode - * The element associated with the displayed item. - */ - insertItemAt: function(aIndex, aLabel, aValue, aDescription, aAttachment) { - let list = this._list; - let childNodes = list.childNodes; - - let element = document.createElement(this.itemType); - this.itemFactory(element, aAttachment, aLabel, aValue, aDescription); - this._removeEmptyNotice(); - - element.classList.add("list-widget-item"); - return list.insertBefore(element, childNodes[aIndex]); - }, - - /** - * Returns the child node in this container situated at the specified index. - * - * @param number aIndex - * The position in the container intended for this item. - * @return nsIDOMNode - * The element associated with the displayed item. - */ - getItemAtIndex: function(aIndex) { - return this._list.childNodes[aIndex]; - }, - - /** - * Immediately removes the specified child node from this container. - * - * @param nsIDOMNode aChild - * The element associated with the displayed item. - */ - removeChild: function(aChild) { - this._list.removeChild(aChild); - - if (this._selectedItem == aChild) { - this._selectedItem = null; - } - if (!this._list.hasChildNodes()) { - this._appendEmptyNotice(); - } - }, - - /** - * Immediately removes all of the child nodes from this container. - */ - removeAllItems: function() { - let parent = this._parent; - let list = this._list; - - while (list.hasChildNodes()) { - list.firstChild.remove(); - } - parent.scrollTop = 0; - parent.scrollLeft = 0; - - this._selectedItem = null; - this._appendEmptyNotice(); - }, - - /** - * Gets the currently selected child node in this container. - * @return nsIDOMNode - */ - get selectedItem() this._selectedItem, - - /** - * Sets the currently selected child node in this container. - * @param nsIDOMNode aChild - */ - set selectedItem(aChild) { - let childNodes = this._list.childNodes; - - if (!aChild) { - this._selectedItem = null; - } - for (let node of childNodes) { - if (node == aChild) { - node.classList.add("selected"); - this._selectedItem = node; - } else { - node.classList.remove("selected"); - } - } - }, - - /** - * Sets the text displayed permanently in this container's header. - * @param string aValue - */ - set permaText(aValue) { - if (this._permaTextNode) { - this._permaTextNode.setAttribute("value", aValue); - } - this._permaTextValue = aValue; - this._appendPermaNotice(); - }, - - /** - * Sets the text displayed in this container when there are no available items. - * @param string aValue - */ - set emptyText(aValue) { - if (this._emptyTextNode) { - this._emptyTextNode.setAttribute("value", aValue); - } - this._emptyTextValue = aValue; - this._appendEmptyNotice(); - }, - - /** - * Creates and appends a label displayed permanently in this container's header. - */ - _appendPermaNotice: function() { - if (this._permaTextNode || !this._permaTextValue) { - return; - } - - let label = document.createElement("label"); - label.className = "empty list-widget-item"; - label.setAttribute("value", this._permaTextValue); - - this._parent.insertBefore(label, this._list); - this._permaTextNode = label; - }, - - /** - * Creates and appends a label signaling that this container is empty. - */ - _appendEmptyNotice: function() { - if (this._emptyTextNode || !this._emptyTextValue) { - return; - } - - let label = document.createElement("label"); - label.className = "empty list-widget-item"; - label.setAttribute("value", this._emptyTextValue); - - this._parent.appendChild(label); - this._emptyTextNode = label; - }, - - /** - * Removes the label signaling that this container is empty. - */ - _removeEmptyNotice: function() { - if (!this._emptyTextNode) { - return; - } - - this._parent.removeChild(this._emptyTextNode); - this._emptyTextNode = null; - }, - - _parent: null, - _list: null, - _selectedItem: null, - _permaTextNode: null, - _permaTextValue: "", - _emptyTextNode: null, - _emptyTextValue: "" -}; - /** * A custom items container, used for displaying views like the * FilteredSources, FilteredFunctions etc., inheriting the generic WidgetMethods. @@ -909,9 +686,8 @@ ResultsPanelContainer.prototype = Heritage.extend(WidgetMethods, { document.documentElement.appendChild(this._panel); } if (!this.widget) { - this.widget = new ListWidget(this._panel); - this.widget.itemType = "vbox"; - this.widget.itemFactory = this._createItemView; + this.widget = new SimpleListWidget(this._panel); + this.maintainSelectionVisible = false; } } // Cleanup the anchor and remove the previously created panel. @@ -926,7 +702,9 @@ ResultsPanelContainer.prototype = Heritage.extend(WidgetMethods, { * Gets the anchor node for this container panel. * @return nsIDOMNode */ - get anchor() this._anchor, + get anchor() { + return this._anchor; + }, /** * Sets the container panel hidden or visible. It's hidden by default. @@ -985,40 +763,43 @@ ResultsPanelContainer.prototype = Heritage.extend(WidgetMethods, { /** * Customization function for creating an item's UI. * - * @param nsIDOMNode aElementNode - * The element associated with the displayed item. - * @param any aAttachment - * Some attached primitive/object. * @param string aLabel - * The item's label. - * @param string aValue - * The item's value. - * @param string aDescription - * An optional description of the item. + * The item's label string. + * @param string aBeforeLabel + * An optional string shown before the label. + * @param string aBelowLabel + * An optional string shown underneath the label. */ - _createItemView: function(aElementNode, aAttachment, aLabel, aValue, aDescription) { - let labelsGroup = document.createElement("hbox"); + _createItemView: function(aLabel, aBelowLabel, aBeforeLabel) { + let container = document.createElement("vbox"); + container.className = "results-panel-item"; - if (aDescription) { - let preLabelNode = document.createElement("label"); - preLabelNode.className = "plain results-panel-item-pre"; - preLabelNode.setAttribute("value", aDescription); - labelsGroup.appendChild(preLabelNode); - } - if (aLabel) { - let labelNode = document.createElement("label"); - labelNode.className = "plain results-panel-item-name"; - labelNode.setAttribute("value", aLabel); - labelsGroup.appendChild(labelNode); + let firstRowLabels = document.createElement("hbox"); + let secondRowLabels = document.createElement("hbox"); + + if (aBeforeLabel) { + let beforeLabelNode = document.createElement("label"); + beforeLabelNode.className = "plain results-panel-item-label-before"; + beforeLabelNode.setAttribute("value", aBeforeLabel); + firstRowLabels.appendChild(beforeLabelNode); } - let valueNode = document.createElement("label"); - valueNode.className = "plain results-panel-item-details"; - valueNode.setAttribute("value", aValue); + let labelNode = document.createElement("label"); + labelNode.className = "plain results-panel-item-label"; + labelNode.setAttribute("value", aLabel); + firstRowLabels.appendChild(labelNode); - aElementNode.className = "light results-panel-item"; - aElementNode.appendChild(labelsGroup); - aElementNode.appendChild(valueNode); + if (aBelowLabel) { + let belowLabelNode = document.createElement("label"); + belowLabelNode.className = "plain results-panel-item-label-below"; + belowLabelNode.setAttribute("value", aBelowLabel); + secondRowLabels.appendChild(belowLabelNode); + } + + container.appendChild(firstRowLabels); + container.appendChild(secondRowLabels); + + return container; }, _anchor: null, diff --git a/browser/devtools/debugger/debugger.css b/browser/devtools/debugger/debugger.css index 03207b72bfd..13eab609655 100644 --- a/browser/devtools/debugger/debugger.css +++ b/browser/devtools/debugger/debugger.css @@ -11,15 +11,6 @@ -moz-box-orient: vertical; } -#expressions { - overflow-x: hidden; - overflow-y: auto; -} - -#globalsearch { - overflow: auto; -} - /* Toolbar controls */ .devtools-toolbarbutton:not([label]) > .toolbarbutton-text { diff --git a/browser/devtools/debugger/debugger.xul b/browser/devtools/debugger/debugger.xul index 50343caa359..f6fec1854fc 100644 --- a/browser/devtools/debugger/debugger.xul +++ b/browser/devtools/debugger/debugger.xul @@ -324,9 +324,6 @@ tabindex="0" hidden="true"/> -