import changes from `dev' branch of rmottola/Arctic-Fox:

- Bug 1055181 - CSS Filter Tooltip; r=pbrosset (327b035a7)
- Bug 1137238 - Fix toolboxes when switching between apps in WebIDE. r=jryans (1a333bdfa)
- Bug 1138939 - Notify when WebIDE has finished initializing so that Valence can register runtime scanners. r=ochameau (7fe61c384)
- Don't let WebIDE break when trying to debug Chrome settings (bug 1134619). r=ochameau (4a18f048e)
- fix imports since devtools are in a different path compared to FF (15c2a1e70)
- port bits of Bug 916804 - Telemetry for WebIDE. (cf5b49ca7)
- Bug 1042859 - Ignore host port when fetching cookies with the gcli cookie command. r=pbrosset (1e6217f76)
- fix include path (6efaacd7a)
- Bug 1128988 - runAt support for commands/converters; r=bgrins (bed6cb594)
- Bug 1143027 - The performance tool tab highlights during a recording. r=vp (e1f310e2d)
- missing pieces of Bug 1141817 - Followup to fix additional intermittents and Bug 1142748 - Fix the 'Protocol error (unknownError) (b27da36af)
- Bug 1159480 - Pull out actor-specific logic from Performance Front. r=vp (9c253604b)
- Bug 1156499 - Disable all non-profiler/fps components in the performance tools when in aurora, for 40.0 release. r=vp (041a0fa34)
- Bug 1159052 - Performance recording should stop rendering and recording as soon as the recording stops. r=vp (2a9f093b4)
- Bug 114187 - Add getBufferInfo to devtools profiler actor. r=fitzgen (00496e8e4)
- Bug 1145187 - Implement polling for buffer status on performance actor facades. r=vp (ae2cbac27)
- Bug 1082695 - Simplify the record start/stop time buttons, and more cleanly render the console.profile notifications during a console recording. r=vp (dfe9a9b26)
- Bug 1160900 - Display buffer status while recording a profile. r=vp (c3d302a62)
- Bug 1154115 - Add adapter that deduplicates old, undeduplicated profiles in the frontend. (r=jsantell,vporof) (aa1bd6769)
- Bug 1160696 - Display MIRTypes in the JIT optimizations side pane as "Site : MIRType". (r=jsantell) (beccaed3d)
- Bug 1154115 - Make the memory stuff in the performance devtool synthesize the new profiler JSON format. (r=jsantell) (685e3a576)
- Bug 1154115 - Fix nsIProfiler xpcshell tests to use the new profiler JSON format. (r=me) (da2a18c89)
- Bug 1151526 - Do not display optimization data for meta-platform frames in the profiler. r=vporof (d4cc514ca)
- Bug 1154115 - Fix devtools tests to use the new profiler JSON format. (r=jsantell) (61a9064ce)
- Bug 1126432: Set preference toggle to switch to new WebIDE project listing layout r=jryans (825831eeb)
- Bug 1130084 - Avoid spurious connection errors even on success. r=past (1911930b6)
- missing bits of Bug 1069552 - Add WebIDE scanner / runtime API. (773111b87)
- Bug 1130084 - Allow runtimes to take infinite time to connect. r=past (a1482c500)
- Bug 1025311 - Add telemetry for canvas debugger. r=vp,miker (d2f8d51f2)
- Bug 1134778 - Consolidate usages of view sourcing in tools with a source-utils module. r=vp,jryans (1432dfac1)
- Bug 1167230 - Use nsCString instead of std::string in FrameKey in the profiler. (r=mstange) (9a3d84b86)
- Bug 1166492 - Handle huge strings in the profile JSON writer. (r=mstange) (3d6f90062)
- Bug 1166492 - Remove dead code in the ProfileBuffer and ThreadProfile. (r=mstange) (cc8e81dd3)
- Bug 1166492 - Return UniquePtr<char[]> from profiler_get_profile to avoid double copying. (r=mstange) (f9d58d5cf)
- Bug 1167230 - Don't pack ProfileEntry on ARM. r=shu (b6f920dd3)
- Bug 1168784 - Part 1: Fix the script merging profiles to handle new profiler JSON format. r=benwa (dd1008084)
- Bug 1090949 - Add `nextTick()` to `lazyIframeIsLoaded()` in WebIDE tests. r=ochameau (94bf972da)
- Bug 1143028 - Make AppMan reinitable; update tab list when sidebars disabled. r=past (1020f8306)
- Bug 1146542 - Clean up and describe app-manager events. r=ochameau (cc4bcadf5)
- Bug 1146542 - Restore tab list changes for non-sidebar case. r=ochameau (531b70e41)
- Bug 1149820 - Restore WebIDE project auto select. r=ochameau (d0526612a)
- Bug 1135018 - Move getjson from webide/ to shared/. r=jryans (9e405c1bf)
- Bug 1135018 - Make devices.js use a CDN. r=ochameau (16adb49c4)
- Bug 1090949 - Make WebIDE's Firefox OS Simulators configurable. r=ochameau (354331a6e)
- Bug 1157201 - Prevent exception while hovering the rule-view. r=pbrosset (4ec81d85b)
This commit is contained in:
2020-09-04 21:16:47 +08:00
parent 38bd296c8c
commit 7624030fbf
359 changed files with 11983 additions and 6939 deletions
+14
View File
@@ -1094,6 +1094,20 @@ pref("devtools.performance.profiler.buffer-size", 10000000);
pref("devtools.performance.profiler.sample-frequency-khz", 1);
pref("devtools.performance.ui.show-jit-optimizations", false);
// If in aurora (40.0, will revert for 40.1), set default
// to retro mode.
// TODO bug 1160313
#if MOZ_UPDATE_CHANNEL == aurora
pref("devtools.performance.ui.retro-mode", true);
#else
pref("devtools.performance.ui.retro-mode", false);
#endif
// Set imgur upload client ID
pref("devtools.gcli.imgurClientID", '0df414e888d7240');
// Imgur's upload URL
pref("devtools.gcli.imgurUploadURL", "https://api.imgur.com/3/image");
// Whether the character encoding menu is under the main Firefox button. This
// preference is a string so that localizers can alter it.
pref("browser.menu.showCharacterEncoding", "chrome://browser/locale/browser.properties");
+410
View File
@@ -0,0 +1,410 @@
/* 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";
const {Cc, Ci, Cu} = require("chrome");
const { Services } = require("resource://gre/modules/Services.jsm");
loader.lazyGetter(this, "osString", () => Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).OS);
// Panels
loader.lazyGetter(this, "OptionsPanel", () => require("devtools/framework/toolbox-options").OptionsPanel);
loader.lazyGetter(this, "InspectorPanel", () => require("devtools/inspector/inspector-panel").InspectorPanel);
loader.lazyGetter(this, "WebConsolePanel", () => require("devtools/webconsole/panel").WebConsolePanel);
loader.lazyGetter(this, "DebuggerPanel", () => require("devtools/debugger/panel").DebuggerPanel);
loader.lazyGetter(this, "StyleEditorPanel", () => require("devtools/styleeditor/styleeditor-panel").StyleEditorPanel);
loader.lazyGetter(this, "ShaderEditorPanel", () => require("devtools/shadereditor/panel").ShaderEditorPanel);
loader.lazyGetter(this, "CanvasDebuggerPanel", () => require("devtools/canvasdebugger/panel").CanvasDebuggerPanel);
loader.lazyGetter(this, "WebAudioEditorPanel", () => require("devtools/webaudioeditor/panel").WebAudioEditorPanel);
loader.lazyGetter(this, "PerformancePanel", () => require("devtools/performance/panel").PerformancePanel);
loader.lazyGetter(this, "NetMonitorPanel", () => require("devtools/netmonitor/panel").NetMonitorPanel);
loader.lazyGetter(this, "StoragePanel", () => require("devtools/storage/panel").StoragePanel);
loader.lazyGetter(this, "ScratchpadPanel", () => require("devtools/scratchpad/scratchpad-panel").ScratchpadPanel);
// Strings
const toolboxProps = "chrome://global/locale/devtools/toolbox.properties";
const inspectorProps = "chrome://global/locale/devtools/inspector.properties";
const webConsoleProps = "chrome://global/locale/devtools/webconsole.properties";
const debuggerProps = "chrome://global/locale/devtools/debugger.properties";
const styleEditorProps = "chrome://global/locale/devtools/styleeditor.properties";
const shaderEditorProps = "chrome://global/locale/devtools/shadereditor.properties";
const canvasDebuggerProps = "chrome://global/locale/devtools/canvasdebugger.properties";
const webAudioEditorProps = "chrome://global/locale/devtools/webaudioeditor.properties";
const profilerProps = "chrome://global/locale/devtools/profiler.properties";
const netMonitorProps = "chrome://global/locale/devtools/netmonitor.properties";
const storageProps = "chrome://global/locale/devtools/storage.properties";
const scratchpadProps = "chrome://global/locale/devtools/scratchpad.properties";
loader.lazyGetter(this, "toolboxStrings", () => Services.strings.createBundle(toolboxProps));
loader.lazyGetter(this, "profilerStrings",() => Services.strings.createBundle(profilerProps));
loader.lazyGetter(this, "webConsoleStrings", () => Services.strings.createBundle(webConsoleProps));
loader.lazyGetter(this, "debuggerStrings", () => Services.strings.createBundle(debuggerProps));
loader.lazyGetter(this, "styleEditorStrings", () => Services.strings.createBundle(styleEditorProps));
loader.lazyGetter(this, "shaderEditorStrings", () => Services.strings.createBundle(shaderEditorProps));
loader.lazyGetter(this, "canvasDebuggerStrings", () => Services.strings.createBundle(canvasDebuggerProps));
loader.lazyGetter(this, "webAudioEditorStrings", () => Services.strings.createBundle(webAudioEditorProps));
loader.lazyGetter(this, "inspectorStrings", () => Services.strings.createBundle(inspectorProps));
loader.lazyGetter(this, "netMonitorStrings", () => Services.strings.createBundle(netMonitorProps));
loader.lazyGetter(this, "storageStrings", () => Services.strings.createBundle(storageProps));
loader.lazyGetter(this, "scratchpadStrings", () => Services.strings.createBundle(scratchpadProps));
let Tools = {};
exports.Tools = Tools;
// Definitions
Tools.options = {
id: "options",
ordinal: 0,
url: "chrome://global/content/devtools/framework/toolbox-options.xul",
icon: "chrome://global/skin/devtools/tool-options.svg",
invertIconForLightTheme: true,
bgTheme: "theme-body",
label: l10n("options.label", toolboxStrings),
iconOnly: true,
panelLabel: l10n("options.panelLabel", toolboxStrings),
tooltip: l10n("optionsButton.tooltip", toolboxStrings),
inMenu: false,
isTargetSupported: function(target) {
return true;
},
build: function(iframeWindow, toolbox) {
return new OptionsPanel(iframeWindow, toolbox);
}
}
Tools.inspector = {
id: "inspector",
accesskey: l10n("inspector.accesskey", inspectorStrings),
key: l10n("inspector.commandkey", inspectorStrings),
ordinal: 1,
modifiers: osString == "Darwin" ? "accel,alt" : "accel,shift",
icon: "chrome://global/skin/devtools/tool-inspector.svg",
invertIconForLightTheme: true,
url: "chrome://global/content/devtools/inspector/inspector.xul",
label: l10n("inspector.label", inspectorStrings),
panelLabel: l10n("inspector.panelLabel", inspectorStrings),
tooltip: l10n("inspector.tooltip", inspectorStrings),
inMenu: true,
commands: [
"devtools/resize-commands",
"devtools/inspector/inspector-commands",
"devtools/eyedropper/commands.js"
],
preventClosingOnKey: true,
onkey: function(panel) {
panel.toolbox.highlighterUtils.togglePicker();
},
isTargetSupported: function(target) {
return target.hasActor("inspector");
},
build: function(iframeWindow, toolbox) {
return new InspectorPanel(iframeWindow, toolbox);
}
};
Tools.webConsole = {
id: "webconsole",
key: l10n("cmd.commandkey", webConsoleStrings),
accesskey: l10n("webConsoleCmd.accesskey", webConsoleStrings),
modifiers: Services.appinfo.OS == "Darwin" ? "accel,alt" : "accel,shift",
ordinal: 2,
icon: "chrome://global/skin/devtools/tool-webconsole.svg",
invertIconForLightTheme: true,
url: "chrome://global/content/devtools/webconsole.xul",
label: l10n("ToolboxTabWebconsole.label", webConsoleStrings),
menuLabel: l10n("MenuWebconsole.label", webConsoleStrings),
panelLabel: l10n("ToolboxWebConsole.panelLabel", webConsoleStrings),
tooltip: l10n("ToolboxWebconsole.tooltip", webConsoleStrings),
inMenu: true,
commands: "devtools/webconsole/console-commands",
preventClosingOnKey: true,
onkey: function(panel, toolbox) {
if (toolbox.splitConsole)
return toolbox.focusConsoleInput();
panel.focusInput();
},
isTargetSupported: function(target) {
return true;
},
build: function(iframeWindow, toolbox) {
return new WebConsolePanel(iframeWindow, toolbox);
}
};
Tools.jsdebugger = {
id: "jsdebugger",
key: l10n("debuggerMenu.commandkey", debuggerStrings),
accesskey: l10n("debuggerMenu.accesskey", debuggerStrings),
modifiers: osString == "Darwin" ? "accel,alt" : "accel,shift",
ordinal: 3,
icon: "chrome://global/skin/devtools/tool-debugger.svg",
invertIconForLightTheme: true,
highlightedicon: "chrome://global/skin/devtools/tool-debugger-paused.svg",
url: "chrome://global/content/devtools/debugger.xul",
label: l10n("ToolboxDebugger.label", debuggerStrings),
panelLabel: l10n("ToolboxDebugger.panelLabel", debuggerStrings),
tooltip: l10n("ToolboxDebugger.tooltip", debuggerStrings),
inMenu: true,
commands: "devtools/debugger/debugger-commands",
isTargetSupported: function(target) {
return true;
},
build: function(iframeWindow, toolbox) {
return new DebuggerPanel(iframeWindow, toolbox);
}
};
Tools.styleEditor = {
id: "styleeditor",
key: l10n("open.commandkey", styleEditorStrings),
ordinal: 4,
accesskey: l10n("open.accesskey", styleEditorStrings),
modifiers: "shift",
icon: "chrome://global/skin/devtools/tool-styleeditor.svg",
invertIconForLightTheme: true,
url: "chrome://global/content/devtools/styleeditor.xul",
label: l10n("ToolboxStyleEditor.label", styleEditorStrings),
panelLabel: l10n("ToolboxStyleEditor.panelLabel", styleEditorStrings),
tooltip: l10n("ToolboxStyleEditor.tooltip2", styleEditorStrings),
inMenu: true,
commands: "devtools/styleeditor/styleeditor-commands",
isTargetSupported: function(target) {
return target.hasActor("styleEditor") || target.hasActor("styleSheets");
},
build: function(iframeWindow, toolbox) {
return new StyleEditorPanel(iframeWindow, toolbox);
}
};
Tools.shaderEditor = {
id: "shadereditor",
ordinal: 5,
visibilityswitch: "devtools.shadereditor.enabled",
icon: "chrome://global/skin/devtools/tool-styleeditor.svg",
invertIconForLightTheme: true,
url: "chrome://global/content/devtools/shadereditor.xul",
label: l10n("ToolboxShaderEditor.label", shaderEditorStrings),
panelLabel: l10n("ToolboxShaderEditor.panelLabel", shaderEditorStrings),
tooltip: l10n("ToolboxShaderEditor.tooltip", shaderEditorStrings),
isTargetSupported: function(target) {
return target.hasActor("webgl") && !target.chrome;
},
build: function(iframeWindow, toolbox) {
return new ShaderEditorPanel(iframeWindow, toolbox);
}
};
Tools.canvasDebugger = {
id: "canvasdebugger",
ordinal: 6,
visibilityswitch: "devtools.canvasdebugger.enabled",
icon: "chrome://global/skin/devtools/tool-styleeditor.svg",
invertIconForLightTheme: true,
url: "chrome://global/content/devtools/canvasdebugger.xul",
label: l10n("ToolboxCanvasDebugger.label", canvasDebuggerStrings),
panelLabel: l10n("ToolboxCanvasDebugger.panelLabel", canvasDebuggerStrings),
tooltip: l10n("ToolboxCanvasDebugger.tooltip", canvasDebuggerStrings),
// Hide the Canvas Debugger in the Add-on Debugger and Browser Toolbox
// (bug 1047520).
isTargetSupported: function(target) {
return target.hasActor("canvas") && !target.chrome;
},
build: function (iframeWindow, toolbox) {
return new CanvasDebuggerPanel(iframeWindow, toolbox);
}
};
Tools.performance = {
id: "performance",
ordinal: 7,
icon: "chrome://global/skin/devtools/tool-profiler.svg",
invertIconForLightTheme: true,
highlightedicon: "chrome://browser/skin/devtools/tool-profiler-active.svg",
url: "chrome://global/content/devtools/performance.xul",
visibilityswitch: "devtools.performance.enabled",
label: l10n("profiler.label2", profilerStrings),
panelLabel: l10n("profiler.panelLabel2", profilerStrings),
tooltip: l10n("profiler.tooltip2", profilerStrings),
accesskey: l10n("profiler.accesskey", profilerStrings),
key: l10n("profiler.commandkey2", profilerStrings),
modifiers: "shift",
inMenu: true,
isTargetSupported: function (target) {
return target.hasActor("profiler");
},
build: function (frame, target) {
return new PerformancePanel(frame, target);
}
};
Tools.netMonitor = {
id: "netmonitor",
accesskey: l10n("netmonitor.accesskey", netMonitorStrings),
key: l10n("netmonitor.commandkey", netMonitorStrings),
ordinal: 9,
modifiers: osString == "Darwin" ? "accel,alt" : "accel,shift",
visibilityswitch: "devtools.netmonitor.enabled",
icon: "chrome://global/skin/devtools/tool-network.svg",
invertIconForLightTheme: true,
url: "chrome://global/content/devtools/netmonitor.xul",
label: l10n("netmonitor.label", netMonitorStrings),
panelLabel: l10n("netmonitor.panelLabel", netMonitorStrings),
tooltip: l10n("netmonitor.tooltip", netMonitorStrings),
inMenu: true,
isTargetSupported: function(target) {
return target.getTrait("networkMonitor");
},
build: function(iframeWindow, toolbox) {
return new NetMonitorPanel(iframeWindow, toolbox);
}
};
Tools.storage = {
id: "storage",
key: l10n("storage.commandkey", storageStrings),
ordinal: 10,
accesskey: l10n("storage.accesskey", storageStrings),
modifiers: "shift",
visibilityswitch: "devtools.storage.enabled",
icon: "chrome://global/skin/devtools/tool-storage.svg",
invertIconForLightTheme: true,
url: "chrome://global/content/devtools/storage.xul",
label: l10n("storage.label", storageStrings),
menuLabel: l10n("storage.menuLabel", storageStrings),
panelLabel: l10n("storage.panelLabel", storageStrings),
tooltip: l10n("storage.tooltip2", storageStrings),
inMenu: true,
isTargetSupported: function(target) {
return target.isLocalTab ||
( target.hasActor("storage") &&
target.getTrait("storageInspector") );
},
build: function(iframeWindow, toolbox) {
return new StoragePanel(iframeWindow, toolbox);
}
};
Tools.webAudioEditor = {
id: "webaudioeditor",
ordinal: 11,
visibilityswitch: "devtools.webaudioeditor.enabled",
icon: "chrome://global/skin/devtools/tool-webaudio.svg",
invertIconForLightTheme: true,
url: "chrome://global/content/devtools/webaudioeditor.xul",
label: l10n("ToolboxWebAudioEditor1.label", webAudioEditorStrings),
panelLabel: l10n("ToolboxWebAudioEditor1.panelLabel", webAudioEditorStrings),
tooltip: l10n("ToolboxWebAudioEditor1.tooltip", webAudioEditorStrings),
isTargetSupported: function(target) {
return !target.chrome && target.hasActor("webaudio");
},
build: function(iframeWindow, toolbox) {
return new WebAudioEditorPanel(iframeWindow, toolbox);
}
};
Tools.scratchpad = {
id: "scratchpad",
ordinal: 12,
visibilityswitch: "devtools.scratchpad.enabled",
icon: "chrome://global/skin/devtools/tool-scratchpad.svg",
invertIconForLightTheme: true,
url: "chrome://global/content/devtools/scratchpad.xul",
label: l10n("scratchpad.label", scratchpadStrings),
panelLabel: l10n("scratchpad.panelLabel", scratchpadStrings),
tooltip: l10n("scratchpad.tooltip", scratchpadStrings),
inMenu: false,
commands: "devtools/scratchpad/scratchpad-commands",
isTargetSupported: function(target) {
return target.isRemote;
},
build: function(iframeWindow, toolbox) {
return new ScratchpadPanel(iframeWindow, toolbox);
}
};
let defaultTools = [
Tools.options,
Tools.webConsole,
Tools.inspector,
Tools.jsdebugger,
Tools.styleEditor,
Tools.shaderEditor,
Tools.canvasDebugger,
Tools.webAudioEditor,
Tools.performance,
Tools.netMonitor,
Tools.storage,
Tools.scratchpad
];
exports.defaultTools = defaultTools;
Tools.darkTheme = {
id: "dark",
label: l10n("options.darkTheme.label", toolboxStrings),
ordinal: 1,
stylesheets: ["chrome://global/skin/devtools/dark-theme.css"],
classList: ["theme-dark"],
};
Tools.lightTheme = {
id: "light",
label: l10n("options.lightTheme.label", toolboxStrings),
ordinal: 2,
stylesheets: ["chrome://global/skin/devtools/light-theme.css"],
classList: ["theme-light"],
};
exports.defaultThemes = [
Tools.darkTheme,
Tools.lightTheme,
];
/**
* Lookup l10n string from a string bundle.
*
* @param {string} name
* The key to lookup.
* @param {StringBundle} bundle
* The key to lookup.
* @returns A localized version of the given key.
*/
function l10n(name, bundle)
{
try {
return bundle.GetStringFromName(name);
} catch (ex) {
Services.console.logStringMessage("Error reading '" + name + "'");
throw new Error("l10n error with " + name);
}
}
+15 -415
View File
@@ -4,11 +4,20 @@
"use strict";
const {Cc, Ci, Cu} = require("chrome");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
const { Cu } = require("chrome");
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/devtools/gDevTools.jsm");
const { gDevTools } = require("resource://gre/modules/devtools/gDevTools.jsm");
const { defaultTools, defaultThemes } = require("definitions");
defaultTools.forEach(definition => gDevTools.registerTool(definition));
defaultThemes.forEach(definition => gDevTools.registerTheme(definition));
// Re-export for backwards compatibility, but we should probably the
// definitions from require("definitions") in the future
exports.defaultTools = require("definitions").defaultTools;
exports.defaultThemes = require("definitions").defaultThemes;
exports.Tools = require("definitions").Tools;
Object.defineProperty(exports, "Toolbox", {
get: () => require("devtools/framework/toolbox").Toolbox
@@ -17,398 +26,7 @@ Object.defineProperty(exports, "TargetFactory", {
get: () => require("devtools/framework/target").TargetFactory
});
loader.lazyGetter(this, "osString", () => Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).OS);
let events = require("sdk/system/events");
// Panels
loader.lazyGetter(this, "OptionsPanel", () => require("devtools/framework/toolbox-options").OptionsPanel);
loader.lazyGetter(this, "InspectorPanel", () => require("devtools/inspector/inspector-panel").InspectorPanel);
loader.lazyGetter(this, "WebConsolePanel", () => require("devtools/webconsole/panel").WebConsolePanel);
loader.lazyGetter(this, "DebuggerPanel", () => require("devtools/debugger/panel").DebuggerPanel);
loader.lazyGetter(this, "StyleEditorPanel", () => require("devtools/styleeditor/styleeditor-panel").StyleEditorPanel);
loader.lazyGetter(this, "ShaderEditorPanel", () => require("devtools/shadereditor/panel").ShaderEditorPanel);
loader.lazyGetter(this, "CanvasDebuggerPanel", () => require("devtools/canvasdebugger/panel").CanvasDebuggerPanel);
loader.lazyGetter(this, "WebAudioEditorPanel", () => require("devtools/webaudioeditor/panel").WebAudioEditorPanel);
loader.lazyGetter(this, "PerformancePanel", () => require("devtools/performance/panel").PerformancePanel);
loader.lazyGetter(this, "NetMonitorPanel", () => require("devtools/netmonitor/panel").NetMonitorPanel);
loader.lazyGetter(this, "StoragePanel", () => require("devtools/storage/panel").StoragePanel);
loader.lazyGetter(this, "ScratchpadPanel", () => require("devtools/scratchpad/scratchpad-panel").ScratchpadPanel);
// Strings
const toolboxProps = "chrome://global/locale/devtools/toolbox.properties";
const inspectorProps = "chrome://global/locale/devtools/inspector.properties";
const webConsoleProps = "chrome://global/locale/devtools/webconsole.properties";
const debuggerProps = "chrome://global/locale/devtools/debugger.properties";
const styleEditorProps = "chrome://global/locale/devtools/styleeditor.properties";
const shaderEditorProps = "chrome://global/locale/devtools/shadereditor.properties";
const canvasDebuggerProps = "chrome://global/locale/devtools/canvasdebugger.properties";
const webAudioEditorProps = "chrome://global/locale/devtools/webaudioeditor.properties";
const profilerProps = "chrome://global/locale/devtools/profiler.properties";
const netMonitorProps = "chrome://global/locale/devtools/netmonitor.properties";
const storageProps = "chrome://global/locale/devtools/storage.properties";
const scratchpadProps = "chrome://global/locale/devtools/scratchpad.properties";
loader.lazyGetter(this, "toolboxStrings", () => Services.strings.createBundle(toolboxProps));
loader.lazyGetter(this, "profilerStrings",() => Services.strings.createBundle(profilerProps));
loader.lazyGetter(this, "webConsoleStrings", () => Services.strings.createBundle(webConsoleProps));
loader.lazyGetter(this, "debuggerStrings", () => Services.strings.createBundle(debuggerProps));
loader.lazyGetter(this, "styleEditorStrings", () => Services.strings.createBundle(styleEditorProps));
loader.lazyGetter(this, "shaderEditorStrings", () => Services.strings.createBundle(shaderEditorProps));
loader.lazyGetter(this, "canvasDebuggerStrings", () => Services.strings.createBundle(canvasDebuggerProps));
loader.lazyGetter(this, "webAudioEditorStrings", () => Services.strings.createBundle(webAudioEditorProps));
loader.lazyGetter(this, "inspectorStrings", () => Services.strings.createBundle(inspectorProps));
loader.lazyGetter(this, "netMonitorStrings", () => Services.strings.createBundle(netMonitorProps));
loader.lazyGetter(this, "storageStrings", () => Services.strings.createBundle(storageProps));
loader.lazyGetter(this, "scratchpadStrings", () => Services.strings.createBundle(scratchpadProps));
let Tools = {};
exports.Tools = Tools;
// Definitions
Tools.options = {
id: "options",
ordinal: 0,
url: "chrome://global/content/devtools/framework/toolbox-options.xul",
icon: "chrome://global/skin/devtools/tool-options.svg",
invertIconForLightTheme: true,
bgTheme: "theme-body",
label: l10n("options.label", toolboxStrings),
iconOnly: true,
panelLabel: l10n("options.panelLabel", toolboxStrings),
tooltip: l10n("optionsButton.tooltip", toolboxStrings),
inMenu: false,
isTargetSupported: function(target) {
return true;
},
build: function(iframeWindow, toolbox) {
return new OptionsPanel(iframeWindow, toolbox);
}
}
Tools.inspector = {
id: "inspector",
accesskey: l10n("inspector.accesskey", inspectorStrings),
key: l10n("inspector.commandkey", inspectorStrings),
ordinal: 1,
modifiers: osString == "Darwin" ? "accel,alt" : "accel,shift",
icon: "chrome://global/skin/devtools/tool-inspector.svg",
invertIconForLightTheme: true,
url: "chrome://global/content/devtools/inspector/inspector.xul",
label: l10n("inspector.label", inspectorStrings),
panelLabel: l10n("inspector.panelLabel", inspectorStrings),
tooltip: l10n("inspector.tooltip", inspectorStrings),
inMenu: true,
commands: [
"devtools/resize-commands",
"devtools/inspector/inspector-commands",
"devtools/eyedropper/commands.js"
],
preventClosingOnKey: true,
onkey: function(panel) {
panel.toolbox.highlighterUtils.togglePicker();
},
isTargetSupported: function(target) {
return target.hasActor("inspector");
},
build: function(iframeWindow, toolbox) {
return new InspectorPanel(iframeWindow, toolbox);
}
};
Tools.webConsole = {
id: "webconsole",
key: l10n("cmd.commandkey", webConsoleStrings),
accesskey: l10n("webConsoleCmd.accesskey", webConsoleStrings),
modifiers: Services.appinfo.OS == "Darwin" ? "accel,alt" : "accel,shift",
ordinal: 2,
icon: "chrome://global/skin/devtools/tool-webconsole.svg",
invertIconForLightTheme: true,
url: "chrome://global/content/devtools/webconsole.xul",
label: l10n("ToolboxTabWebconsole.label", webConsoleStrings),
menuLabel: l10n("MenuWebconsole.label", webConsoleStrings),
panelLabel: l10n("ToolboxWebConsole.panelLabel", webConsoleStrings),
tooltip: l10n("ToolboxWebconsole.tooltip", webConsoleStrings),
inMenu: true,
commands: "devtools/webconsole/console-commands",
preventClosingOnKey: true,
onkey: function(panel, toolbox) {
if (toolbox.splitConsole)
return toolbox.focusConsoleInput();
panel.focusInput();
},
isTargetSupported: function(target) {
return true;
},
build: function(iframeWindow, toolbox) {
return new WebConsolePanel(iframeWindow, toolbox);
}
};
Tools.jsdebugger = {
id: "jsdebugger",
key: l10n("debuggerMenu.commandkey", debuggerStrings),
accesskey: l10n("debuggerMenu.accesskey", debuggerStrings),
modifiers: osString == "Darwin" ? "accel,alt" : "accel,shift",
ordinal: 3,
icon: "chrome://global/skin/devtools/tool-debugger.svg",
invertIconForLightTheme: true,
highlightedicon: "chrome://global/skin/devtools/tool-debugger-paused.svg",
url: "chrome://global/content/devtools/debugger.xul",
label: l10n("ToolboxDebugger.label", debuggerStrings),
panelLabel: l10n("ToolboxDebugger.panelLabel", debuggerStrings),
tooltip: l10n("ToolboxDebugger.tooltip", debuggerStrings),
inMenu: true,
commands: "devtools/debugger/debugger-commands",
isTargetSupported: function(target) {
return true;
},
build: function(iframeWindow, toolbox) {
return new DebuggerPanel(iframeWindow, toolbox);
}
};
Tools.styleEditor = {
id: "styleeditor",
key: l10n("open.commandkey", styleEditorStrings),
ordinal: 4,
accesskey: l10n("open.accesskey", styleEditorStrings),
modifiers: "shift",
icon: "chrome://global/skin/devtools/tool-styleeditor.svg",
invertIconForLightTheme: true,
url: "chrome://global/content/devtools/styleeditor.xul",
label: l10n("ToolboxStyleEditor.label", styleEditorStrings),
panelLabel: l10n("ToolboxStyleEditor.panelLabel", styleEditorStrings),
tooltip: l10n("ToolboxStyleEditor.tooltip2", styleEditorStrings),
inMenu: true,
commands: "devtools/styleeditor/styleeditor-commands",
isTargetSupported: function(target) {
return target.hasActor("styleEditor") || target.hasActor("styleSheets");
},
build: function(iframeWindow, toolbox) {
return new StyleEditorPanel(iframeWindow, toolbox);
}
};
Tools.shaderEditor = {
id: "shadereditor",
ordinal: 5,
visibilityswitch: "devtools.shadereditor.enabled",
icon: "chrome://global/skin/devtools/tool-styleeditor.svg",
invertIconForLightTheme: true,
url: "chrome://global/content/devtools/shadereditor.xul",
label: l10n("ToolboxShaderEditor.label", shaderEditorStrings),
panelLabel: l10n("ToolboxShaderEditor.panelLabel", shaderEditorStrings),
tooltip: l10n("ToolboxShaderEditor.tooltip", shaderEditorStrings),
isTargetSupported: function(target) {
return target.hasActor("webgl") && !target.chrome;
},
build: function(iframeWindow, toolbox) {
return new ShaderEditorPanel(iframeWindow, toolbox);
}
};
Tools.canvasDebugger = {
id: "canvasdebugger",
ordinal: 6,
visibilityswitch: "devtools.canvasdebugger.enabled",
icon: "chrome://global/skin/devtools/tool-styleeditor.svg",
invertIconForLightTheme: true,
url: "chrome://global/content/devtools/canvasdebugger.xul",
label: l10n("ToolboxCanvasDebugger.label", canvasDebuggerStrings),
panelLabel: l10n("ToolboxCanvasDebugger.panelLabel", canvasDebuggerStrings),
tooltip: l10n("ToolboxCanvasDebugger.tooltip", canvasDebuggerStrings),
// Hide the Canvas Debugger in the Add-on Debugger and Browser Toolbox
// (bug 1047520).
isTargetSupported: function(target) {
return target.hasActor("canvas") && !target.chrome;
},
build: function (iframeWindow, toolbox) {
return new CanvasDebuggerPanel(iframeWindow, toolbox);
}
};
Tools.performance = {
id: "performance",
ordinal: 7,
icon: "chrome://global/skin/devtools/tool-profiler.svg",
invertIconForLightTheme: true,
url: "chrome://global/content/devtools/performance.xul",
visibilityswitch: "devtools.performance.enabled",
label: l10n("profiler.label2", profilerStrings),
panelLabel: l10n("profiler.panelLabel2", profilerStrings),
tooltip: l10n("profiler.tooltip2", profilerStrings),
accesskey: l10n("profiler.accesskey", profilerStrings),
key: l10n("profiler.commandkey2", profilerStrings),
modifiers: "shift",
inMenu: true,
isTargetSupported: function (target) {
return target.hasActor("profiler");
},
build: function (frame, target) {
return new PerformancePanel(frame, target);
}
};
Tools.netMonitor = {
id: "netmonitor",
accesskey: l10n("netmonitor.accesskey", netMonitorStrings),
key: l10n("netmonitor.commandkey", netMonitorStrings),
ordinal: 9,
modifiers: osString == "Darwin" ? "accel,alt" : "accel,shift",
visibilityswitch: "devtools.netmonitor.enabled",
icon: "chrome://global/skin/devtools/tool-network.svg",
invertIconForLightTheme: true,
url: "chrome://global/content/devtools/netmonitor.xul",
label: l10n("netmonitor.label", netMonitorStrings),
panelLabel: l10n("netmonitor.panelLabel", netMonitorStrings),
tooltip: l10n("netmonitor.tooltip", netMonitorStrings),
inMenu: true,
isTargetSupported: function(target) {
return target.getTrait("networkMonitor");
},
build: function(iframeWindow, toolbox) {
return new NetMonitorPanel(iframeWindow, toolbox);
}
};
Tools.storage = {
id: "storage",
key: l10n("storage.commandkey", storageStrings),
ordinal: 10,
accesskey: l10n("storage.accesskey", storageStrings),
modifiers: "shift",
visibilityswitch: "devtools.storage.enabled",
icon: "chrome://global/skin/devtools/tool-storage.svg",
invertIconForLightTheme: true,
url: "chrome://global/content/devtools/storage.xul",
label: l10n("storage.label", storageStrings),
menuLabel: l10n("storage.menuLabel", storageStrings),
panelLabel: l10n("storage.panelLabel", storageStrings),
tooltip: l10n("storage.tooltip2", storageStrings),
inMenu: true,
isTargetSupported: function(target) {
return target.isLocalTab ||
( target.hasActor("storage") &&
target.getTrait("storageInspector") );
},
build: function(iframeWindow, toolbox) {
return new StoragePanel(iframeWindow, toolbox);
}
};
Tools.webAudioEditor = {
id: "webaudioeditor",
ordinal: 11,
visibilityswitch: "devtools.webaudioeditor.enabled",
icon: "chrome://global/skin/devtools/tool-webaudio.svg",
invertIconForLightTheme: true,
url: "chrome://global/content/devtools/webaudioeditor.xul",
label: l10n("ToolboxWebAudioEditor1.label", webAudioEditorStrings),
panelLabel: l10n("ToolboxWebAudioEditor1.panelLabel", webAudioEditorStrings),
tooltip: l10n("ToolboxWebAudioEditor1.tooltip", webAudioEditorStrings),
isTargetSupported: function(target) {
return !target.chrome && target.hasActor("webaudio");
},
build: function(iframeWindow, toolbox) {
return new WebAudioEditorPanel(iframeWindow, toolbox);
}
};
Tools.scratchpad = {
id: "scratchpad",
ordinal: 12,
visibilityswitch: "devtools.scratchpad.enabled",
icon: "chrome://global/skin/devtools/tool-scratchpad.svg",
invertIconForLightTheme: true,
url: "chrome://global/content/devtools/scratchpad.xul",
label: l10n("scratchpad.label", scratchpadStrings),
panelLabel: l10n("scratchpad.panelLabel", scratchpadStrings),
tooltip: l10n("scratchpad.tooltip", scratchpadStrings),
inMenu: false,
commands: "devtools/scratchpad/scratchpad-commands",
isTargetSupported: function(target) {
return target.isRemote;
},
build: function(iframeWindow, toolbox) {
return new ScratchpadPanel(iframeWindow, toolbox);
}
};
let defaultTools = [
Tools.options,
Tools.webConsole,
Tools.inspector,
Tools.jsdebugger,
Tools.styleEditor,
Tools.shaderEditor,
Tools.canvasDebugger,
Tools.webAudioEditor,
Tools.performance,
Tools.netMonitor,
Tools.storage,
Tools.scratchpad
];
exports.defaultTools = defaultTools;
for (let definition of defaultTools) {
gDevTools.registerTool(definition);
}
Tools.darkTheme = {
id: "dark",
label: l10n("options.darkTheme.label", toolboxStrings),
ordinal: 1,
stylesheets: ["chrome://global/skin/devtools/dark-theme.css"],
classList: ["theme-dark"],
};
Tools.lightTheme = {
id: "light",
label: l10n("options.lightTheme.label", toolboxStrings),
ordinal: 2,
stylesheets: ["chrome://global/skin/devtools/light-theme.css"],
classList: ["theme-light"],
};
let defaultThemes = [
Tools.darkTheme,
Tools.lightTheme,
];
for (let definition of defaultThemes) {
gDevTools.registerTheme(definition);
}
var unloadObserver = {
const unloadObserver = {
observe: function(subject, topic, data) {
if (subject.wrappedJSObject === require("@loader/unload")) {
Services.obs.removeObserver(unloadObserver, "sdk:loader:destroy");
@@ -423,23 +41,5 @@ var unloadObserver = {
};
Services.obs.addObserver(unloadObserver, "sdk:loader:destroy", false);
const events = require("sdk/system/events");
events.emit("devtools-loaded", {});
/**
* Lookup l10n string from a string bundle.
*
* @param {string} name
* The key to lookup.
* @param {StringBundle} bundle
* The key to lookup.
* @returns A localized version of the given key.
*/
function l10n(name, bundle)
{
try {
return bundle.GetStringFromName(name);
} catch (ex) {
Services.console.logStringMessage("Error reading '" + name + "'");
throw new Error("l10n error with " + name);
}
}
+1
View File
@@ -12,5 +12,6 @@ EXTRA_COMPONENTS += [
JAR_MANIFESTS += ['jar.mn']
EXTRA_JS_MODULES.devtools += [
'definitions.js',
'main.js',
]
@@ -0,0 +1,90 @@
/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/
*/
// Check that exceptions from scripts loaded with the addon-sdk loader are
// opened correctly in View Source from the Browser Console.
// See bug 866950.
"use strict";
const TEST_URI = "data:text/html;charset=utf8,<p>hello world from bug 866950";
function test()
{
requestLongerTimeout(2);
let webconsole, browserconsole;
Task.spawn(runner).then(finishTest);
function* runner() {
let {tab} = yield loadTab(TEST_URI);
webconsole = yield openConsole(tab);
ok(webconsole, "web console opened");
browserconsole = yield HUDService.toggleBrowserConsole();
ok(browserconsole, "browser console opened");
// Cause an exception in a script loaded with the addon-sdk loader.
let toolbox = gDevTools.getToolbox(webconsole.target);
let oldPanels = toolbox._toolPanels;
toolbox._toolPanels = {}; // non-iterable
function fixToolbox() {
toolbox._toolPanels = oldPanels;
}
info("generate exception and wait for message");
executeSoon(() => {
executeSoon(fixToolbox);
expectUncaughtException();
toolbox.getToolPanels();
});
let [result] = yield waitForMessages({
webconsole: browserconsole,
messages: [{
text: "TypeError: this._toolPanels is not iterable",
category: CATEGORY_JS,
severity: SEVERITY_ERROR,
}],
});
fixToolbox();
let msg = [...result.matched][0];
ok(msg, "message element found");
let locationNode = msg.querySelector(".message-location");
ok(locationNode, "message location element found");
let title = locationNode.getAttribute("title");
info("location node title: " + title);
isnot(title.indexOf(" -> "), -1, "error comes from a subscript");
let viewSource = browserconsole.viewSource;
let URL = null;
let clickPromise = promise.defer();
browserconsole.viewSourceInDebugger = (aURL) => {
info("browserconsole.viewSourceInDebugger() was invoked: " + aURL);
URL = aURL;
clickPromise.resolve(null);
};
msg.scrollIntoView();
EventUtils.synthesizeMouse(locationNode, 2, 2, {},
browserconsole.iframeWindow);
info("wait for click on locationNode");
yield clickPromise;
info("view-source url: " + URL);
ok(URL, "we have some source URL after the click");
isnot(URL.indexOf("toolbox.js"), -1, "we have the expected view source URL");
is(URL.indexOf("->"), -1, "no -> in the URL given to view-source");
browserconsole.viewSourceInDebugger = viewSource;
}
}
@@ -0,0 +1,73 @@
/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/
*/
// Check that JS errors and CSS warnings open view source when their source link
// is clicked in the Browser Console. See bug 877778.
const TEST_URI = "data:text/html;charset=utf8,<p>hello world from bug 877778 " +
"<button onclick='foobar.explode()' " +
"style='test-color: green-please'>click!</button>";
function test()
{
let hud;
loadTab(TEST_URI).then(() => {
HUDService.toggleBrowserConsole().then(browserConsoleOpened);
});
function browserConsoleOpened(aHud)
{
hud = aHud;
ok(hud, "browser console opened");
let button = content.document.querySelector("button");
ok(button, "button element found");
info("generate exception and wait for the message");
executeSoon(() => {
expectUncaughtException();
button.click();
});
waitForMessages({
webconsole: hud,
messages: [
{
text: "ReferenceError: foobar is not defined",
category: CATEGORY_JS,
severity: SEVERITY_ERROR,
},
{
text: "Unknown property 'test-color'",
category: CATEGORY_CSS,
severity: SEVERITY_WARNING,
},
],
}).then(onMessageFound);
}
function onMessageFound(results)
{
let viewSource = hud.viewSource;
let viewSourceCalled = false;
hud.viewSourceInDebugger = () => viewSourceCalled = true;
for (let result of results) {
viewSourceCalled = false;
let msg = [...results[0].matched][0];
ok(msg, "message element found for: " + result.text);
let locationNode = msg.querySelector(".message-location");
ok(locationNode, "message location element found");
EventUtils.synthesizeMouse(locationNode, 2, 2, {}, hud.iframeWindow);
ok(viewSourceCalled, "view source opened");
}
hud.viewSourceInDebugger = viewSource;
finishTest();
}
}
+3
View File
@@ -125,9 +125,12 @@ browser.jar:
skin/classic/browser/tabbrowser/tab.png (tabbrowser/tab.png)
skin/classic/browser/tabbrowser/tab-overflow-border.png (tabbrowser/tab-overflow-border.png)
skin/classic/browser/tabbrowser/tabDragIndicator.png (tabbrowser/tabDragIndicator.png)
skin/classic/browser/devtools/add.svg (../shared/devtools/images/add.svg)
skin/classic/browser/devtools/filter-swatch.svg (../shared/devtools/images/filter-swatch.svg)
skin/classic/browser/devtools/search-clear-failed.svg (../shared/devtools/images/search-clear-failed.svg)
skin/classic/browser/devtools/search-clear-light.svg (../shared/devtools/images/search-clear-light.svg)
skin/classic/browser/devtools/search-clear-dark.svg (../shared/devtools/images/search-clear-dark.svg)
skin/classic/browser/devtools/tool-profiler-active.svg (../shared/devtools/images/tool-profiler-active.svg)
#ifdef MOZ_SERVICES_SYNC
skin/classic/browser/sync-16-throbber.png
skin/classic/browser/sync-16.png
+3
View File
@@ -160,9 +160,12 @@ browser.jar:
skin/classic/browser/tabbrowser/tab-arrow-left-inverted.png (tabbrowser/tab-arrow-left-inverted.png)
skin/classic/browser/tabbrowser/tab-overflow-border.png (tabbrowser/tab-overflow-border.png)
skin/classic/browser/tabbrowser/tabDragIndicator.png (tabbrowser/tabDragIndicator.png)
skin/classic/browser/devtools/add.svg (../shared/devtools/images/add.svg)
skin/classic/browser/devtools/filter-swatch.svg (../shared/devtools/images/filter-swatch.svg)
skin/classic/browser/devtools/search-clear-failed.svg (../shared/devtools/images/search-clear-failed.svg)
skin/classic/browser/devtools/search-clear-light.svg (../shared/devtools/images/search-clear-light.svg)
skin/classic/browser/devtools/search-clear-dark.svg (../shared/devtools/images/search-clear-dark.svg)
skin/classic/browser/devtools/tool-profiler-active.svg (../shared/devtools/images/tool-profiler-active.svg)
#ifdef MOZ_SERVICES_SYNC
skin/classic/browser/sync-throbber.png
skin/classic/browser/sync-16.png
@@ -0,0 +1,3 @@
<svg width="18" height="18" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<polygon fill="#EEF0F2" points="4,7 8,7 8,3 10,3 10,7 14,7 14,9 10,9 10,13 8,13 8,9 4,9 4,7"></polygon>
</svg>

After

Width:  |  Height:  |  Size: 220 B

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- 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/. -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 12 12" width="12px" height="12px">
<defs>
<mask id="mask">
<rect width="100%" height="100%" fill="white"/>
<polygon points="12,0 0,0 0,12"/>
</mask>
</defs>
<g id="addpage-shape">
<circle cx="6" cy="6" r="6" fill="white"/>
<circle cx="6" cy="6" r="6" mask="url(#mask)" fill="#AEB0B1" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 683 B

@@ -0,0 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" xmlns:xlink="http://www.w3.org/1999/xlink" enable-background="new 0 0 16 16">
<g fill="#71c054" fill-rule="evenodd">
<path d="m8,1c-3.9,0-7,3.1-7,7s3.1,7 7,7c3.9,0 7-3.1 7-7s-3.1-7-7-7zm-.1,12c-2.8,0-5-2.2-5-5 0-2.8 2.2-5 5-5s5,2.2 5,5c0,2.8-2.2,5-5,5z"/>
<path d="m8,6.9c.6,0 1.1,.5 1.1,1.1 0,.6-.5,1.1-1.1,1.1-.6,0-1.1-.5-1.1-1.1 0-.6 .5-1.1 1.1-1.1z"/>
<path d="m11.3,4.6l-3.9,2.5 1.5,1.4 2.4-3.9z"/>
<path opacity=".4" d="m4.6,10c.7,1.2 2,2 3.4,2 1.5,0 2.7-.8 3.4-2h-6.8z"/>
<g opacity=".3">
<path d="m7.1,5.1l-.6-1.3-.9,.4 .7,1.3c.2-.1 .5-.3 .8-.4z"/>
<path d="m9.8,5.6l.7-1.4-.9-.4-.7,1.3c.3,.2 .6,.3 .9,.5z"/>
<path d="m10.8,7c.1,.3 .2,.7 .2,1h2v-1h-2.2z"/>
<path d="m5,8c0-.3 .1-.7 .2-1h-2.2l-.1,1h2.1z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 814 B

+3
View File
@@ -156,9 +156,12 @@ browser.jar:
skin/classic/browser/tabbrowser/tab-arrow-left-inverted.png (tabbrowser/tab-arrow-left-inverted.png)
skin/classic/browser/tabbrowser/tab-overflow-border.png (tabbrowser/tab-overflow-border.png)
skin/classic/browser/tabbrowser/tabDragIndicator.png (tabbrowser/tabDragIndicator.png)
skin/classic/browser/devtools/add.svg (../shared/devtools/images/add.svg)
skin/classic/browser/devtools/filter-swatch.svg (../shared/devtools/images/filter-swatch.svg)
skin/classic/browser/devtools/search-clear-failed.svg (../shared/devtools/images/search-clear-failed.svg)
skin/classic/browser/devtools/search-clear-light.svg (../shared/devtools/images/search-clear-light.svg)
skin/classic/browser/devtools/search-clear-dark.svg (../shared/devtools/images/search-clear-dark.svg)
skin/classic/browser/devtools/tool-profiler-active.svg (../shared/devtools/images/tool-profiler-active.svg)
#ifdef MOZ_SERVICES_SYNC
skin/classic/browser/sync-throbber.png
skin/classic/browser/sync-16.png
+2 -3
View File
@@ -2647,10 +2647,9 @@ ContentChild::RecvStopProfiler()
bool
ContentChild::RecvGetProfile(nsCString* aProfile)
{
char* profile = profiler_get_profile();
UniquePtr<char[]> profile = profiler_get_profile();
if (profile) {
*aProfile = nsCString(profile, strlen(profile));
free(profile);
*aProfile = nsCString(profile.get(), strlen(profile.get()));
} else {
*aProfile = EmptyCString();
}
+2 -3
View File
@@ -2510,10 +2510,9 @@ PluginModuleChild::RecvStopProfiler()
bool
PluginModuleChild::AnswerGetProfile(nsCString* aProfile)
{
char* profile = profiler_get_profile();
UniquePtr<char[]> profile = profiler_get_profile();
if (profile != nullptr) {
*aProfile = nsCString(profile, strlen(profile));
free(profile);
*aProfile = nsCString(profile.get(), strlen(profile.get()));
} else {
*aProfile = nsCString("", 0);
}
+6
View File
@@ -1154,6 +1154,12 @@ pref("devtools.telemetry.tools.opened.version", "{}");
pref("devtools.selfxss.count", 0);
#endif //MOZ_DEVTOOLS
// URL of the remote JSON catalog used for device simulation
pref("devtools.devices.url", "https://code.cdn.mozilla.net/devices/devices.json");
// URL of the remote JSON catalog used for device simulation
pref("devtools.devices.url", "https://code.cdn.mozilla.net/devices/devices.json");
// view source
pref("view_source.syntax_highlight", true);
pref("view_source.wrap_long_lines", false);
+1
View File
@@ -95,6 +95,7 @@ function close(panel) {
// when quitting the host application while a panel is visible. To suppress
// these errors, check for "hidePopup" in panel before calling it.
// It's not clear if there's an issue or it's expected behavior.
// See Bug 1151796.
return panel.hidePopup && panel.hidePopup();
}
+82 -1
View File
@@ -5452,16 +5452,50 @@
"n_values": 13,
"description": "Screen resolution of DevTools user (0:lower, 1:800x600, 2:1024x768, 3:1280x800, 4:1280x1024, 5:1366x768, 6:1440x900, 7:1920x1080, 8:2560×1440, 9:2560×1600, 10:2880x1800, 11:other, 12:higher)"
},
"DEVTOOLS_WEBIDE_OPENED_BOOLEAN": {
"expires_in_version": "never",
"kind": "boolean",
"description": "How many times has the DevTools WebIDE been opened?"
},
"DEVTOOLS_CANVASDEBUGGER_OPENED_BOOLEAN": {
"expires_in_version": "never",
"kind": "boolean",
"description": "How many times has the devtool's Canvas Debugger been opened?"
},
"DEVTOOLS_TOOLBOX_OPENED_BOOLEAN": {
"expires_in_version": "never",
"kind": "boolean",
"description": "How many times has the devtool's toolbox been opened?"
},
"DEVTOOLS_WEBIDE_OPENED_PER_USER_FLAG": {
"expires_in_version": "never",
"kind": "flag",
"description": "How many users have opened the DevTools WebIDE?"
},
"DEVTOOLS_CANVASDEBUGGER_OPENED_PER_USER_FLAG": {
"expires_in_version": "never",
"kind": "flag",
"description": "How many users have opened the devtool's Canvas Debugger?"
},
"DEVTOOLS_TOOLBOX_OPENED_PER_USER_FLAG": {
"expires_in_version": "never",
"kind": "flag",
"description": "How many times has the devtool's toolbox been opened?"
},
"DEVTOOLS_WEBIDE_TIME_ACTIVE_SECONDS": {
"expires_in_version": "never",
"kind": "exponential",
"high": "10000000",
"n_buckets": 100,
"description": "How long has WebIDE been active (seconds)"
},
"DEVTOOLS_CANVASDEBUGGER_TIME_ACTIVE_SECONDS": {
"expires_in_version": "never",
"kind": "exponential",
"high": "10000000",
"n_buckets": 100,
"description": "How long has the Canvas Debugger been active (seconds)"
},
"DEVTOOLS_TOOLBOX_TIME_ACTIVE_SECONDS": {
"expires_in_version": "never",
"kind": "exponential",
@@ -5475,7 +5509,54 @@
"high": "10000000",
"n_buckets": 100,
"description": "How long has the options panel been active (seconds)"
},
},
"DEVTOOLS_WEBIDE_CONNECTION_RESULT": {
"expires_in_version": "never",
"kind": "boolean",
"description": "Did WebIDE runtime connection succeed?"
},
"DEVTOOLS_WEBIDE_USB_CONNECTION_RESULT": {
"expires_in_version": "never",
"kind": "boolean",
"description": "Did WebIDE USB runtime connection succeed?"
},
"DEVTOOLS_WEBIDE_WIFI_CONNECTION_RESULT": {
"expires_in_version": "never",
"kind": "boolean",
"description": "Did WebIDE WiFi runtime connection succeed?"
},
"DEVTOOLS_WEBIDE_SIMULATOR_CONNECTION_RESULT": {
"expires_in_version": "never",
"kind": "boolean",
"description": "Did WebIDE simulator runtime connection succeed?"
},
"DEVTOOLS_WEBIDE_REMOTE_CONNECTION_RESULT": {
"expires_in_version": "never",
"kind": "boolean",
"description": "Did WebIDE remote runtime connection succeed?"
},
"DEVTOOLS_WEBIDE_LOCAL_CONNECTION_RESULT": {
"expires_in_version": "never",
"kind": "boolean",
"description": "Did WebIDE local runtime connection succeed?"
},
"DEVTOOLS_WEBIDE_CONNECTION_TIME_SECONDS": {
"expires_in_version": "never",
"kind": "exponential",
"high": "10000000",
"n_buckets": 100,
"description": "How long was WebIDE connected to a runtime (seconds)?"
},
"DEVTOOLS_WEBIDE_CONNECTION_PLAY_USED": {
"expires_in_version": "never",
"kind": "boolean",
"description": "Was WebIDE's play button used during this runtime connection?"
},
"DEVTOOLS_WEBIDE_CONNECTION_DEBUG_USED": {
"expires_in_version": "never",
"kind": "boolean",
"description": "Was WebIDE's debug button used during this runtime connection?"
},
"DEVTOOLS_TABS_OPEN_PEAK_LINEAR": {
"expires_in_version": "never",
"kind": "linear",
+3
View File
@@ -79,6 +79,7 @@ BuiltinProvider.prototype = {
// corresponding addition to the SrcdirProvider mapping below as well.
"": "resource://gre/modules/commonjs/",
"main": "resource:///modules/devtools/main.js",
"definitions": "resource:///modules/devtools/definitions.js",
"devtools": "resource://gre/modules/devtools",
"devtools/toolkit": "resource://gre/modules/devtools",
"devtools/server": "resource://gre/modules/devtools/server",
@@ -135,6 +136,7 @@ SrcdirProvider.prototype = {
let devtoolsDir = OS.Path.join(srcdir, "browser", "devtools");
let toolkitDir = OS.Path.join(srcdir, "toolkit", "devtools");
let mainURI = this.fileURI(OS.Path.join(devtoolsDir, "main.js"));
let definitionsURI = this.fileURI(OS.Path.join(devtoolsDir, "definitions.js"));
let devtoolsURI = this.fileURI(devtoolsDir);
let toolkitURI = this.fileURI(toolkitDir);
let serverURI = this.fileURI(OS.Path.join(toolkitDir, "server"));
@@ -161,6 +163,7 @@ SrcdirProvider.prototype = {
paths: {
"": "resource://gre/modules/commonjs/",
"main": mainURI,
"definitions": definitionsURI,
"devtools": devtoolsURI,
"devtools/toolkit": toolkitURI,
"devtools/server": serverURI,
+17 -4
View File
@@ -384,7 +384,7 @@ let CallsListView = Heritage.extend(WidgetMethods, {
// If clicking on the location, jump to the Debugger.
if (e.target.classList.contains("call-item-location")) {
let { file, line } = callItem.attachment.actor;
viewSourceInDebugger(file, line);
this._viewSourceInDebugger(file, line);
return;
}
// Otherwise hide the call stack.
@@ -414,7 +414,7 @@ let CallsListView = Heritage.extend(WidgetMethods, {
let name = document.createElement("label");
name.className = "plain call-item-stack-fn-name";
name.setAttribute("value", "??" + call.name + "()");
name.setAttribute("value", "" + call.name + "()");
contents.appendChild(name);
let spacer = document.createElement("spacer");
@@ -456,7 +456,7 @@ let CallsListView = Heritage.extend(WidgetMethods, {
* The line of the respective function.
*/
_onStackFileClick: function(e, { file, line }) {
viewSourceInDebugger(file, line);
this._viewSourceInDebugger(file, line);
},
/**
@@ -501,7 +501,7 @@ let CallsListView = Heritage.extend(WidgetMethods, {
}
let callItem = this.selectedItem;
let { file, line } = callItem.attachment.actor;
viewSourceInDebugger(file, line);
this._viewSourceInDebugger(file, line);
},
/**
@@ -509,5 +509,18 @@ let CallsListView = Heritage.extend(WidgetMethods, {
*/
_onStepOut: function() {
this.selectedIndex = this.itemCount - 1;
},
/**
* Opens the specified file and line in the debugger. Falls back to Firefox's View Source.
*/
_viewSourceInDebugger: function (file, line) {
gToolbox.viewSourceInDebugger(file, line).then(success => {
if (success) {
window.emit(EVENTS.SOURCE_SHOWN_IN_JS_DEBUGGER);
} else {
window.emit(EVENTS.SOURCE_NOT_FOUND_IN_JS_DEBUGGER);
}
});
}
});
@@ -12,7 +12,8 @@ Cu.import("resource://gre/modules/devtools/ViewHelpers.jsm");
Cu.import("resource://gre/modules/devtools/Console.jsm");
Cu.import("resource://gre/modules/devtools/gDevTools.jsm");
const require = Cu.import("resource://gre/modules/devtools/Loader.jsm", {}).devtools.require;
const devtools = Cu.import("resource://gre/modules/devtools/Loader.jsm", {}).devtools;
const { require } = devtools;
const promise = Cu.import("resource://gre/modules/Promise.jsm", {}).Promise;
const EventEmitter = require("devtools/toolkit/event-emitter");
const { CallWatcherFront } = require("devtools/server/actors/call-watcher");
@@ -350,32 +351,3 @@ function getThumbnailForCall(thumbnails, index) {
}
return CanvasFront.INVALID_SNAPSHOT_IMAGE;
}
/**
* Opens/selects the debugger in this toolbox and jumps to the specified
* file name and line number.
*/
function viewSourceInDebugger(url, line) {
let showSource = ({ DebuggerView }) => {
let item = DebuggerView.Sources.getItemForAttachment(a => a.source.url === url);
if (item) {
DebuggerView.setEditorLocation(item.attachment.source.actor, line, { noDebug: true }).then(() => {
window.emit(EVENTS.SOURCE_SHOWN_IN_JS_DEBUGGER);
}, () => {
window.emit(EVENTS.SOURCE_NOT_FOUND_IN_JS_DEBUGGER);
});
}
}
// If the Debugger was already open, switch to it and try to show the
// source immediately. Otherwise, initialize it and wait for the sources
// to be added first.
let debuggerAlreadyOpen = gToolbox.getPanel("jsdebugger");
gToolbox.selectTool("jsdebugger").then(({ panelWin: dbg }) => {
if (debuggerAlreadyOpen) {
showSource(dbg);
} else {
dbg.once(dbg.EVENTS.SOURCES_ADDED, () => showSource(dbg));
}
});
}
@@ -240,7 +240,7 @@ let SnapshotsListView = Heritage.extend(WidgetMethods, {
// the dummy snapshot item from being drawn.
this.addSnapshot();
// If this is the first item, immediately show the "Loading?? notice.
// If this is the first item, immediately show the "Loading…" notice.
if (this.itemCount == 1) {
$("#empty-notice").hidden = true;
$("#waiting-notice").hidden = false;
@@ -463,7 +463,7 @@ let SnapshotsListView = Heritage.extend(WidgetMethods, {
let footer = $(".snapshot-item-footer", snapshotItem.target);
let save = $(".snapshot-item-save", snapshotItem.target);
// Show a throbber and a "Saving?? label if serializing isn't immediate.
// Show a throbber and a "Saving…" label if serializing isn't immediate.
setNamedTimeout("call-list-save", CALLS_LIST_SLOW_SAVE_DELAY, () => {
footer.classList.add("devtools-throbber");
save.setAttribute("disabled", "true");
+10 -2
View File
@@ -17,6 +17,8 @@ Cu.import("resource://gre/modules/devtools/dbg-server.jsm");
DevToolsUtils.defineLazyModuleGetter(this, "Task",
"resource://gre/modules/Task.jsm");
const REMOTE_TIMEOUT = "devtools.debugger.remote-timeout";
/**
* Connection Manager.
*
@@ -52,6 +54,8 @@ DevToolsUtils.defineLazyModuleGetter(this, "Task",
* . logs Current logs. "newlog" event notifies new available logs
* . store Reference to a local data store (see below)
* . keepConnecting Should the connection keep trying to connect?
* . timeoutDelay When should we give up (in ms)?
* 0 means wait forever.
* . encryption Should the connection be encrypted?
* . authentication What authentication scheme should be used?
* . authenticator The |Authenticator| instance used. Overriding
@@ -233,8 +237,11 @@ Connection.prototype = {
return settings;
},
timeoutDelay: Services.prefs.getIntPref(REMOTE_TIMEOUT),
resetOptions() {
this.keepConnecting = false;
this.timeoutDelay = Services.prefs.getIntPref(REMOTE_TIMEOUT);
this.encryption = false;
this.authentication = null;
this.advertisement = null;
@@ -268,8 +275,9 @@ Connection.prototype = {
}
this._setStatus(Connection.Status.CONNECTING);
let delay = Services.prefs.getIntPref("devtools.debugger.remote-timeout");
this._timeoutID = setTimeout(this._onTimeout, delay);
if (this.timeoutDelay > 0) {
this._timeoutID = setTimeout(this._onTimeout, this.timeoutDelay);
}
this._clientConnect();
} else {
let msg = "Can't connect. Client is not fully disconnected";
+125 -10
View File
@@ -4,9 +4,56 @@
"use strict";
const gcli = require("gcli/index");
const { createSystem, connectFront, disconnectFront } = require("gcli/system");
const { GcliFront } = require("devtools/server/actors/gcli");
const commandModules = [
/**
* This is the basic list of modules that should be loaded into each
* requisition instance whether server side or client side
*/
exports.baseModules = [
"gcli/types/delegate",
"gcli/types/selection",
"gcli/types/array",
"gcli/types/boolean",
"gcli/types/command",
"gcli/types/date",
"gcli/types/file",
"gcli/types/javascript",
"gcli/types/node",
"gcli/types/number",
"gcli/types/resource",
"gcli/types/setting",
"gcli/types/string",
"gcli/types/union",
"gcli/types/url",
"gcli/fields/fields",
"gcli/fields/delegate",
"gcli/fields/selection",
"gcli/ui/focus",
"gcli/ui/intro",
"gcli/converters/converters",
"gcli/converters/basic",
"gcli/converters/terminal",
"gcli/languages/command",
"gcli/languages/javascript",
"gcli/commands/clear",
"gcli/commands/context",
"gcli/commands/help",
"gcli/commands/pref",
];
/**
* Some commands belong to a tool (see getToolModules). This is a list of the
* modules that are *not* owned by a tool.
*/
exports.devtoolsModules = [
"devtools/tilt/tilt-commands",
"gcli/commands/addon",
"gcli/commands/appcache",
@@ -29,15 +76,83 @@ const commandModules = [
"gcli/commands/tools",
];
gcli.addItemsByModule(commandModules, { delayedLoad: true });
/**
* Register commands from tools with 'command: [ "some/module" ]' definitions.
* The map/reduce incantation squashes the array of arrays to a single array.
*/
const defaultTools = require("definitions").defaultTools;
exports.devtoolsToolModules = defaultTools.map(def => def.commands || [])
.reduce((prev, curr) => prev.concat(curr), []);
const defaultTools = require("main").defaultTools;
for (let definition of defaultTools) {
if (definition.commands) {
gcli.addItemsByModule(definition.commands, { delayedLoad: true });
/**
* Add modules to a system for use in a content process (but don't call load)
*/
exports.addAllItemsByModule = function(system) {
system.addItemsByModule(exports.baseModules, { delayedLoad: true });
system.addItemsByModule(exports.devtoolsModules, { delayedLoad: true });
system.addItemsByModule(exports.devtoolsToolModules, { delayedLoad: true });
const { mozDirLoader } = require("gcli/commands/cmd");
system.addItemsByModule("mozcmd", { delayedLoad: true, loader: mozDirLoader });
};
/**
* This is WeakMap<Target, Links> where Links is an object that looks like
* { refs: number, promise: Promise<System>, front: GcliFront }
*/
var linksForTarget = new WeakMap();
/**
* The toolbox uses the following properties on a command to allow it to be
* added to the toolbox toolbar
*/
var customProperties = [ "buttonId", "buttonClass", "tooltipText" ];
/**
* Create a system which connects to a GCLI in a remote target
* @return Promise<System> for the given target
*/
exports.getSystem = function(target) {
const existingLinks = linksForTarget.get(target);
if (existingLinks != null) {
existingLinks.refs++;
return existingLinks.promise;
}
}
const { mozDirLoader } = require("gcli/commands/cmd");
const system = createSystem({ location: "client" });
gcli.addItemsByModule("mozcmd", { delayedLoad: true, loader: mozDirLoader });
exports.addAllItemsByModule(system);
// Load the client system
const links = {
refs: 1,
system,
promise: system.load().then(() => {
return GcliFront.create(target).then(front => {
links.front = front;
return connectFront(system, front, customProperties).then(() => system);
});
})
};
linksForTarget.set(target, links);
return links.promise;
};
/**
* Someone that called getSystem doesn't need it any more, so decrement the
* count of users of the system for that target, and destroy if needed
*/
exports.releaseSystem = function(target) {
const links = linksForTarget.get(target);
if (links == null) {
throw new Error("releaseSystem called for unknown target");
}
links.refs--;
if (links.refs === 0) {
disconnectFront(links.system, links.front);
links.system.destroy();
linksForTarget.delete(target);
}
};
@@ -7,7 +7,7 @@ function test() {
return Task.spawn(spawnTest).then(finish, helpers.handleError);
}
function spawnTest() {
function* spawnTest() {
let options = yield helpers.openTab("about:blank");
yield helpers.openToolbar(options);
@@ -11,7 +11,7 @@ function test() {
return Task.spawn(spawnTest).then(finish, helpers.handleError);
}
function spawnTest() {
function* spawnTest() {
let lines = [
'Manifest has a character encoding of ISO-8859-1. Manifests must have the ' +
'utf-8 character encoding.',
@@ -10,7 +10,7 @@ function test() {
return Task.spawn(spawnTest).then(finish, helpers.handleError);
}
function spawnTest() {
function* spawnTest() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
@@ -8,7 +8,7 @@ const TEST_URI = "data:text/html;charset=utf-8,gcli-calllog";
let tests = {};
function test() {
return Task.spawn(function() {
return Task.spawn(function*() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
@@ -8,7 +8,7 @@ const TEST_URI = "data:text/html;charset=utf-8,cmd-calllog-chrome";
let tests = {};
function test() {
return Task.spawn(function() {
return Task.spawn(function*() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
@@ -9,7 +9,7 @@ function test() {
return Task.spawn(spawnTest).then(finish, helpers.handleError);
}
function spawnTest() {
function* spawnTest() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
@@ -49,7 +49,7 @@ function spawnTest() {
yield helpers.audit(options, [
{
setup: "console close",
exec: { output: true }
exec: { output: "" }
}
]);
@@ -33,18 +33,21 @@ add_task(function*() {
* Visit all the pages in the test
*/
function* navigate(usage, options) {
yield usage.start();
yield usage.start(options.chromeWindow, options.target);
ok(usage.isRunning(), "csscoverage is running");
let load1Promise = helpers.listenOnce(options.browser, "load", true);
yield helpers.navigate(PAGE_1, options);
// Wait for the test pages to auto-cycle
let ev = yield helpers.listenOnce(options.browser, "load", true);
is(ev.target.location.href, PAGE_1, "page 1 loaded");
yield load1Promise;
is(options.window.location.href, PAGE_1, "page 1 loaded");
ev = yield helpers.listenOnce(options.browser, "load", true);
is(ev.target.location.href, PAGE_3, "page 3 loaded");
// Page 2 is a frame in page 1. JS in the page navigates to page 3.
yield helpers.listenOnce(options.browser, "load", true);
is(options.window.location.href, PAGE_3, "page 3 loaded");
yield usage.stop();
@@ -10,7 +10,7 @@ function test() {
return Task.spawn(testTask).then(finish, helpers.handleError);
}
function testTask() {
function* testTask() {
let options = yield helpers.openTab("about:blank");
yield helpers.openToolbar(options);
@@ -29,7 +29,10 @@ function testTask() {
{
setup: 'jsb ' + TEST_URI,
// Should result in a new scratchpad window
exec: { }
exec: {
output: '',
error: false
}
}
]);
@@ -74,7 +74,7 @@ let tests = {
};
function test() {
return Task.spawn(function() {
return Task.spawn(function*() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
@@ -10,7 +10,7 @@ function test() {
return Task.spawn(spawnTest).then(finish, helpers.handleError);
}
function spawnTest() {
function* spawnTest() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
@@ -302,7 +302,8 @@ function spawnTest() {
args: {
searchAttributes: { value: undefined, status: 'INCOMPLETE' },
searchElements: { value: undefined, status: 'INCOMPLETE' },
root: { value: undefined },
// root: { value: undefined }, // 'root' is a node which is remote
// so we can't see the value in tests
ignoreCase: { value: false },
}
},
@@ -317,7 +318,8 @@ function spawnTest() {
args: {
searchAttributes: { value: 'foo' },
searchElements: { value: 'bar' },
root: { value: undefined },
// root: { value: undefined }, // 'root' is a node which is remote
// so we can't see the value in tests
ignoreCase: { value: false },
}
},
@@ -13,7 +13,7 @@ function test() {
return Task.spawn(spawnTest).then(finish, helpers.handleError);
}
function spawnTest() {
function* spawnTest() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
@@ -13,7 +13,7 @@ function test() {
return Task.spawn(spawnTest).then(finish, helpers.handleError);
}
function spawnTest() {
function* spawnTest() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
@@ -16,7 +16,7 @@ function test() {
return Task.spawn(spawnTest).then(finish, helpers.handleError);
}
function spawnTest() {
function* spawnTest() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
@@ -11,7 +11,7 @@ function test() {
return Task.spawn(spawnTest).then(finish, helpers.handleError);
}
function spawnTest() {
function* spawnTest() {
waitForExplicitFinish();
info("RUN TEST: non-private window");
@@ -81,11 +81,6 @@ function addTabWithToolbarRunTests(win) {
input: 'screenshot --selector img#testImage',
markup: 'VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV',
status: 'VALID',
args: {
selector: {
value: options.window.document.getElementById("testImage")
},
}
},
},
]);
@@ -16,14 +16,18 @@ function test() {
return Task.spawn(spawnTest).then(finish, helpers.handleError);
}
function spawnTest() {
function* spawnTest() {
// Setup
let options = yield helpers.openTab(TEST_URI);
require("devtools/commandline/commands-index");
let gcli = require("gcli/index");
yield gcli.load();
let settings = gcli.settings;
const { createSystem } = require("gcli/system");
const system = createSystem({ location: "server" });
const gcliInit = require("devtools/commandline/commands-index");
gcliInit.addAllItemsByModule(system);
yield system.load();
let settings = system.settings;
let hideIntroEnabled = settings.get("devtools.gcli.hideIntro");
let tabSize = settings.get("devtools.editor.tabsize");
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testAsync.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_async.js");
}
// <INJECTED SOURCE:END>
// var helpers = require('./helpers');
exports.testBasic = function(options) {
@@ -74,7 +59,6 @@ exports.testBasic = function(options) {
args: {
command: { name: 'tsslow' },
hello: {
value: undefined,
arg: '',
status: 'INCOMPLETE'
},
@@ -95,7 +79,6 @@ exports.testBasic = function(options) {
args: {
command: { name: 'tsslow' },
hello: {
value: undefined,
arg: ' S',
status: 'INCOMPLETE'
},
@@ -116,7 +99,6 @@ exports.testBasic = function(options) {
args: {
command: { name: 'tsslow' },
hello: {
value: 'Shalom',
arg: ' Shalom ',
status: 'VALID',
message: ''
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testCanon.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_canon.js");
}
// <INJECTED SOURCE:END>
// var assert = require('../testharness/assert');
// var helpers = require('./helpers');
var Commands = require('gcli/commands/commands').Commands;
@@ -219,6 +204,9 @@ exports.testAltCommands = function(options) {
{ name: 'num', type: 'number' },
{ name: 'opt', type: { name: 'selection', data: [ '1', '2', '3' ] } },
],
customProp1: 'localValue',
customProp2: true,
customProp3: 42,
exec: function(args, context) {
return context.commandName + ':' +
args.str + ':' + args.num + ':' + args.opt;
@@ -235,6 +223,24 @@ exports.testAltCommands = function(options) {
'],"isParent":false}]',
'JSON.stringify(commandSpecs)');
var customProps = [ 'customProp1', 'customProp2', 'customProp3', ];
var commandSpecs2 = altCommands.getCommandSpecs(customProps);
assert.is(JSON.stringify(commandSpecs2),
'[{' +
'"item":"command",' +
'"name":"tss",' +
'"params":[' +
'{"name":"str","type":"string"},' +
'{"name":"num","type":"number"},' +
'{"name":"opt","type":{"name":"selection","data":["1","2","3"]}}' +
'],' +
'"isParent":false,' +
'"customProp1":"localValue",' +
'"customProp2":true,' +
'"customProp3":42' +
'}]',
'JSON.stringify(commandSpecs)');
var remoter = function(args, context) {
assert.is(context.commandName, 'tss', 'commandName is tss');
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testCli1.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_cli1.js");
}
// <INJECTED SOURCE:END>
// var assert = require('../testharness/assert');
// var helpers = require('./helpers');
@@ -268,7 +253,6 @@ exports.testTsv = function(options) {
}
},
{
skipRemainingIf: options.isNoDom,
name: '|tsv option',
setup: function() {
return helpers.setInput(options, 'tsv option', 0);
@@ -15,45 +15,18 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testCli2.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_cli2.js");
}
// <INJECTED SOURCE:END>
// var helpers = require('./helpers');
var nodetype = require('gcli/types/node');
exports.setup = function(options) {
if (options.window) {
nodetype.setDocument(options.window.document);
}
};
exports.shutdown = function(options) {
nodetype.unsetDocument();
};
exports.testSingleString = function(options) {
return helpers.audit(options, [
{
@@ -376,7 +349,6 @@ exports.testSingleFloat = function(options) {
}
},
{
skipRemainingIf: options.isNoDom,
name: 'tsf x (cursor=4)',
setup: function() {
return helpers.setInput(options, 'tsf x', 4);
@@ -406,21 +378,14 @@ exports.testSingleFloat = function(options) {
};
exports.testElementWeb = function(options) {
var inputElement = options.isNoDom ?
null :
options.window.document.getElementById('gcli-input');
return helpers.audit(options, [
{
skipIf: function gcliInputElementExists() {
return inputElement == null;
},
setup: 'tse #gcli-input',
setup: 'tse #gcli-root',
check: {
input: 'tse #gcli-input',
input: 'tse #gcli-root',
hints: ' [options]',
markup: 'VVVVVVVVVVVVVVV',
cursor: 15,
markup: 'VVVVVVVVVVVVVV',
cursor: 14,
current: 'node',
status: 'VALID',
predictions: [ ],
@@ -428,8 +393,7 @@ exports.testElementWeb = function(options) {
args: {
command: { name: 'tse' },
node: {
value: inputElement,
arg: ' #gcli-input',
arg: ' #gcli-root',
status: 'VALID',
message: ''
},
@@ -444,7 +408,6 @@ exports.testElementWeb = function(options) {
exports.testElement = function(options) {
return helpers.audit(options, [
{
skipRemainingIf: options.isNoDom,
setup: 'tse',
check: {
input: 'tse',
@@ -457,7 +420,7 @@ exports.testElement = function(options) {
unassigned: [ ],
args: {
command: { name: 'tse' },
node: { value: undefined, arg: '', status: 'INCOMPLETE' },
node: { arg: '', status: 'INCOMPLETE' },
nodes: { arg: '', status: 'VALID', message: '' },
nodes2: { arg: '', status: 'VALID', message: '' },
}
@@ -605,7 +568,7 @@ exports.testNestedCommand = function(options) {
}
},
{
skipIf: options.isPhantomjs,
skipIf: options.isPhantomjs, // PhantomJS gets predictions wrong
setup: 'tsn x',
check: {
input: 'tsn x',
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testCompletion1.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_completion1.js");
}
// <INJECTED SOURCE:END>
// var helpers = require('./helpers');
exports.testActivate = function(options) {
@@ -183,7 +168,7 @@ exports.testActivate = function(options) {
}
},
{
skipIf: options.isPhantomjs,
skipIf: options.isPhantomjs, // PhantomJS gets predictions wrong
setup: 'tsg d',
check: {
hints: ' [options] -> ccc'
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testCompletion2.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_completion2.js");
}
// <INJECTED SOURCE:END>
// var helpers = require('./helpers');
exports.testLong = function(options) {
@@ -170,7 +155,6 @@ exports.testNoTab = function(options) {
}
},
{
skipIf: options.isNoDom,
name: '<TAB>',
setup: function() {
// Doing it this way avoids clearing the input buffer
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testContext.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_context.js");
}
// <INJECTED SOURCE:END>
// var helpers = require('./helpers');
exports.testBaseline = function(options) {
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testDate.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_date.js");
}
// <INJECTED SOURCE:END>
// var assert = require('../testharness/assert');
// var helpers = require('./helpers');
@@ -66,15 +51,15 @@ exports.testMaxMin = function(options) {
var date = types.createType({ name: 'date', max: max, min: min });
assert.is(date.getMax(), max, 'max setup');
var incremented = date.increment(min);
var incremented = date.nudge(min, 1);
assert.is(incremented, max, 'incremented');
};
exports.testIncrement = function(options) {
var date = options.requisition.system.types.createType('date');
return date.parseString('now').then(function(conversion) {
var plusOne = date.increment(conversion.value);
var minusOne = date.decrement(plusOne);
var plusOne = date.nudge(conversion.value, 1);
var minusOne = date.nudge(plusOne, -1);
// See comments in testParse
var gap = new Date().getTime() - minusOne.getTime();
@@ -126,7 +111,7 @@ exports.testInput = function(options) {
},
exec: {
output: [ /^Exec: tsdate/, /2001/, /1980/ ],
type: 'string',
type: 'testCommandOutput',
error: false
}
},
@@ -172,7 +157,7 @@ exports.testInput = function(options) {
},
exec: {
output: [ /^Exec: tsdate/, /2001/, /1980/ ],
type: 'string',
type: 'testCommandOutput',
error: false
}
},
@@ -213,7 +198,7 @@ exports.testInput = function(options) {
},
exec: {
output: [ /^Exec: tsdate/, new Date().getFullYear() ],
type: 'string',
type: 'testCommandOutput',
error: false
}
},
@@ -253,7 +238,7 @@ exports.testInput = function(options) {
},
exec: {
output: [ /^Exec: tsdate/, new Date().getFullYear() ],
type: 'string',
type: 'testCommandOutput',
error: false
}
}
@@ -264,7 +249,7 @@ exports.testIncrDecr = function(options) {
return helpers.audit(options, [
{
// createRequisitionAutomator doesn't fake UP/DOWN well enough
skipRemainingIf: options.isNoDom,
skipRemainingIf: options.isNode,
setup: 'tsdate 2001-01-01<UP>',
check: {
input: 'tsdate 2001-01-02',
@@ -15,54 +15,18 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testExec.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_exec.js");
}
// <INJECTED SOURCE:END>
// var assert = require('../testharness/assert');
// var helpers = require('./helpers');
var nodetype = require('gcli/types/node');
var mockBody = {
style: {}
};
var mockEmptyNodeList = {
length: 0,
item: function() { return null; }
};
var mockRootNodeList = {
length: 1,
item: function(i) { return mockBody; }
};
var mockDoc = {
querySelectorAll: function(css) {
return (css === ':root') ? mockRootNodeList : mockEmptyNodeList;
}
};
exports.testParamGroup = function(options) {
var tsg = options.requisition.system.commands.get('tsg');
@@ -121,7 +85,7 @@ exports.testWithHelpers = function(options) {
}
},
exec: {
output: 'Exec: tsv optionType=string, optionValue=10'
output: 'Exec: tsv optionType=option1 optionValue=10'
}
},
{
@@ -151,7 +115,7 @@ exports.testWithHelpers = function(options) {
}
},
exec: {
output: 'Exec: tsv optionType=number, optionValue=10'
output: 'Exec: tsv optionType=option2 optionValue=10'
}
},
// Delegated remote types can't transfer value types so we only test for
@@ -163,7 +127,7 @@ exports.testWithHelpers = function(options) {
args: { optionValue: { value: '10' } }
},
exec: {
output: 'Exec: tsv optionType=string, optionValue=10'
output: 'Exec: tsv optionType=option1 optionValue=10'
}
},
{
@@ -173,7 +137,7 @@ exports.testWithHelpers = function(options) {
args: { optionValue: { value: 10 } }
},
exec: {
output: 'Exec: tsv optionType=number, optionValue=10'
output: 'Exec: tsv optionType=option2 optionValue=10'
}
}
]);
@@ -228,7 +192,7 @@ exports.testExecText = function(options) {
}
},
exec: {
output: 'Exec: tsr text=fred bloggs'
output: 'Exec: tsr text=fred\\ bloggs'
}
},
{
@@ -253,7 +217,7 @@ exports.testExecText = function(options) {
}
},
exec: {
output: 'Exec: tsr text=fred bloggs'
output: 'Exec: tsr text=fred\\ bloggs'
}
},
{
@@ -278,7 +242,7 @@ exports.testExecText = function(options) {
}
},
exec: {
output: 'Exec: tsr text=fred bloggs'
output: 'Exec: tsr text=fred\\ bloggs'
}
}
]);
@@ -403,7 +367,6 @@ exports.testExecScript = function(options) {
args: {
command: { name: 'tsj' },
javascript: {
value: '1 + 1',
arg: ' { 1 + 1 }',
status: 'VALID',
message: ''
@@ -418,12 +381,9 @@ exports.testExecScript = function(options) {
};
exports.testExecNode = function(options) {
var origDoc = nodetype.getDocument();
nodetype.setDocument(mockDoc);
return helpers.audit(options, [
{
skipIf: options.isNoDom,
skipIf: options.isRemote,
setup: 'tse :root',
check: {
input: 'tse :root',
@@ -437,19 +397,16 @@ exports.testExecNode = function(options) {
args: {
command: { name: 'tse' },
node: {
value: mockBody,
arg: ' :root',
status: 'VALID',
message: ''
},
nodes: {
value: mockEmptyNodeList,
arg: '',
status: 'VALID',
message: ''
},
nodes2: {
value: mockEmptyNodeList,
arg: '',
status: 'VALID',
message: ''
@@ -459,8 +416,10 @@ exports.testExecNode = function(options) {
exec: {
output: /^Exec: tse/
},
post: function() {
nodetype.setDocument(origDoc);
post: function(output) {
assert.is(output.data.args.node, ':root', 'node should be :root');
assert.is(output.data.args.nodes, 'Error', 'nodes should be Error');
assert.is(output.data.args.nodes2, 'Error', 'nodes2 should be Error');
}
}
]);
@@ -552,7 +511,7 @@ exports.testExecArray = function(options) {
}
},
exec: {
output: 'Exec: tselarr num=1, arr='
output: 'Exec: tselarr num=1 arr='
}
},
{
@@ -573,7 +532,7 @@ exports.testExecArray = function(options) {
}
},
exec: {
output: 'Exec: tselarr num=1, arr=a'
output: 'Exec: tselarr num=1 arr=a'
}
},
{
@@ -594,7 +553,7 @@ exports.testExecArray = function(options) {
}
},
exec: {
output: 'Exec: tselarr num=1, arr=a,b'
output: 'Exec: tselarr num=1 arr=a b'
}
}
]);
@@ -621,7 +580,7 @@ exports.testExecMultiple = function(options) {
}
},
exec: {
output: 'Exec: tsm abc=a, txt=10, num=10'
output: 'Exec: tsm abc=a txt=10 num=10'
}
}
]);
@@ -651,9 +610,47 @@ exports.testExecDefaults = function(options) {
}
},
exec: {
output: 'Exec: tsg solo=aaa, txt1=null, bool=false, txt2=d, num=42'
output: 'Exec: tsg solo=aaa txt1= bool=false txt2=d num=42'
}
}
]);
};
exports.testNested = function(options) {
var commands = options.requisition.system.commands;
commands.add({
name: 'nestorama',
exec: function(args, context) {
return context.updateExec('tsb').then(function(tsbOutput) {
return context.updateExec('tsu 6').then(function(tsuOutput) {
return JSON.stringify({
tsb: tsbOutput.data,
tsu: tsuOutput.data
});
});
});
}
});
return helpers.audit(options, [
{
setup: 'nestorama',
exec: {
output:
'{' +
'"tsb":{' +
'"name":"tsb",' +
'"args":{"toggle":"false"}' +
'},' +
'"tsu":{' +
'"name":"tsu",' +
'"args":{"num":"6"}' +
'}' +
'}'
},
post: function() {
commands.remove('nestorama');
}
}
]);
};
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testFail.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_fail.js");
}
// <INJECTED SOURCE:END>
// var helpers = require('./helpers');
exports.testBasic = function(options) {
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testFile.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_file.js");
}
// <INJECTED SOURCE:END>
// var helpers = require('./helpers');
var local = false;
@@ -47,10 +32,7 @@ var local = false;
exports.testBasic = function(options) {
return helpers.audit(options, [
{
// These tests require us to be using node directly or to be in
// PhantomJS connected to an execute enabled node server or to be in
// firefox.
skipRemainingIf: options.isPhantomjs || options.isFirefox,
skipRemainingIf: options.isFirefox, // No file implementation in Firefox
setup: 'tsfile open /',
check: {
input: 'tsfile open /',
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testFileparser.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_fileparser.js");
}
// <INJECTED SOURCE:END>
// var assert = require('../testharness/assert');
var fileparser = require('gcli/util/fileparser');
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testFilesystem.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_filesystem.js");
}
// <INJECTED SOURCE:END>
// var assert = require('../testharness/assert');
// var helpers = require('./helpers');
var filesystem = require('gcli/util/filesystem');
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testFocus.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_focus.js");
}
// <INJECTED SOURCE:END>
// var helpers = require('./helpers');
exports.testBasic = function(options) {
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testHistory.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_history.js");
}
// <INJECTED SOURCE:END>
// var assert = require('../testharness/assert');
var History = require('gcli/ui/history').History;
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testIncomplete.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_incomplete.js");
}
// <INJECTED SOURCE:END>
// var assert = require('../testharness/assert');
// var helpers = require('./helpers');
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testInputter.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_inputter.js");
}
// <INJECTED SOURCE:END>
// var assert = require('../testharness/assert');
var KeyEvent = require('gcli/util/util').KeyEvent;
@@ -89,7 +74,7 @@ exports.testOutput = function(options) {
var ev1 = { keyCode: KeyEvent.DOM_VK_RETURN };
return terminal.handleKeyUp(ev1).then(function() {
assert.ok(latestEvent != null, 'events this test');
assert.is(latestData, 'Exec: tss ', 'last command is tss');
assert.is(latestData.name, 'tss', 'last command is tss');
assert.is(terminal.getInputState().typed,
'',
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testIntro.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_intro.js");
}
// <INJECTED SOURCE:END>
// var helpers = require('./helpers');
exports.testIntroStatus = function(options) {
@@ -67,7 +52,6 @@ exports.testIntroStatus = function(options) {
},
{
setup: 'intro',
skipIf: options.isNoDom,
check: {
typed: 'intro',
markup: 'VVVVV',
@@ -15,73 +15,55 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testJs.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_js.js");
}
// <INJECTED SOURCE:END>
// var assert = require('../testharness/assert');
// var helpers = require('./helpers');
var javascript = require('gcli/types/javascript');
var tempWindow;
exports.setup = function(options) {
if (options.isNoDom) {
if (jsTestDisallowed(options)) {
return;
}
tempWindow = javascript.getGlobalObject();
Object.defineProperty(options.window, 'donteval', {
// Check that we're not trespassing on 'donteval'
var win = options.requisition.environment.window;
Object.defineProperty(win, 'donteval', {
get: function() {
assert.ok(false, 'donteval should not be used');
console.trace();
return { cant: '', touch: '', 'this': '' };
},
enumerable: true,
configurable : true
configurable: true
});
javascript.setGlobalObject(options.window);
};
exports.shutdown = function(options) {
if (options.isNoDom) {
if (jsTestDisallowed(options)) {
return;
}
javascript.setGlobalObject(tempWindow);
tempWindow = undefined;
delete options.window.donteval;
delete options.requisition.environment.window.donteval;
};
function jsTestAllowed(options) {
return options.isRemote || options.isNoDom ||
function jsTestDisallowed(options) {
return options.isRemote || // Altering the environment (which isn't remoted)
options.isNode ||
options.requisition.system.commands.get('{') == null;
}
exports.testBasic = function(options) {
return helpers.audit(options, [
{
skipRemainingIf: jsTestAllowed,
skipRemainingIf: jsTestDisallowed,
setup: '{',
check: {
input: '{',
@@ -236,7 +218,7 @@ exports.testBasic = function(options) {
exports.testDocument = function(options) {
return helpers.audit(options, [
{
skipRemainingIf: jsTestAllowed,
skipRemainingIf: jsTestDisallowed,
setup: '{ docu',
check: {
input: '{ docu',
@@ -315,7 +297,8 @@ exports.testDocument = function(options) {
command: { name: '{' },
javascript: {
value: 'document.title',
arg: '{ document.title ',
// arg: '{ document.title ',
// Node/JSDom gets this wrong and omits the trailing space. Why?
status: 'VALID',
message: ''
}
@@ -348,14 +331,9 @@ exports.testDocument = function(options) {
};
exports.testDonteval = function(options) {
if (!options.isNoDom) {
// nodom causes an eval here, maybe that's node/v8?
assert.ok('donteval' in options.window, 'donteval exists');
}
return helpers.audit(options, [
{
skipRemainingIf: jsTestAllowed,
skipRemainingIf: true, // Commented out until we fix non-enumerable props
setup: '{ don',
check: {
input: '{ don',
@@ -476,7 +454,7 @@ exports.testDonteval = function(options) {
exports.testExec = function(options) {
return helpers.audit(options, [
{
skipRemainingIf: jsTestAllowed,
skipRemainingIf: jsTestDisallowed,
setup: '{ 1+1',
check: {
input: '{ 1+1',
@@ -15,46 +15,19 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testKeyboard1.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_keyboard1.js");
}
// <INJECTED SOURCE:END>
var javascript = require('gcli/types/javascript');
// var helpers = require('./helpers');
var tempWindow;
exports.setup = function(options) {
tempWindow = javascript.getGlobalObject();
javascript.setGlobalObject(options.window);
};
exports.shutdown = function(options) {
javascript.setGlobalObject(tempWindow);
tempWindow = undefined;
};
exports.testSimple = function(options) {
return helpers.audit(options, [
{
@@ -75,16 +48,12 @@ exports.testSimple = function(options) {
exports.testScript = function(options) {
return helpers.audit(options, [
{
skipIf: function commandJsMissing() {
return options.requisition.system.commands.get('{') == null;
},
skipRemainingIf: options.isRemote ||
options.requisition.system.commands.get('{') == null,
setup: '{ wind<TAB>',
check: { input: '{ window' }
},
{
skipIf: function commandJsMissing() {
return options.requisition.system.commands.get('{') == null;
},
setup: '{ window.docum<TAB>',
check: { input: '{ window.document' }
}
@@ -94,9 +63,8 @@ exports.testScript = function(options) {
exports.testJsdom = function(options) {
return helpers.audit(options, [
{
skipIf: function jsDomOrCommandJsMissing() {
return options.requisition.system.commands.get('{') == null;
},
skipIf: options.isRemote ||
options.requisition.system.commands.get('{') == null,
setup: '{ window.document.titl<TAB>',
check: { input: '{ window.document.title ' }
}
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testKeyboard2.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_keyboard2.js");
}
// <INJECTED SOURCE:END>
// var helpers = require('./helpers');
exports.testIncr = function(options) {
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testKeyboard3.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_keyboard3.js");
}
// <INJECTED SOURCE:END>
// var helpers = require('./helpers');
exports.testDecr = function(options) {
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testKeyboard4.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_keyboard4.js");
}
// <INJECTED SOURCE:END>
// var helpers = require('./helpers');
exports.testIncrFloat = function(options) {
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testKeyboard5.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_keyboard5.js");
}
// <INJECTED SOURCE:END>
// var helpers = require('./helpers');
exports.testCompleteDown = function(options) {
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testKeyboard6.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_keyboard6.js");
}
// <INJECTED SOURCE:END>
// var helpers = require('./helpers');
exports.testCompleteUp = function(options) {
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testMenu.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_menu.js");
}
// <INJECTED SOURCE:END>
// var helpers = require('./helpers');
exports.testOptions = function(options) {
@@ -15,49 +15,22 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testNode.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_node.js");
}
// <INJECTED SOURCE:END>
// var assert = require('../testharness/assert');
// var helpers = require('./helpers');
var nodetype = require('gcli/types/node');
exports.setup = function(options) {
if (options.window) {
nodetype.setDocument(options.window.document);
}
};
exports.shutdown = function(options) {
nodetype.unsetDocument();
};
exports.testNode = function(options) {
return helpers.audit(options, [
{
skipRemainingIf: options.isNoDom,
setup: 'tse ',
check: {
input: 'tse ',
@@ -165,11 +138,8 @@ exports.testNode = function(options) {
};
exports.testNodeDom = function(options) {
var requisition = options.requisition;
return helpers.audit(options, [
{
skipRemainingIf: options.isNoDom,
setup: 'tse :root',
check: {
input: 'tse :root',
@@ -202,10 +172,12 @@ exports.testNodeDom = function(options) {
nodes2: { status: 'VALID' }
}
},
post: function() {
assert.is(requisition.getAssignment('node').value.tagName,
'HTML',
'root id');
exec: {
},
post: function(output) {
if (!options.isRemote) {
assert.is(output.args.node.tagName, 'HTML', ':root tagName');
}
}
},
{
@@ -234,11 +206,8 @@ exports.testNodeDom = function(options) {
};
exports.testNodes = function(options) {
var requisition = options.requisition;
return helpers.audit(options, [
{
skipRemainingIf: options.isNoDom,
setup: 'tse :root --nodes *',
check: {
input: 'tse :root --nodes *',
@@ -253,10 +222,18 @@ exports.testNodes = function(options) {
nodes2: { status: 'VALID' }
}
},
post: function() {
assert.is(requisition.getAssignment('node').value.tagName,
'HTML',
'#gcli-input id');
exec: {
},
post: function(output) {
if (!options.isRemote) {
assert.is(output.args.node.tagName, 'HTML', ':root tagName');
assert.ok(output.args.nodes.length > 3, 'nodes length');
assert.is(output.args.nodes2.length, 0, 'nodes2 length');
}
assert.is(output.data.args.node, ':root', 'node data');
assert.is(output.data.args.nodes, '*', 'nodes data');
assert.is(output.data.args.nodes2, 'Error', 'nodes2 data');
}
},
{
@@ -275,10 +252,18 @@ exports.testNodes = function(options) {
nodes2: { arg: ' --nodes2 div', status: 'VALID' }
}
},
post: function() {
assert.is(requisition.getAssignment('node').value.tagName,
'HTML',
'root id');
exec: {
},
post: function(output) {
if (!options.isRemote) {
assert.is(output.args.node.tagName, 'HTML', ':root tagName');
assert.is(output.args.nodes.length, 0, 'nodes length');
assert.is(output.args.nodes2.item(0).tagName, 'DIV', 'div tagName');
}
assert.is(output.data.args.node, ':root', 'node data');
assert.is(output.data.args.nodes, 'Error', 'nodes data');
assert.is(output.data.args.nodes2, 'div', 'nodes2 data');
}
},
{
@@ -305,13 +290,6 @@ exports.testNodes = function(options) {
},
nodes2: { arg: '', status: 'VALID', message: '' }
}
},
post: function() {
/*
assert.is(requisition.getAssignment('nodes2').value.constructor.name,
'NodeList',
'#gcli-input id');
*/
}
},
{
@@ -333,16 +311,6 @@ exports.testNodes = function(options) {
nodes: { arg: '', status: 'VALID', message: '' },
nodes2: { arg: ' --nodes2 ffff', status: 'VALID', message: '' }
}
},
post: function() {
/*
assert.is(requisition.getAssignment('nodes').value.constructor.name,
'NodeList',
'#gcli-input id');
assert.is(requisition.getAssignment('nodes2').value.constructor.name,
'NodeList',
'#gcli-input id');
*/
}
},
]);
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testPref1.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_pref1.js");
}
// <INJECTED SOURCE:END>
// var helpers = require('./helpers');
exports.testPrefShowStatus = function(options) {
@@ -67,7 +52,7 @@ exports.testPrefShowStatus = function(options) {
setup: 'pref show ',
check: {
typed: 'pref show ',
hints: 'allowSet',
hints: 'eagerHelper',
markup: 'VVVVVVVVVV',
status: 'ERROR'
}
@@ -144,7 +129,7 @@ exports.testPrefSetStatus = function(options) {
setup: 'pref set ',
check: {
typed: 'pref set ',
hints: 'allowSet <value>',
hints: 'eagerHelper <value>',
markup: 'VVVVVVVVV',
status: 'ERROR'
}
@@ -159,6 +144,7 @@ exports.testPrefSetStatus = function(options) {
}
},
{
skipIf: options.isRemote,
setup: 'pref set tempTBool 4',
check: {
typed: 'pref set tempTBool 4',
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testPref2.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_pref2.js");
}
// <INJECTED SOURCE:END>
// var assert = require('../testharness/assert');
// var helpers = require('./helpers');
var mockSettings = require('./mockSettings');
@@ -55,10 +40,6 @@ exports.testPrefExec = function(options) {
return;
}
var allowSet = settings.getSetting('allowSet');
var initialAllowSet = allowSet.value;
allowSet.value = false;
assert.is(mockSettings.tempNumber.value, 42, 'set to 42');
return helpers.audit(options, [
@@ -73,7 +54,6 @@ exports.testPrefExec = function(options) {
}
},
{
skipRemainingIf: options.isNoDom,
setup: 'pref set tempNumber 4',
check: {
input: 'pref set tempNumber 4',
@@ -98,16 +78,6 @@ exports.testPrefExec = function(options) {
}
}
},
exec: {
output: [ /void your warranty/, /I promise/ ]
},
post: function() {
assert.is(mockSettings.tempNumber.value, 42, 'still set to 42');
allowSet.value = true;
}
},
{
setup: 'pref set tempNumber 4',
exec: {
output: ''
},
@@ -128,8 +98,6 @@ exports.testPrefExec = function(options) {
},
post: function() {
assert.is(mockSettings.tempNumber.value, 42, 'reset to 42');
allowSet.value = initialAllowSet;
}
},
{
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testRemoteWs.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_remotews.js");
}
// <INJECTED SOURCE:END>
// var assert = require('../testharness/assert');
// var helpers = require('./helpers');
@@ -83,8 +68,8 @@ exports.testRemoteWebsocket = function(options) {
check: {
args: {
prefix: {
value: function(connection) {
assert.is(connection.prefix, 'remote', 'disconnecting remote');
value: function(front) {
assert.is(front.prefix, 'remote', 'disconnecting remote');
}
}
}
@@ -112,8 +97,8 @@ exports.testRemoteWebsocket = function(options) {
check: {
args: {
prefix: {
value: function(connection) {
assert.is(connection.prefix, 'remote', 'disconnecting remote');
value: function(front) {
assert.is(front.prefix, 'remote', 'disconnecting remote');
}
}
}
@@ -466,8 +451,8 @@ exports.testRemoteWebsocket = function(options) {
unassigned: [ ],
args: {
prefix: {
value: function(connection) {
assert.is(connection.prefix, 'remote', 'disconnecting remote');
value: function(front) {
assert.is(front.prefix, 'remote', 'disconnecting remote');
},
arg: ' remote',
status: 'VALID',
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testRemoteXhr.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_remotexhr.js");
}
// <INJECTED SOURCE:END>
// var assert = require('../testharness/assert');
// var helpers = require('./helpers');
@@ -83,8 +68,8 @@ exports.testRemoteXhr = function(options) {
check: {
args: {
prefix: {
value: function(connection) {
assert.is(connection.prefix, 'remote', 'disconnecting remote');
value: function(front) {
assert.is(front.prefix, 'remote', 'disconnecting remote');
}
}
}
@@ -112,8 +97,8 @@ exports.testRemoteXhr = function(options) {
check: {
args: {
prefix: {
value: function(connection) {
assert.is(connection.prefix, 'remote', 'disconnecting remote');
value: function(front) {
assert.is(front.prefix, 'remote', 'disconnecting remote');
}
}
}
@@ -466,8 +451,8 @@ exports.testRemoteXhr = function(options) {
unassigned: [ ],
args: {
prefix: {
value: function(connection) {
assert.is(connection.prefix, 'remote', 'disconnecting remote');
value: function(front) {
assert.is(front.prefix, 'remote', 'disconnecting remote');
},
arg: ' remote',
status: 'VALID',
@@ -15,31 +15,17 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testResource.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_resource.js");
}
// <INJECTED SOURCE:END>
// var helpers = require('./helpers');
// var assert = require('../testharness/assert');
var Promise = require('gcli/util/promise').Promise;
@@ -47,84 +33,85 @@ var util = require('gcli/util/util');
var resource = require('gcli/types/resource');
var Status = require('gcli/types/types').Status;
var tempDocument;
exports.setup = function(options) {
tempDocument = resource.getDocument();
if (options.window) {
resource.setDocument(options.window.document);
}
};
exports.shutdown = function(options) {
resource.setDocument(tempDocument);
tempDocument = undefined;
exports.testCommand = function(options) {
return helpers.audit(options, [
{
setup: 'tsres ',
check: {
predictionsContains: [ 'inline-css' ],
}
}
]);
};
exports.testAllPredictions1 = function(options) {
if (options.isFirefox || options.isNoDom) {
assert.log('Skipping checks due to firefox document.stylsheets support.');
if (options.isRemote) {
assert.log('Can\'t directly test remote types locally.');
return;
}
var context = options.requisition.conversionContext;
var resource = options.requisition.system.types.createType('resource');
return resource.getLookup().then(function(opts) {
return resource.getLookup(context).then(function(opts) {
assert.ok(opts.length > 1, 'have all resources');
return util.promiseEach(opts, function(prediction) {
return checkPrediction(resource, prediction);
return checkPrediction(resource, prediction, context);
});
});
};
exports.testScriptPredictions = function(options) {
if (options.isFirefox || options.isNoDom) {
assert.log('Skipping checks due to firefox document.stylsheets support.');
if (options.isRemote || options.isNode) {
assert.log('Can\'t directly test remote types locally.');
return;
}
var context = options.requisition.conversionContext;
var types = options.requisition.system.types;
var resource = types.createType({ name: 'resource', include: 'text/javascript' });
return resource.getLookup().then(function(opts) {
return resource.getLookup(context).then(function(opts) {
assert.ok(opts.length > 1, 'have js resources');
return util.promiseEach(opts, function(prediction) {
return checkPrediction(resource, prediction);
return checkPrediction(resource, prediction, context);
});
});
};
exports.testStylePredictions = function(options) {
if (options.isFirefox || options.isNoDom) {
assert.log('Skipping checks due to firefox document.stylsheets support.');
if (options.isRemote) {
assert.log('Can\'t directly test remote types locally.');
return;
}
var context = options.requisition.conversionContext;
var types = options.requisition.system.types;
var resource = types.createType({ name: 'resource', include: 'text/css' });
return resource.getLookup().then(function(opts) {
return resource.getLookup(context).then(function(opts) {
assert.ok(opts.length >= 1, 'have css resources');
return util.promiseEach(opts, function(prediction) {
return checkPrediction(resource, prediction);
return checkPrediction(resource, prediction, context);
});
});
};
exports.testAllPredictions2 = function(options) {
if (options.isNoDom) {
assert.log('Skipping checks due to nodom document.stylsheets support.');
if (options.isRemote) {
assert.log('Can\'t directly test remote types locally.');
return;
}
var context = options.requisition.conversionContext;
var types = options.requisition.system.types;
var scriptRes = types.createType({ name: 'resource', include: 'text/javascript' });
return scriptRes.getLookup().then(function(scriptOptions) {
return scriptRes.getLookup(context).then(function(scriptOptions) {
var styleRes = types.createType({ name: 'resource', include: 'text/css' });
return styleRes.getLookup().then(function(styleOptions) {
return styleRes.getLookup(context).then(function(styleOptions) {
var allRes = types.createType({ name: 'resource' });
return allRes.getLookup().then(function(allOptions) {
return allRes.getLookup(context).then(function(allOptions) {
assert.is(scriptOptions.length + styleOptions.length,
allOptions.length,
'split');
@@ -134,27 +121,26 @@ exports.testAllPredictions2 = function(options) {
};
exports.testAllPredictions3 = function(options) {
if (options.isNoDom) {
assert.log('Skipping checks due to nodom document.stylsheets support.');
if (options.isRemote) {
assert.log('Can\'t directly test remote types locally.');
return;
}
var context = options.requisition.conversionContext;
var types = options.requisition.system.types;
var res1 = types.createType({ name: 'resource' });
return res1.getLookup().then(function(options1) {
return res1.getLookup(context).then(function(options1) {
var res2 = types.createType('resource');
return res2.getLookup().then(function(options2) {
return res2.getLookup(context).then(function(options2) {
assert.is(options1.length, options2.length, 'type spec');
});
});
};
function checkPrediction(res, prediction) {
function checkPrediction(res, prediction, context) {
var name = prediction.name;
var value = prediction.value;
// resources don't need context so cheat and pass in null
var context = null;
return res.parseString(name, context).then(function(conversion) {
assert.is(conversion.getStatus(), Status.VALID, 'status VALID for ' + name);
assert.is(conversion.value, value, 'value for ' + name);
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testShort.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_short.js");
}
// <INJECTED SOURCE:END>
// var helpers = require('./helpers');
exports.testBasic = function(options) {
@@ -14,31 +14,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testSpell.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_spell.js");
}
// <INJECTED SOURCE:END>
// var assert = require('../testharness/assert');
var spell = require('gcli/util/spell');
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testSplit.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_split.js");
}
// <INJECTED SOURCE:END>
// var assert = require('../testharness/assert');
var cli = require('gcli/cli');
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testString.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_string.js");
}
// <INJECTED SOURCE:END>
// var helpers = require('./helpers');
exports.testNewLine = function(options) {
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testTokenize.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_tokenize.js");
}
// <INJECTED SOURCE:END>
// var assert = require('../testharness/assert');
var cli = require('gcli/cli');
@@ -15,40 +15,20 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testTooltip.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_tooltip.js");
}
// <INJECTED SOURCE:END>
// var assert = require('../testharness/assert');
// var helpers = require('./helpers');
exports.testActivate = function(options) {
if (!options.display) {
assert.log('No display. Skipping activate tests');
return;
}
return helpers.audit(options, [
{
setup: ' ',
@@ -15,49 +15,25 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testTypes.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_types.js");
}
// <INJECTED SOURCE:END>
// var assert = require('../testharness/assert');
var util = require('gcli/util/util');
var Promise = require('gcli/util/promise').Promise;
var nodetype = require('gcli/types/node');
exports.setup = function(options) {
if (options.window) {
nodetype.setDocument(options.window.document);
}
};
exports.shutdown = function(options) {
nodetype.unsetDocument();
};
function forEachType(options, typeSpec, callback) {
function forEachType(options, templateTypeSpec, callback) {
var types = options.requisition.system.types;
return util.promiseEach(types.getTypeNames(), function(name) {
var typeSpec = {};
util.copyProperties(templateTypeSpec, typeSpec);
typeSpec.name = name;
typeSpec.requisition = options.requisition;
@@ -79,29 +55,19 @@ function forEachType(options, typeSpec, callback) {
else if (name === 'union') {
typeSpec.alternatives = [{ name: 'string' }];
}
else if (options.isRemote) {
if (name === 'node' || name === 'nodelist') {
return;
}
}
var type = types.createType(typeSpec);
var reply = callback(type);
return Promise.resolve(reply).then(function(value) {
// Clean up
delete typeSpec.name;
delete typeSpec.requisition;
delete typeSpec.data;
delete typeSpec.delegateType;
delete typeSpec.subtype;
delete typeSpec.alternatives;
return value;
});
return Promise.resolve(reply);
});
}
exports.testDefault = function(options) {
if (options.isNoDom) {
assert.log('Skipping tests due to issues with resource type.');
return;
}
return forEachType(options, {}, function(type) {
var context = options.requisition.executionContext;
var blank = type.getBlank(context).value;
@@ -15,31 +15,16 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testUnion.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_union.js");
}
// <INJECTED SOURCE:END>
// var assert = require('../testharness/assert');
// var helpers = require('./helpers');
@@ -126,7 +111,7 @@ exports.testDefault = function(options) {
}
},
{
skipIf: options.isPhantomjs, // Phantom goes weird with predictions
skipIf: options.isPhantomjs, // PhantomJS gets predictions wrong
setup: 'unionc1 5',
check: {
input: 'unionc1 5',
@@ -160,7 +145,7 @@ exports.testDefault = function(options) {
}
},
{
skipRemainingIf: options.isPhantomjs,
skipIf: options.isPhantomjs, // PhantomJS URL type is broken
setup: 'unionc2 on',
check: {
input: 'unionc2 on',
@@ -15,38 +15,23 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var exports = {};
var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testUrl.js</p>";
const exports = {};
function test() {
return Task.spawn(function() {
let options = yield helpers.openTab(TEST_URI);
yield helpers.openToolbar(options);
gcli.addItems(mockCommands.items);
yield helpers.runTests(options, exports);
gcli.removeItems(mockCommands.items);
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
helpers.runTestModule(exports, "browser_gcli_url.js");
}
// <INJECTED SOURCE:END>
// var assert = require('../testharness/assert');
// var helpers = require('./helpers');
exports.testDefault = function(options) {
return helpers.audit(options, [
{
skipRemainingIf: options.isPhantomjs,
skipRemainingIf: options.isPhantomjs, // PhantomJS URL type is broken
setup: 'urlc',
check: {
input: 'urlc',
+126 -41
View File
@@ -18,7 +18,7 @@
// A copy of this code exists in firefox mochitests. They should be kept
// in sync. Hence the exports synonym for non AMD contexts.
var { helpers, gcli, assert } = (function() {
var { helpers, assert } = (function() {
var helpers = {};
@@ -30,23 +30,24 @@ var util = require('gcli/util/util');
var Promise = require('gcli/util/promise').Promise;
var cli = require('gcli/cli');
var KeyEvent = require('gcli/util/util').KeyEvent;
var gcli = require('gcli/index');
const { GcliFront } = require("devtools/server/actors/gcli");
/**
* See notes in helpers.checkOptions()
*/
var createFFDisplayAutomator = function(display) {
var createDeveloperToolbarAutomator = function(toolbar) {
var automator = {
setInput: function(typed) {
return display.inputter.setInput(typed);
return toolbar.inputter.setInput(typed);
},
setCursor: function(cursor) {
return display.inputter.setCursor(cursor);
return toolbar.inputter.setCursor(cursor);
},
focus: function() {
return display.inputter.focus();
return toolbar.inputter.focus();
},
fakeKey: function(keyCode) {
@@ -56,36 +57,36 @@ var createFFDisplayAutomator = function(display) {
timeStamp: new Date().getTime()
};
display.inputter.onKeyDown(fakeEvent);
toolbar.inputter.onKeyDown(fakeEvent);
if (keyCode === KeyEvent.DOM_VK_BACK_SPACE) {
var input = display.inputter.element;
var input = toolbar.inputter.element;
input.value = input.value.slice(0, -1);
}
return display.inputter.handleKeyUp(fakeEvent);
return toolbar.inputter.handleKeyUp(fakeEvent);
},
getInputState: function() {
return display.inputter.getInputState();
return toolbar.inputter.getInputState();
},
getCompleterTemplateData: function() {
return display.completer._getCompleterTemplateData();
return toolbar.completer._getCompleterTemplateData();
},
getErrorMessage: function() {
return display.tooltip.errorEle.textContent;
return toolbar.tooltip.errorEle.textContent;
}
};
Object.defineProperty(automator, 'focusManager', {
get: function() { return display.focusManager; },
get: function() { return toolbar.focusManager; },
enumerable: true
});
Object.defineProperty(automator, 'field', {
get: function() { return display.tooltip.field; },
get: function() { return toolbar.tooltip.field; },
enumerable: true
});
@@ -223,9 +224,9 @@ helpers.openToolbar = function(options) {
options.chromeWindow = options.chromeWindow || window;
return options.chromeWindow.DeveloperToolbar.show(true).then(function() {
var display = options.chromeWindow.DeveloperToolbar.display;
options.automator = createFFDisplayAutomator(display);
options.requisition = display.requisition;
var toolbar = options.chromeWindow.DeveloperToolbar;
options.automator = createDeveloperToolbarAutomator(toolbar);
options.requisition = toolbar.requisition;
return options;
});
};
@@ -331,17 +332,17 @@ helpers.promiseify = function(functionWithLastParamCallback, scope) {
* Warning: For use with Firefox Mochitests only.
*
* As addTab, but that also opens the developer toolbar. In addition a new
* 'automator' property is added to the options object with the display from GCLI
* in the developer toolbar
* 'automator' property is added to the options object which uses the
* developer toolbar
*/
helpers.addTabWithToolbar = function(url, callback, options) {
return helpers.addTab(url, function(innerOptions) {
var win = innerOptions.chromeWindow;
return win.DeveloperToolbar.show(true).then(function() {
var display = win.DeveloperToolbar.display;
innerOptions.automator = createFFDisplayAutomator(display);
innerOptions.requisition = display.requisition;
var toolbar = win.DeveloperToolbar;
innerOptions.automator = createDeveloperToolbarAutomator(toolbar);
innerOptions.requisition = toolbar.requisition;
var reply = callback.call(null, innerOptions);
@@ -376,7 +377,7 @@ helpers.runTests = function(options, tests) {
var recover = function(error) {
ok(false, error);
console.error(error);
console.error(error, error.stack);
};
info("SETUP");
@@ -410,6 +411,87 @@ helpers.runTests = function(options, tests) {
}, recover);
};
const MOCK_COMMANDS_URI = "chrome://mochitests/content/browser/toolkit/devtools/commandline/test/mockCommands.js";
const defer = function() {
const deferred = { };
deferred.promise = new Promise(function(resolve, reject) {
deferred.resolve = resolve;
deferred.reject = reject;
});
return deferred;
};
/**
* This does several actions associated with running a GCLI test in mochitest
* 1. Create a new tab containing basic markup for GCLI tests
* 2. Open the developer toolbar
* 3. Register the mock commands with the server process
* 4. Wait for the proxy commands to be auto-regitstered with the client
* 5. Register the mock converters with the client process
* 6. Run all the tests
* 7. Tear down all the setup
*/
helpers.runTestModule = function(exports, name) {
return Task.spawn(function*() {
const uri = "data:text/html;charset=utf-8," +
"<style>div{color:red;}</style>" +
"<div id='gcli-root'>" + name + "</div>";
const options = yield helpers.openTab(uri);
options.isRemote = true;
yield helpers.openToolbar(options);
const system = options.requisition.system;
// Register a one time listener with the local set of commands
const addedDeferred = defer();
const removedDeferred = defer();
let state = 'preAdd'; // Then 'postAdd' then 'postRemove'
system.commands.onCommandsChange.add(function(ev) {
if (system.commands.get('tsslow') != null) {
if (state === 'preAdd') {
addedDeferred.resolve();
state = 'postAdd';
}
}
else {
if (state === 'postAdd') {
removedDeferred.resolve();
state = 'postRemove';
}
}
});
// Send a message to add the commands to the content process
const front = yield GcliFront.create(options.target);
yield front._testOnly_addItemsByModule(MOCK_COMMANDS_URI);
// This will cause the local set of commands to be updated with the
// command proxies, wait for that to complete.
yield addedDeferred.promise;
// Now we need to add the converters to the local GCLI
const converters = mockCommands.items.filter(item => item.item === 'converter');
system.addItems(converters);
// Next run the tests
yield helpers.runTests(options, exports);
// Finally undo the mock commands and converters
system.removeItems(converters);
const removePromise = system.commands.onCommandsChange.once();
yield front._testOnly_removeItemsByModule(MOCK_COMMANDS_URI);
yield removedDeferred.promise;
// And close everything down
yield helpers.closeToolbar(options);
yield helpers.closeTab(options);
}).then(finish, helpers.handleError);
};
///////////////////////////////////////////////////////////////////////////////
/**
@@ -759,15 +841,15 @@ helpers._check = function(options, name, checks) {
var outstanding = [];
var suffix = name ? ' (for \'' + name + '\')' : '';
if (!options.isNoDom && 'input' in checks) {
if (!options.isNode && 'input' in checks) {
assert.is(helpers._actual.input(options), checks.input, 'input' + suffix);
}
if (!options.isNoDom && 'cursor' in checks) {
if (!options.isNode && 'cursor' in checks) {
assert.is(helpers._actual.cursor(options), checks.cursor, 'cursor' + suffix);
}
if (!options.isNoDom && 'current' in checks) {
if (!options.isNode && 'current' in checks) {
assert.is(helpers._actual.current(options), checks.current, 'current' + suffix);
}
@@ -775,18 +857,18 @@ helpers._check = function(options, name, checks) {
assert.is(helpers._actual.status(options), checks.status, 'status' + suffix);
}
if (!options.isNoDom && 'markup' in checks) {
if (!options.isNode && 'markup' in checks) {
assert.is(helpers._actual.markup(options), checks.markup, 'markup' + suffix);
}
if (!options.isNoDom && 'hints' in checks) {
if (!options.isNode && 'hints' in checks) {
var hintCheck = function(actualHints) {
assert.is(actualHints, checks.hints, 'hints' + suffix);
};
outstanding.push(helpers._actual.hints(options).then(hintCheck));
}
if (!options.isNoDom && 'predictions' in checks) {
if (!options.isNode && 'predictions' in checks) {
var predictionsCheck = function(actualPredictions) {
helpers.arrayIs(actualPredictions,
checks.predictions,
@@ -795,12 +877,16 @@ helpers._check = function(options, name, checks) {
outstanding.push(helpers._actual.predictions(options).then(predictionsCheck));
}
if (!options.isNoDom && 'predictionsContains' in checks) {
if (!options.isNode && 'predictionsContains' in checks) {
var containsCheck = function(actualPredictions) {
checks.predictionsContains.forEach(function(prediction) {
var index = actualPredictions.indexOf(prediction);
assert.ok(index !== -1,
'predictionsContains:' + prediction + suffix);
if (index === -1) {
log('Actual predictions (' + actualPredictions.length + '): ' +
actualPredictions.join(', '));
}
});
};
outstanding.push(helpers._actual.predictions(options).then(containsCheck));
@@ -813,26 +899,26 @@ helpers._check = function(options, name, checks) {
}
/* TODO: Fix this
if (!options.isNoDom && 'tooltipState' in checks) {
if (!options.isNode && 'tooltipState' in checks) {
assert.is(helpers._actual.tooltipState(options),
checks.tooltipState,
'tooltipState' + suffix);
}
*/
if (!options.isNoDom && 'outputState' in checks) {
if (!options.isNode && 'outputState' in checks) {
assert.is(helpers._actual.outputState(options),
checks.outputState,
'outputState' + suffix);
}
if (!options.isNoDom && 'options' in checks) {
if (!options.isNode && 'options' in checks) {
helpers.arrayIs(helpers._actual.options(options),
checks.options,
'options' + suffix);
}
if (!options.isNoDom && 'error' in checks) {
if (!options.isNode && 'error' in checks) {
assert.is(helpers._actual.message(options), checks.error, 'error' + suffix);
}
@@ -894,7 +980,7 @@ helpers._check = function(options, name, checks) {
'arg.' + paramName + '.status' + suffix);
}
if (!options.isNoDom && 'message' in check) {
if (!options.isNode && 'message' in check) {
if (typeof check.message.test === 'function') {
assert.ok(check.message.test(assignment.message),
'arg.' + paramName + '.message' + suffix);
@@ -952,12 +1038,12 @@ helpers._exec = function(options, name, expected) {
var context = requisition.conversionContext;
var convertPromise;
if (options.isNoDom) {
if (options.isNode) {
convertPromise = output.convert('string', context);
}
else {
convertPromise = output.convert('dom', context).then(function(node) {
return node.textContent.trim();
return (node == null) ? '' : node.textContent.trim();
});
}
@@ -1171,9 +1257,8 @@ helpers.audit = function(options, audits) {
'';
assert.log('Skipped ' + name + ' ' + skipReason);
// Tests need at least one pass, fail or todo. Let's create a dummy pass
// in case there are none.
ok(true, "Each test requires at least one pass, fail or todo so here is a pass.");
// Tests need at least one pass, fail or todo. Create a dummy pass
assert.ok(true, 'Each test requires at least one pass, fail or todo');
return Promise.resolve(undefined);
}
@@ -1270,5 +1355,5 @@ function log(message) {
}
}
return { helpers: helpers, gcli: gcli, assert: assert };
return { helpers: helpers, assert: assert };
})();
@@ -15,16 +15,21 @@
*/
'use strict';
// <INJECTED SOURCE:START>
// THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT
// DO NOT EDIT IT DIRECTLY
// <INJECTED SOURCE:END>
// PLEASE TALK TO SOMEONE IN DEVELOPER TOOLS BEFORE EDITING IT
var Promise = require('gcli/util/promise').Promise;
var mockCommands = {};
var mockCommands;
if (typeof exports !== 'undefined') {
// If we're being loaded via require();
mockCommands = exports;
}
else {
// If we're being loaded via loadScript in mochitest
mockCommands = {};
}
// We use an alias for exports here because this module is used in Firefox
// mochitests where we don't have define/require
@@ -41,32 +46,70 @@ mockCommands.shutdown = function(requisition) {
};
function createExec(name) {
return function(args, executionContext) {
var argsOut = Object.keys(args).map(function(key) {
return key + '=' + args[key];
}).join(', ');
return 'Exec: ' + name + ' ' + argsOut;
return function(args, context) {
var promises = [];
Object.keys(args).map(function(argName) {
var value = args[argName];
var type = this.getParameterByName(argName).type;
var promise = Promise.resolve(type.stringify(value, context));
promises.push(promise.then(function(str) {
return { name: argName, value: str };
}.bind(this)));
}.bind(this));
return Promise.all(promises).then(function(data) {
var argValues = {};
data.forEach(function(entry) { argValues[entry.name] = entry.value; });
return context.typedData('testCommandOutput', {
name: name,
args: argValues
});
}.bind(this));
};
}
mockCommands.items = [
{
item: 'converter',
from: 'json',
to: 'string',
exec: function(json, context) {
return JSON.stringify(json, null, ' ');
from: 'testCommandOutput',
to: 'dom',
exec: function(testCommandOutput, context) {
var view = context.createView({
data: testCommandOutput,
html: '' +
'<table>' +
'<thead>' +
'<tr>' +
'<th colspan="3">Exec: ${name}</th>' +
'</tr>' +
'</thead>' +
'<tbody>' +
'<tr foreach="key in ${args}">' +
'<td> ${key}</td>' +
'<td>=</td>' +
'<td>${args[key]}</td>' +
'</tr>' +
'</tbody>' +
'</table>',
options: {
allowEval: true
}
});
return view.toDom(context.document);
}
},
{
item: 'converter',
from: 'json',
to: 'view',
exec: function(json, context) {
var html = JSON.stringify(json, null, '&#160;').replace(/\n/g, '<br/>');
return {
html: '<pre>' + html + '</pre>'
};
from: 'testCommandOutput',
to: 'string',
exec: function(testCommandOutput, context) {
var argsOut = Object.keys(testCommandOutput.args).map(function(key) {
return key + '=' + testCommandOutput.args[key];
}).join(' ');
return 'Exec: ' + testCommandOutput.name + ' ' + argsOut;
}
},
{
@@ -508,7 +551,7 @@ mockCommands.items = [
exec: function(args, context) {
if (args.method === 'reject') {
return new Promise(function(resolve, reject) {
setTimeout(function() {
context.environment.window.setTimeout(function() {
reject('rejected promise');
}, 10);
});
@@ -516,7 +559,7 @@ mockCommands.items = [
if (args.method === 'rejecttyped') {
return new Promise(function(resolve, reject) {
setTimeout(function() {
context.environment.window.setTimeout(function() {
reject(context.typedData('number', 54));
}, 10);
});
@@ -524,7 +567,7 @@ mockCommands.items = [
if (args.method === 'throwinpromise') {
return new Promise(function(resolve, reject) {
setTimeout(function() {
context.environment.window.setTimeout(function() {
resolve('should be lost');
}, 10);
}).then(function() {
@@ -655,7 +698,7 @@ mockCommands.items = [
name: 'selection',
data: function(context) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
context.environment.window.setTimeout(function() {
resolve([
'Shalom', 'Namasté', 'Hallo', 'Dydd-da',
'Chào', 'Hej', 'Saluton', 'Sawubona'
@@ -738,5 +781,16 @@ mockCommands.items = [
exec: function(args, context) {
return args;
}
},
{
item: 'command',
name: 'tsres',
params: [
{
name: 'resource',
type: 'resource'
}
],
exec: createExec('tsres'),
}
];
+65 -39
View File
@@ -5,7 +5,7 @@
"use strict";
const { Cc, Ci, Cu } = require("chrome");
const gcli = require("gcli/index");
const l10n = require("gcli/l10n");
loader.lazyImporter(this, "gDevTools", "resource://gre/modules/devtools/gDevTools.jsm");
@@ -67,8 +67,8 @@ function getAllSources(dbg) {
*/
exports.items.push({
name: "break",
description: gcli.lookup("breakDesc"),
manual: gcli.lookup("breakManual")
description: l10n.lookup("breakDesc"),
manual: l10n.lookup("breakManual")
});
/**
@@ -76,7 +76,9 @@ exports.items.push({
*/
exports.items.push({
name: "break list",
description: gcli.lookup("breaklistDesc"),
item: "command",
runAt: "client",
description: l10n.lookup("breaklistDesc"),
returnType: "breakpoints",
exec: function(args, context) {
let dbg = getPanel(context, "jsdebugger", { ensureOpened: true });
@@ -102,7 +104,7 @@ exports.items.push({
} else {
return context.createView({
html: "<p>${message}</p>",
data: { message: gcli.lookup("breaklistNone") }
data: { message: l10n.lookup("breaklistNone") }
});
}
}
@@ -126,7 +128,7 @@ var breakListHtml = "" +
" data-command='break del ${breakpoint.label}'" +
" onclick='${onclick}'" +
" ondblclick='${ondblclick}'>" +
" " + gcli.lookup("breaklistOutRemove") + "</span>" +
" " + l10n.lookup("breaklistOutRemove") + "</span>" +
" </td>" +
" </tr>" +
" </tbody>" +
@@ -141,16 +143,18 @@ var MAX_LABEL_LENGTH = 20;
*/
exports.items.push({
name: "break add",
description: gcli.lookup("breakaddDesc"),
manual: gcli.lookup("breakaddManual")
description: l10n.lookup("breakaddDesc"),
manual: l10n.lookup("breakaddManual")
});
/**
* 'break add line' command
*/
exports.items.push({
item: "command",
runAt: "client",
name: "break add line",
description: gcli.lookup("breakaddlineDesc"),
description: l10n.lookup("breakaddlineDesc"),
params: [
{
name: "file",
@@ -160,19 +164,19 @@ exports.items.push({
return getAllSources(getPanel(context, "jsdebugger"));
}
},
description: gcli.lookup("breakaddlineFileDesc")
description: l10n.lookup("breakaddlineFileDesc")
},
{
name: "line",
type: { name: "number", min: 1, step: 10 },
description: gcli.lookup("breakaddlineLineDesc")
description: l10n.lookup("breakaddlineLineDesc")
}
],
returnType: "string",
exec: function(args, context) {
let dbg = getPanel(context, "jsdebugger");
if (!dbg) {
return gcli.lookup("debuggerStopped");
return l10n.lookup("debuggerStopped");
}
let deferred = context.defer();
@@ -182,9 +186,9 @@ exports.items.push({
let position = { actor: item.value, line: args.line };
dbg.addBreakpoint(position).then(() => {
deferred.resolve(gcli.lookup("breakaddAdded"));
deferred.resolve(l10n.lookup("breakaddAdded"));
}, aError => {
deferred.resolve(gcli.lookupFormat("breakaddFailed", [aError]));
deferred.resolve(l10n.lookupFormat("breakaddFailed", [aError]));
});
return deferred.promise;
@@ -195,8 +199,10 @@ exports.items.push({
* 'break del' command
*/
exports.items.push({
item: "command",
runAt: "client",
name: "break del",
description: gcli.lookup("breakdelDesc"),
description: l10n.lookup("breakdelDesc"),
params: [
{
name: "breakpoint",
@@ -214,14 +220,14 @@ exports.items.push({
}));
}
},
description: gcli.lookup("breakdelBreakidDesc")
description: l10n.lookup("breakdelBreakidDesc")
}
],
returnType: "string",
exec: function(args, context) {
let dbg = getPanel(context, "jsdebugger");
if (!dbg) {
return gcli.lookup("debuggerStopped");
return l10n.lookup("debuggerStopped");
}
let source = dbg._view.Sources.getItemForAttachment(a => {
@@ -233,9 +239,9 @@ exports.items.push({
line: args.breakpoint.lineNumber };
dbg.removeBreakpoint(position).then(() => {
deferred.resolve(gcli.lookup("breakdelRemoved"));
deferred.resolve(l10n.lookup("breakdelRemoved"));
}, () => {
deferred.resolve(gcli.lookup("breakNotFound"));
deferred.resolve(l10n.lookup("breakNotFound"));
});
return deferred.promise;
@@ -247,16 +253,18 @@ exports.items.push({
*/
exports.items.push({
name: "dbg",
description: gcli.lookup("dbgDesc"),
manual: gcli.lookup("dbgManual")
description: l10n.lookup("dbgDesc"),
manual: l10n.lookup("dbgManual")
});
/**
* 'dbg open' command
*/
exports.items.push({
item: "command",
runAt: "client",
name: "dbg open",
description: gcli.lookup("dbgOpen"),
description: l10n.lookup("dbgOpen"),
params: [],
exec: function(args, context) {
let target = context.environment.target;
@@ -268,8 +276,10 @@ exports.items.push({
* 'dbg close' command
*/
exports.items.push({
item: "command",
runAt: "client",
name: "dbg close",
description: gcli.lookup("dbgClose"),
description: l10n.lookup("dbgClose"),
params: [],
exec: function(args, context) {
if (!getPanel(context, "jsdebugger")) {
@@ -284,13 +294,15 @@ exports.items.push({
* 'dbg interrupt' command
*/
exports.items.push({
item: "command",
runAt: "client",
name: "dbg interrupt",
description: gcli.lookup("dbgInterrupt"),
description: l10n.lookup("dbgInterrupt"),
params: [],
exec: function(args, context) {
let dbg = getPanel(context, "jsdebugger");
if (!dbg) {
return gcli.lookup("debuggerStopped");
return l10n.lookup("debuggerStopped");
}
let controller = dbg._controller;
@@ -305,13 +317,15 @@ exports.items.push({
* 'dbg continue' command
*/
exports.items.push({
item: "command",
runAt: "client",
name: "dbg continue",
description: gcli.lookup("dbgContinue"),
description: l10n.lookup("dbgContinue"),
params: [],
exec: function(args, context) {
let dbg = getPanel(context, "jsdebugger");
if (!dbg) {
return gcli.lookup("debuggerStopped");
return l10n.lookup("debuggerStopped");
}
let controller = dbg._controller;
@@ -326,22 +340,26 @@ exports.items.push({
* 'dbg step' command
*/
exports.items.push({
item: "command",
runAt: "client",
name: "dbg step",
description: gcli.lookup("dbgStepDesc"),
manual: gcli.lookup("dbgStepManual")
description: l10n.lookup("dbgStepDesc"),
manual: l10n.lookup("dbgStepManual")
});
/**
* 'dbg step over' command
*/
exports.items.push({
item: "command",
runAt: "client",
name: "dbg step over",
description: gcli.lookup("dbgStepOverDesc"),
description: l10n.lookup("dbgStepOverDesc"),
params: [],
exec: function(args, context) {
let dbg = getPanel(context, "jsdebugger");
if (!dbg) {
return gcli.lookup("debuggerStopped");
return l10n.lookup("debuggerStopped");
}
let controller = dbg._controller;
@@ -356,13 +374,15 @@ exports.items.push({
* 'dbg step in' command
*/
exports.items.push({
item: "command",
runAt: "client",
name: 'dbg step in',
description: gcli.lookup("dbgStepInDesc"),
description: l10n.lookup("dbgStepInDesc"),
params: [],
exec: function(args, context) {
let dbg = getPanel(context, "jsdebugger");
if (!dbg) {
return gcli.lookup("debuggerStopped");
return l10n.lookup("debuggerStopped");
}
let controller = dbg._controller;
@@ -377,13 +397,15 @@ exports.items.push({
* 'dbg step over' command
*/
exports.items.push({
item: "command",
runAt: "client",
name: 'dbg step out',
description: gcli.lookup("dbgStepOutDesc"),
description: l10n.lookup("dbgStepOutDesc"),
params: [],
exec: function(args, context) {
let dbg = getPanel(context, "jsdebugger");
if (!dbg) {
return gcli.lookup("debuggerStopped");
return l10n.lookup("debuggerStopped");
}
let controller = dbg._controller;
@@ -398,14 +420,16 @@ exports.items.push({
* 'dbg list' command
*/
exports.items.push({
item: "command",
runAt: "client",
name: "dbg list",
description: gcli.lookup("dbgListSourcesDesc"),
description: l10n.lookup("dbgListSourcesDesc"),
params: [],
returnType: "dom",
exec: function(args, context) {
let dbg = getPanel(context, "jsdebugger");
if (!dbg) {
return gcli.lookup("debuggerClosed");
return l10n.lookup("debuggerClosed");
}
let sources = getAllSources(dbg);
@@ -440,10 +464,12 @@ exports.items.push({
}
].forEach(function(cmd) {
const lookup = function(id) {
return gcli.lookup(cmd.l10nPrefix + id);
return l10n.lookup(cmd.l10nPrefix + id);
};
exports.items.push({
item: "command",
runAt: "client",
name: "dbg " + cmd.name,
description: lookup("Desc"),
params: [
@@ -475,7 +501,7 @@ exports.items.push({
const dbg = getPanel(context, "jsdebugger");
const doc = context.environment.chromeDocument;
if (!dbg) {
throw new Error(gcli.lookup("debuggerClosed"));
throw new Error(l10n.lookup("debuggerClosed"));
}
const { promise, resolve, reject } = context.defer();
+9 -4
View File
@@ -2,7 +2,7 @@
* 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/. */
const gcli = require("gcli/index");
const l10n = require("gcli/l10n");
const EventEmitter = require("devtools/toolkit/event-emitter");
const eventEmitter = new EventEmitter();
@@ -12,14 +12,19 @@ let { Eyedropper, EyedropperManager } = require("devtools/eyedropper/eyedropper"
* 'eyedropper' command
*/
exports.items = [{
item: "command",
runAt: "client",
name: "eyedropper",
description: gcli.lookup("eyedropperDesc"),
manual: gcli.lookup("eyedropperManual"),
description: l10n.lookup("eyedropperDesc"),
manual: l10n.lookup("eyedropperManual"),
buttonId: "command-button-eyedropper",
buttonClass: "command-button command-button-invertable",
tooltipText: gcli.lookup("eyedropperTooltip"),
tooltipText: l10n.lookup("eyedropperTooltip"),
state: {
isChecked: function(target) {
if (!target.tab) {
return false;
}
let chromeWindow = target.tab.ownerDocument.defaultView;
let dropper = EyedropperManager.getInstance(chromeWindow);
if (dropper) {
+5
View File
@@ -808,6 +808,11 @@ let gDevToolsBrowser = {
return !!(widgetWrapper && widgetWrapper.provider == CustomizableUI.PROVIDER_API);
},
/**
* The deferred promise will be resolved by WebIDE's UI.init()
*/
isWebIDEInitialized: promise.defer(),
/**
* Uninstall WebIDE widget
*/
+7 -1
View File
@@ -5,9 +5,11 @@ support-files =
browser_toolbox_options_disable_js_iframe.html
browser_toolbox_options_disable_cache.sjs
browser_toolbox_sidebar_tool.xul
code_math.js
head.js
helper_disable_cache.js
doc_theme.css
doc_viewsource.html
browser_toolbox_options_enable_serviceworkers_testing.html
serviceworker.js
@@ -47,6 +49,10 @@ skip-if = e10s # Bug 1069044 - destroyInspector may hang during shutdown
[browser_toolbox_tool_ready.js]
[browser_toolbox_tool_remote_reopen.js]
[browser_toolbox_transport_events.js]
[browser_toolbox_view_source_01.js]
[browser_toolbox_view_source_02.js]
[browser_toolbox_view_source_03.js]
[browser_toolbox_view_source_04.js]
[browser_toolbox_window_reload_target.js]
[browser_toolbox_window_shortcuts.js]
skip-if = os == "mac" && os_version == "10.8" || os == "win" && os_version == "5.1" # Bug 851129 - Re-enable browser_toolbox_window_shortcuts.js test after leaks are fixed
@@ -55,6 +61,6 @@ skip-if = os == "mac" && os_version == "10.8" || os == "win" && os_version == "5
[browser_toolbox_custom_host.js]
[browser_toolbox_theme_registration.js]
[browser_toolbox_options_enable_serviceworkers_testing.js]
skip-if = e10s # Bug 1030318
skip-if = true # Bug 1153407 - this test breaks subsequent tests and is not e10s compatible
@@ -118,6 +118,10 @@ function test() {
todo(false, "Front for " + actor + " still held in pool!");
continue;
}
// gcliActor is for the commandline which is separate to the toolbox
if (actor.contains("gcliActor")) {
continue;
}
ok(false, "Front for " + actor + " still held in pool!");
}
}
@@ -0,0 +1,38 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Tests that Toolbox#viewSourceInDebugger works when debugger is not
* yet opened.
*/
let URL = `${URL_ROOT}doc_viewsource.html`;
let JS_URL = `${URL_ROOT}code_math.js`;
function *viewSource() {
let toolbox = yield loadToolbox(URL);
yield toolbox.viewSourceInDebugger(JS_URL, 2);
let debuggerPanel = toolbox.getPanel("jsdebugger");
ok(debuggerPanel, "The debugger panel was opened.");
is(toolbox.currentToolId, "jsdebugger", "The debugger panel was selected.");
let { DebuggerView } = debuggerPanel.panelWin;
let Sources = DebuggerView.Sources;
is(Sources.selectedValue, getSourceActor(Sources, JS_URL),
"The correct source is shown in the debugger.");
is(DebuggerView.editor.getCursor().line + 1, 2,
"The correct line is highlighted in the debugger's source editor.");
yield unloadToolbox(toolbox);
finish();
}
function test () {
Task.spawn(viewSource).then(finish, (aError) => {
ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
finish();
});
}
@@ -0,0 +1,46 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Tests that Toolbox#viewSourceInDebugger works when debugger is already loaded.
*/
let URL = `${URL_ROOT}doc_viewsource.html`;
let JS_URL = `${URL_ROOT}code_math.js`;
function *viewSource() {
let toolbox = yield loadToolbox(URL);
let { panelWin: debuggerWin } = yield toolbox.selectTool("jsdebugger");
let debuggerEvents = debuggerWin.EVENTS;
let { DebuggerView } = debuggerWin;
let Sources = DebuggerView.Sources;
yield debuggerWin.once(debuggerEvents.SOURCE_SHOWN);
ok("A source was shown in the debugger.");
is(Sources.selectedValue, getSourceActor(Sources, JS_URL),
"The correct source is initially shown in the debugger.");
is(DebuggerView.editor.getCursor().line, 0,
"The correct line is initially highlighted in the debugger's source editor.");
yield toolbox.viewSourceInDebugger(JS_URL, 2);
let debuggerPanel = toolbox.getPanel("jsdebugger");
ok(debuggerPanel, "The debugger panel was opened.");
is(toolbox.currentToolId, "jsdebugger", "The debugger panel was selected.");
is(Sources.selectedValue, getSourceActor(Sources, JS_URL),
"The correct source is shown in the debugger.");
is(DebuggerView.editor.getCursor().line + 1, 2,
"The correct line is highlighted in the debugger's source editor.");
yield unloadToolbox(toolbox);
finish();
}
function test () {
Task.spawn(viewSource).then(finish, (aError) => {
ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
finish();
});
}
@@ -0,0 +1,38 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Tests that Toolbox#viewSourceInStyleEditor works when style editor is not
* yet opened.
*/
let URL = `${URL_ROOT}doc_viewsource.html`;
let CSS_URL = `${URL_ROOT}doc_theme.css`;
function *viewSource() {
let toolbox = yield loadToolbox(URL);
let fileFound = yield toolbox.viewSourceInStyleEditor(CSS_URL, 2);
ok(fileFound, "viewSourceInStyleEditor should resolve to true if source found.");
let stylePanel = toolbox.getPanel("styleeditor");
ok(stylePanel, "The style editor panel was opened.");
is(toolbox.currentToolId, "styleeditor", "The style editor panel was selected.");
let { UI } = stylePanel;
is(UI.selectedEditor.styleSheet.href, CSS_URL,
"The correct source is shown in the style editor.");
is(UI.selectedEditor.sourceEditor.getCursor().line + 1, 2,
"The correct line is highlighted in the style editor's source editor.");
yield unloadToolbox(toolbox);
finish();
}
function test () {
Task.spawn(viewSource).then(finish, (aError) => {
ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
finish();
});
}
@@ -0,0 +1,37 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Tests that Toolbox#viewSourceInScratchpad works.
*/
let URL = `${URL_ROOT}doc_viewsource.html`;
function *viewSource() {
let toolbox = yield loadToolbox(URL);
let win = yield openScratchpadWindow();
let { Scratchpad: scratchpad } = win;
// Brahm's Cello Sonata No.1, Op.38 now in the scratchpad
scratchpad.setText("E G B C B\nA B A G A B\nG E");
let scratchpadURL = scratchpad.uniqueName;
// Now select another tool for focus
yield toolbox.selectTool("webconsole");
yield toolbox.viewSourceInScratchpad(scratchpadURL, 2);
is(scratchpad.editor.getCursor().line, 2,
"The correct line is highlighted in scratchpad's editor.");
win.close();
yield unloadToolbox(toolbox);
finish();
}
function test () {
Task.spawn(viewSource).then(finish, (aError) => {
ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
finish();
});
}
@@ -0,0 +1,4 @@
function add(a, b, k) {
var result = a + b;
return k(result);
}
@@ -0,0 +1,13 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>Toolbox test for View Source methods</title>
<!-- Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ -->
<link charset="UTF-8" rel="stylesheet" href="doc_theme.css" />
<script src="code_math.js"></script>
</head>
<body>
</body>
</html>
+47
View File
@@ -7,6 +7,7 @@ let TargetFactory = gDevTools.TargetFactory;
const { console } = Cu.import("resource://gre/modules/devtools/Console.jsm", {});
const { Promise: promise } = Cu.import("resource://gre/modules/Promise.jsm", {});
const { devtools } = Cu.import("resource://gre/modules/devtools/Loader.jsm", {});
const { ScratchpadManager } = Cu.import("resource:///modules/devtools/scratchpad-manager.jsm", {});
const URL_ROOT = "http://example.com/browser/browser/devtools/framework/test/";
const CHROME_URL_ROOT = "chrome://mochitests/content/browser/browser/devtools/framework/test/";
@@ -175,3 +176,49 @@ function getChromeActors(callback)
DebuggerServer.destroy();
});
}
function loadToolbox (url) {
let { promise: p, resolve } = promise.defer();
gBrowser.selectedTab = gBrowser.addTab();
let target = TargetFactory.forTab(gBrowser.selectedTab);
gBrowser.selectedBrowser.addEventListener("load", function onLoad(evt) {
gBrowser.selectedBrowser.removeEventListener(evt.type, onLoad, true);
gDevTools.showToolbox(target).then(resolve);
}, true);
content.location = url;
return p;
}
function unloadToolbox (toolbox) {
return toolbox.destroy().then(function() {
gBrowser.removeCurrentTab();
});
}
function getSourceActor(aSources, aURL) {
let item = aSources.getItemForAttachment(a => a.source.url === aURL);
return item && item.value;
}
/**
* Open a Scratchpad window.
*
* @return nsIDOMWindow
* The new window object that holds Scratchpad.
*/
function *openScratchpadWindow () {
let { promise: p, resolve } = promise.defer();
let win = ScratchpadManager.openScratchpad();
yield once(win, "load");
win.Scratchpad.addObserver({
onReady: function () {
win.Scratchpad.removeObserver(this);
resolve(win);
}
});
return p;
}
+53 -4
View File
@@ -21,6 +21,7 @@ let Telemetry = require("devtools/shared/telemetry");
let {getHighlighterUtils} = require("devtools/framework/toolbox-highlighter-utils");
let {HUDService} = require("devtools/webconsole/hudservice");
let {showDoorhanger} = require("devtools/shared/doorhanger");
let sourceUtils = require("devtools/shared/source-utils");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm");
@@ -716,10 +717,13 @@ Toolbox.prototype = {
this._buildPickerButton();
}
let spec = CommandUtils.getCommandbarSpec("devtools.toolbox.toolbarSpec");
let environment = CommandUtils.createEnvironment(this, '_target');
return CommandUtils.createRequisition(environment).then(requisition => {
const options = {
environment: CommandUtils.createEnvironment(this, '_target')
};
return CommandUtils.createRequisition(this.target, options).then(requisition => {
this._requisition = requisition;
const spec = CommandUtils.getCommandbarSpec("devtools.toolbox.toolbarSpec");
return CommandUtils.createButtons(spec, this.target, this.doc,
requisition).then(buttons => {
let container = this.doc.getElementById("toolbox-buttons");
@@ -1704,6 +1708,7 @@ Toolbox.prototype = {
gDevTools.off("pref-changed", this._prefChanged);
this._lastFocusedElement = null;
if (this.webconsolePanel) {
this._saveSplitConsoleHeight();
this.webconsolePanel.removeEventListener("resize",
@@ -1751,7 +1756,7 @@ Toolbox.prototype = {
let win = this.frame.ownerGlobal;
if (this._requisition) {
this._requisition.destroy();
CommandUtils.destroyRequisition(this._requisition, this.target);
}
this._telemetry.toolClosed("toolbox");
this._telemetry.destroy();
@@ -1873,4 +1878,48 @@ Toolbox.prototype = {
yield this._performanceConnection.destroy();
this._performanceConnection = null;
}),
/**
* Returns gViewSourceUtils for viewing source.
*/
get gViewSourceUtils() {
return this.frame.contentWindow.gViewSourceUtils;
},
/**
* Opens source in style editor. Falls back to plain "view-source:".
* @see browser/devtools/shared/source-utils.js
*/
viewSourceInStyleEditor: function (sourceURL, sourceLine) {
return sourceUtils.viewSourceInStyleEditor(this, sourceURL, sourceLine);
},
/**
* Opens source in debugger. Falls back to plain "view-source:".
* @see browser/devtools/shared/source-utils.js
*/
viewSourceInDebugger: function (sourceURL, sourceLine) {
return sourceUtils.viewSourceInDebugger(this, sourceURL, sourceLine);
},
/**
* Opens source in scratchpad. Falls back to plain "view-source:".
* TODO The `sourceURL` for scratchpad instances are like `Scratchpad/1`.
* If instances are scoped one-per-browser-window, then we should be able
* to infer the URL from this toolbox, or use the built in scratchpad IN
* the toolbox.
*
* @see browser/devtools/shared/source-utils.js
*/
viewSourceInScratchpad: function (sourceURL, sourceLine) {
return sourceUtils.viewSourceInScratchpad(sourceURL, sourceLine);
},
/**
* Opens source in plain "view-source:".
* @see browser/devtools/shared/source-utils.js
*/
viewSource: function (sourceURL, sourceLine) {
return sourceUtils.viewSource(this, sourceURL, sourceLine);
},
};
+3
View File
@@ -15,6 +15,9 @@
<script type="application/javascript;version=1.8"
src="chrome://global/content/devtools/theme-switching.js"/>
<script type="application/javascript"
src="chrome://global/content/viewSourceUtils.js"/>
<script type="application/javascript" src="chrome://global/content/globalOverlay.js"/>
<commandset id="editMenuCommands"/>
+38 -18
View File
@@ -19,11 +19,7 @@ Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "console",
"resource://gre/modules/devtools/Console.jsm");
'do not use strict';
// WARNING: do not 'use strict' without reading the notes in envEval();
// Also don't remove the 'do not use strict' marker. The orion build uses these
// markers to know where to insert AMD headers.
'use strict';
/**
* For full documentation, see:
@@ -69,9 +65,9 @@ var template = function(node, data, options) {
processNode(state, node, data);
};
//
//
//
if (typeof exports !== 'undefined') {
exports.template = template;
}
/**
* Helper for the places where we need to act asynchronously and keep track of
@@ -182,6 +178,7 @@ function processNode(state, node, data) {
replacement = envEval(state, value.slice(2, -1), data, value);
if (replacement && typeof replacement.then === 'function') {
node.setAttribute(name, '');
/* jshint loopfunc:true */
replacement.then(function(newValue) {
node.setAttribute(name, newValue);
}).then(null, console.error);
@@ -361,15 +358,16 @@ function processForEachMember(state, member, templNode, siblingNode, data, param
});
newData[paramName] = reply;
if (node.parentNode != null) {
var clone;
if (templNode.nodeName.toLowerCase() === 'loop') {
for (var i = 0; i < templNode.childNodes.length; i++) {
var clone = templNode.childNodes[i].cloneNode(true);
clone = templNode.childNodes[i].cloneNode(true);
node.parentNode.insertBefore(clone, node);
processNode(cState, clone, newData);
}
}
else {
var clone = templNode.cloneNode(true);
clone = templNode.cloneNode(true);
clone.removeAttribute('foreach');
node.parentNode.insertBefore(clone, node);
processNode(cState, clone, newData);
@@ -543,10 +541,6 @@ function property(state, path, data, newValue) {
/**
* Like eval, but that creates a context of the variables in <tt>env</tt> in
* which the script is evaluated.
* WARNING: This script uses 'with' which is generally regarded to be evil.
* The alternative is to create a Function at runtime that takes X parameters
* according to the X keys in the env object, and then call that function using
* the values in the env object. This is likely to be slow, but workable.
* @param script The string to be evaluated.
* @param data The environment in which to eval the script.
* @param frame Optional debugging string in case of failure.
@@ -566,9 +560,26 @@ function envEval(state, script, data, frame) {
' can not be resolved using a simple property path.');
return '${' + script + '}';
}
with (data) {
return eval(script);
}
// What we're looking to do is basically:
// with(data) { return eval(script); }
// except in strict mode where 'with' is banned.
// So we create a function which has a parameter list the same as the
// keys in 'data' and with 'script' as its function body.
// We then call this function with the values in 'data'
var keys = allKeys(data);
var func = Function.apply(null, keys.concat("return " + script));
var values = keys.map(function(key) { return data[key]; });
return func.apply(null, values);
// TODO: The 'with' method is different from the code above in the value
// of 'this' when calling functions. For example:
// envEval(state, 'foo()', { foo: function() { return this; } }, ...);
// The global for 'foo' when using 'with' is the data object. However the
// code above, the global is null. (Using 'func.apply(data, values)'
// changes 'this' in the 'foo()' frame, but not in the inside the body
// of 'foo', so that wouldn't help)
}
}
catch (ex) {
@@ -580,6 +591,15 @@ function envEval(state, script, data, frame) {
}
}
/**
* Object.keys() that respects the prototype chain
*/
function allKeys(data) {
var keys = [];
for (var key in data) { keys.push(key); }
return keys;
}
/**
* A generic way of reporting errors, for easy overloading in different
* environments.
@@ -599,5 +619,5 @@ function handleError(state, message, ex) {
* @param message the error message to report.
*/
function logError(message) {
console.log(message);
console.error(message);
}
+58 -26
View File
@@ -4,9 +4,33 @@
"use strict";
/**
* You can't require the AddonManager in a child process, but GCLI wants to
* check for 'items' in all processes, so we return empty array if the
* AddonManager is not available
*/
function getAddonManager() {
try {
return {
AddonManager: require("resource://gre/modules/AddonManager.jsm").AddonManager,
addonManagerActive: true
};
}
catch (ex) {
// Fake up an AddonManager just enough to let the file load
return {
AddonManager: {
getAllAddons() {},
getAddonsByTypes() {}
},
addonManagerActive: false
};
}
}
const { Cc, Ci, Cu } = require("chrome");
const { AddonManager } = Cu.import("resource://gre/modules/AddonManager.jsm", {});
const gcli = require("gcli/index");
const { AddonManager, addonManagerActive } = getAddonManager();
const l10n = require("gcli/l10n");
const { Promise: promise } = require("resource://gre/modules/Promise.jsm");
const BRAND_SHORT_NAME = Cc["@mozilla.org/intl/stringbundle;1"]
@@ -49,7 +73,7 @@ function pendingOperations(addon) {
}, []);
}
exports.items = [
var items = [
{
item: "type",
name: "addon",
@@ -76,11 +100,11 @@ exports.items = [
},
{
name: "addon",
description: gcli.lookup("addonDesc")
description: l10n.lookup("addonDesc")
},
{
name: "addon list",
description: gcli.lookup("addonListDesc"),
description: l10n.lookup("addonListDesc"),
returnType: "addonsInfo",
params: [{
name: "type",
@@ -89,7 +113,7 @@ exports.items = [
data: [ "dictionary", "extension", "locale", "plugin", "theme", "all" ]
},
defaultValue: "all",
description: gcli.lookup("addonListTypeDesc")
description: l10n.lookup("addonListTypeDesc")
}],
exec: function(args, context) {
let types = (args.type === "all") ? null : [ args.type ];
@@ -114,7 +138,7 @@ exports.items = [
if (!addonsInfo.addons.length) {
return context.createView({
html: "<p>${message}</p>",
data: { message: gcli.lookup("addonNoneOfType") }
data: { message: l10n.lookup("addonNoneOfType") }
});
}
@@ -126,7 +150,7 @@ exports.items = [
"theme": "addonListThemeHeading",
"all": "addonListAllHeading"
};
let header = gcli.lookup(headerLookups[addonsInfo.type] ||
let header = l10n.lookup(headerLookups[addonsInfo.type] ||
"addonListUnknownHeading");
let operationLookups = {
@@ -138,7 +162,7 @@ exports.items = [
};
function lookupOperation(opName) {
let lookupName = operationLookups[opName];
return lookupName ? gcli.lookup(lookupName) : opName;
return lookupName ? l10n.lookup(lookupName) : opName;
}
function arrangeAddons(addons) {
@@ -193,14 +217,14 @@ exports.items = [
status: addon.isActive ? "enabled" : "disabled",
version: addon.version,
pendingOperations: addon.pendingOperations.length ?
(" (" + gcli.lookup("addonPending") + ": "
(" (" + l10n.lookup("addonPending") + ": "
+ addon.pendingOperations.map(lookupOperation).join(", ")
+ ")") :
"",
toggleActionName: isActiveForToggle(addon) ? "disable": "enable",
toggleActionMessage: isActiveForToggle(addon) ?
gcli.lookup("addonListOutDisable") :
gcli.lookup("addonListOutEnable")
l10n.lookup("addonListOutDisable") :
l10n.lookup("addonListOutEnable")
};
}),
onclick: context.update,
@@ -210,33 +234,37 @@ exports.items = [
}
},
{
item: "command",
runAt: "client",
name: "addon enable",
description: gcli.lookup("addonEnableDesc"),
description: l10n.lookup("addonEnableDesc"),
params: [
{
name: "addon",
type: "addon",
description: gcli.lookup("addonNameDesc")
description: l10n.lookup("addonNameDesc")
}
],
exec: function(args, context) {
let name = (args.addon.name + " " + args.addon.version).trim();
if (args.addon.userDisabled) {
args.addon.userDisabled = false;
return gcli.lookupFormat("addonEnabled", [ name ]);
return l10n.lookupFormat("addonEnabled", [ name ]);
}
return gcli.lookupFormat("addonAlreadyEnabled", [ name ]);
return l10n.lookupFormat("addonAlreadyEnabled", [ name ]);
}
},
{
item: "command",
runAt: "client",
name: "addon disable",
description: gcli.lookup("addonDisableDesc"),
description: l10n.lookup("addonDisableDesc"),
params: [
{
name: "addon",
type: "addon",
description: gcli.lookup("addonNameDesc")
description: l10n.lookup("addonNameDesc")
}
],
exec: function(args, context) {
@@ -247,26 +275,28 @@ exports.items = [
if (!args.addon.userDisabled ||
args.addon.userDisabled === AddonManager.STATE_ASK_TO_ACTIVATE) {
args.addon.userDisabled = true;
return gcli.lookupFormat("addonDisabled", [ name ]);
return l10n.lookupFormat("addonDisabled", [ name ]);
}
return gcli.lookupFormat("addonAlreadyDisabled", [ name ]);
return l10n.lookupFormat("addonAlreadyDisabled", [ name ]);
}
},
{
item: "command",
runAt: "client",
name: "addon ctp",
description: gcli.lookup("addonCtpDesc"),
description: l10n.lookup("addonCtpDesc"),
params: [
{
name: "addon",
type: "addon",
description: gcli.lookup("addonNameDesc")
description: l10n.lookup("addonNameDesc")
}
],
exec: function(args, context) {
let name = (args.addon.name + " " + args.addon.version).trim();
if (args.addon.type !== "plugin") {
return gcli.lookupFormat("addonCantCtp", [ name ]);
return l10n.lookupFormat("addonCantCtp", [ name ]);
}
if (!args.addon.userDisabled ||
@@ -277,13 +307,15 @@ exports.items = [
// Some plugins (e.g. OpenH264 shipped with Pale Moon) cannot be set to
// click-to-play. Handle this.
return gcli.lookupFormat("addonNoCtp", [ name ]);
return l10n.lookupFormat("addonNoCtp", [ name ]);
}
return gcli.lookupFormat("addonCtp", [ name ]);
return l10n.lookupFormat("addonCtp", [ name ]);
}
return gcli.lookupFormat("addonAlreadyCtp", [ name ]);
return l10n.lookupFormat("addonAlreadyCtp", [ name ]);
}
}
];
exports.items = addonManagerActive ? items : [];
+32 -23
View File
@@ -4,19 +4,22 @@
"use strict";
const gcli = require("gcli/index");
const l10n = require("gcli/l10n");
loader.lazyImporter(this, "AppCacheUtils", "resource://gre/modules/devtools/AppCacheUtils.jsm");
exports.items = [
{
item: "command",
name: "appcache",
description: gcli.lookup("appCacheDesc")
description: l10n.lookup("appCacheDesc")
},
{
item: "command",
runAt: "server",
name: "appcache validate",
description: gcli.lookup("appCacheValidateDesc"),
manual: gcli.lookup("appCacheValidateManual"),
description: l10n.lookup("appCacheValidateDesc"),
manual: l10n.lookup("appCacheValidateManual"),
returnType: "appcacheerrors",
params: [{
group: "options",
@@ -24,7 +27,7 @@ exports.items = [
{
type: "string",
name: "uri",
description: gcli.lookup("appCacheValidateUriDesc"),
description: l10n.lookup("appCacheValidateUriDesc"),
defaultValue: null,
}
]
@@ -53,7 +56,7 @@ exports.items = [
exec: function([errors, manifestURI], context) {
if (errors.length == 0) {
return context.createView({
html: "<span>" + gcli.lookup("appCacheValidatedSuccessfully") + "</span>"
html: "<span>" + l10n.lookup("appCacheValidatedSuccessfully") + "</span>"
});
}
@@ -73,20 +76,24 @@ exports.items = [
}
},
{
item: "command",
runAt: "server",
name: "appcache clear",
description: gcli.lookup("appCacheClearDesc"),
manual: gcli.lookup("appCacheClearManual"),
description: l10n.lookup("appCacheClearDesc"),
manual: l10n.lookup("appCacheClearManual"),
exec: function(args, context) {
let utils = new AppCacheUtils(args.uri);
utils.clearAll();
return gcli.lookup("appCacheClearCleared");
return l10n.lookup("appCacheClearCleared");
}
},
{
item: "command",
runAt: "server",
name: "appcache list",
description: gcli.lookup("appCacheListDesc"),
manual: gcli.lookup("appCacheListManual"),
description: l10n.lookup("appCacheListDesc"),
manual: l10n.lookup("appCacheListManual"),
returnType: "appcacheentries",
params: [{
group: "options",
@@ -94,7 +101,7 @@ exports.items = [
{
type: "string",
name: "search",
description: gcli.lookup("appCacheListSearchDesc"),
description: l10n.lookup("appCacheListSearchDesc"),
defaultValue: null,
},
]
@@ -115,35 +122,35 @@ exports.items = [
" <li foreach='entry in ${entries}'>" +
" <table class='gcli-appcache-detail'>" +
" <tr>" +
" <td>" + gcli.lookup("appCacheListKey") + "</td>" +
" <td>" + l10n.lookup("appCacheListKey") + "</td>" +
" <td>${entry.key}</td>" +
" </tr>" +
" <tr>" +
" <td>" + gcli.lookup("appCacheListFetchCount") + "</td>" +
" <td>" + l10n.lookup("appCacheListFetchCount") + "</td>" +
" <td>${entry.fetchCount}</td>" +
" </tr>" +
" <tr>" +
" <td>" + gcli.lookup("appCacheListLastFetched") + "</td>" +
" <td>" + l10n.lookup("appCacheListLastFetched") + "</td>" +
" <td>${entry.lastFetched}</td>" +
" </tr>" +
" <tr>" +
" <td>" + gcli.lookup("appCacheListLastModified") + "</td>" +
" <td>" + l10n.lookup("appCacheListLastModified") + "</td>" +
" <td>${entry.lastModified}</td>" +
" </tr>" +
" <tr>" +
" <td>" + gcli.lookup("appCacheListExpirationTime") + "</td>" +
" <td>" + l10n.lookup("appCacheListExpirationTime") + "</td>" +
" <td>${entry.expirationTime}</td>" +
" </tr>" +
" <tr>" +
" <td>" + gcli.lookup("appCacheListDataSize") + "</td>" +
" <td>" + l10n.lookup("appCacheListDataSize") + "</td>" +
" <td>${entry.dataSize}</td>" +
" </tr>" +
" <tr>" +
" <td>" + gcli.lookup("appCacheListDeviceID") + "</td>" +
" <td>" + l10n.lookup("appCacheListDeviceID") + "</td>" +
" <td>${entry.deviceID} <span class='gcli-out-shortcut' " +
"onclick='${onclick}' ondblclick='${ondblclick}' " +
"data-command='appcache viewentry ${entry.key}'" +
">" + gcli.lookup("appCacheListViewEntry") + "</span>" +
">" + l10n.lookup("appCacheListViewEntry") + "</span>" +
" </td>" +
" </tr>" +
" </table>" +
@@ -158,14 +165,16 @@ exports.items = [
}
},
{
item: "command",
runAt: "server",
name: "appcache viewentry",
description: gcli.lookup("appCacheViewEntryDesc"),
manual: gcli.lookup("appCacheViewEntryManual"),
description: l10n.lookup("appCacheViewEntryDesc"),
manual: l10n.lookup("appCacheViewEntryManual"),
params: [
{
type: "string",
name: "key",
description: gcli.lookup("appCacheViewEntryKey"),
description: l10n.lookup("appCacheViewEntryKey"),
defaultValue: null,
}
],
+29 -20
View File
@@ -6,6 +6,7 @@
const { Cc, Ci, Cu } = require("chrome");
const TargetFactory = Cu.import("resource://gre/modules/devtools/Loader.jsm", {}).devtools.TargetFactory;
const l10n = require("gcli/l10n");
const gcli = require("gcli/index");
loader.lazyImporter(this, "gDevTools", "resource://gre/modules/devtools/gDevTools.jsm");
@@ -24,11 +25,13 @@ let sandboxes = [];
exports.items = [
{
name: "calllog",
description: gcli.lookup("calllogDesc")
description: l10n.lookup("calllogDesc")
},
{
item: "command",
runAt: "client",
name: "calllog start",
description: gcli.lookup("calllogStartDesc"),
description: l10n.lookup("calllogStartDesc"),
exec: function(args, context) {
let contentWindow = context.environment.window;
@@ -45,7 +48,7 @@ exports.items = [
let target = TargetFactory.forTab(gBrowser.selectedTab);
gDevTools.showToolbox(target, "webconsole");
return gcli.lookup("calllogStartReply");
return l10n.lookup("calllogStartReply");
},
callDescription: function(frame) {
@@ -72,13 +75,15 @@ exports.items = [
}
},
{
item: "command",
runAt: "client",
name: "calllog stop",
description: gcli.lookup("calllogStopDesc"),
description: l10n.lookup("calllogStopDesc"),
exec: function(args, context) {
let numDebuggers = debuggers.length;
if (numDebuggers == 0) {
return gcli.lookup("calllogStopNoLogging");
return l10n.lookup("calllogStopNoLogging");
}
for (let dbg of debuggers) {
@@ -86,12 +91,14 @@ exports.items = [
}
debuggers = [];
return gcli.lookupFormat("calllogStopReply", [ numDebuggers ]);
return l10n.lookupFormat("calllogStopReply", [ numDebuggers ]);
}
},
{
item: "command",
runAt: "client",
name: "calllog chromestart",
description: gcli.lookup("calllogChromeStartDesc"),
description: l10n.lookup("calllogChromeStartDesc"),
get hidden() gcli.hiddenByChromePref(),
params: [
{
@@ -104,8 +111,8 @@ exports.items = [
{
name: "source",
type: "string",
description: gcli.lookup("calllogChromeSourceTypeDesc"),
manual: gcli.lookup("calllogChromeSourceTypeManual"),
description: l10n.lookup("calllogChromeSourceTypeDesc"),
manual: l10n.lookup("calllogChromeSourceTypeManual"),
}
],
exec: function(args, context) {
@@ -117,20 +124,20 @@ exports.items = [
globalObj = Cu.import(args.source);
}
catch (e) {
return gcli.lookup("callLogChromeInvalidJSM");
return l10n.lookup("callLogChromeInvalidJSM");
}
} else if (args.sourceType == "content-variable") {
if (args.source in contentWindow) {
globalObj = Cu.getGlobalForObject(contentWindow[args.source]);
} else {
throw new Error(gcli.lookup("callLogChromeVarNotFoundContent"));
throw new Error(l10n.lookup("callLogChromeVarNotFoundContent"));
}
} else if (args.sourceType == "chrome-variable") {
let chromeWin = context.environment.chromeDocument.defaultView;
if (args.source in chromeWin) {
globalObj = Cu.getGlobalForObject(chromeWin[args.source]);
} else {
return gcli.lookup("callLogChromeVarNotFoundChrome");
return l10n.lookup("callLogChromeVarNotFoundChrome");
}
} else {
let chromeWin = context.environment.chromeDocument.defaultView;
@@ -147,13 +154,13 @@ exports.items = [
} catch(e) {
// We need to save the message before cleaning up else e contains a dead
// object.
let msg = gcli.lookup("callLogChromeEvalException") + ": " + e;
let msg = l10n.lookup("callLogChromeEvalException") + ": " + e;
Cu.nukeSandbox(sandbox);
return msg;
}
if (typeof returnVal == "undefined") {
return gcli.lookup("callLogChromeEvalNeedsObject");
return l10n.lookup("callLogChromeEvalNeedsObject");
}
globalObj = Cu.getGlobalForObject(returnVal);
@@ -164,7 +171,7 @@ exports.items = [
dbg.onEnterFrame = function(frame) {
// BUG 773652 - Make the output from the GCLI calllog command nicer
contentWindow.console.log(gcli.lookup("callLogChromeMethodCall") +
contentWindow.console.log(l10n.lookup("callLogChromeMethodCall") +
": " + this.callDescription(frame));
}.bind(this);
@@ -172,7 +179,7 @@ exports.items = [
let target = TargetFactory.forTab(gBrowser.selectedTab);
gDevTools.showToolbox(target, "webconsole");
return gcli.lookup("calllogChromeStartReply");
return l10n.lookup("calllogChromeStartReply");
},
valueToString: function(value) {
@@ -182,19 +189,21 @@ exports.items = [
},
callDescription: function(frame) {
let name = frame.callee.name || gcli.lookup("callLogChromeAnonFunction");
let name = frame.callee.name || l10n.lookup("callLogChromeAnonFunction");
let args = frame.arguments.map(this.valueToString).join(", ");
return name + "(" + args + ")";
}
},
{
item: "command",
runAt: "client",
name: "calllog chromestop",
description: gcli.lookup("calllogChromeStopDesc"),
description: l10n.lookup("calllogChromeStopDesc"),
get hidden() gcli.hiddenByChromePref(),
exec: function(args, context) {
let numDebuggers = chromeDebuggers.length;
if (numDebuggers == 0) {
return gcli.lookup("calllogChromeStopNoLogging");
return l10n.lookup("calllogChromeStopNoLogging");
}
for (let dbg of chromeDebuggers) {
@@ -207,7 +216,7 @@ exports.items = [
chromeDebuggers = [];
sandboxes = [];
return gcli.lookupFormat("calllogChromeStopReply", [ numDebuggers ]);
return l10n.lookupFormat("calllogChromeStopReply", [ numDebuggers ]);
}
}
];
+12 -7
View File
@@ -11,6 +11,7 @@ const { Promise: promise } = require("resource://gre/modules/Promise.jsm");
const { OS } = Cu.import("resource://gre/modules/osfile.jsm", {});
const { TextEncoder, TextDecoder } = Cu.import('resource://gre/modules/commonjs/toolkit/loader.js', {});
const gcli = require("gcli/index");
const l10n = require("gcli/l10n");
loader.lazyGetter(this, "prefBranch", function() {
let prefService = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService);
@@ -127,11 +128,13 @@ exports.items = [
get hidden() {
return !prefBranch.prefHasUserValue(PREF_DIR);
},
description: gcli.lookup("cmdDesc")
description: l10n.lookup("cmdDesc")
},
{
item: "command",
runAt: "client",
name: "cmd refresh",
description: gcli.lookup("cmdRefreshDesc"),
description: l10n.lookup("cmdRefreshDesc"),
get hidden() {
return !prefBranch.prefHasUserValue(PREF_DIR);
},
@@ -140,17 +143,19 @@ exports.items = [
let dirName = prefBranch.getComplexValue(PREF_DIR,
Ci.nsISupportsString).data.trim();
return gcli.lookupFormat("cmdStatus3", [ dirName ]);
return l10n.lookupFormat("cmdStatus3", [ dirName ]);
}
},
{
item: "command",
runAt: "client",
name: "cmd setdir",
description: gcli.lookup("cmdSetdirDesc"),
manual: gcli.lookup("cmdSetdirManual2"),
description: l10n.lookup("cmdSetdirDesc"),
manual: l10n.lookup("cmdSetdirManual2"),
params: [
{
name: "directory",
description: gcli.lookup("cmdSetdirDirectoryDesc"),
description: l10n.lookup("cmdSetdirDirectoryDesc"),
type: {
name: "file",
filetype: "directory",
@@ -169,7 +174,7 @@ exports.items = [
gcli.load();
return gcli.lookupFormat("cmdStatus3", [ args.directory ]);
return l10n.lookupFormat("cmdStatus3", [ args.directory ]);
}
}
];

Some files were not shown because too many files have changed in this diff Show More