Files
roytam1 7624030fbf 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)
2020-09-04 21:16:47 +08:00

321 lines
9.7 KiB
JavaScript

/* 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/. */
const Cu = Components.utils;
const { require } = Cu.import("resource://gre/modules/devtools/Loader.jsm", {}).devtools;
const { GetDevices, GetDeviceString } = require("devtools/shared/devices");
const { Services } = Cu.import("resource://gre/modules/Services.jsm");
const { Simulators, Simulator } = require("devtools/webide/simulators");
const EventEmitter = require('devtools/toolkit/event-emitter');
const promise = require("promise");
const utils = require("devtools/webide/utils");
const Strings = Services.strings.createBundle("chrome://browser/locale/devtools/webide.properties");
let SimulatorEditor = {
// Available Firefox OS Simulator addons (key: `addon.id`).
_addons: {},
// Available device simulation profiles (key: `device.name`).
_devices: {},
// The names of supported simulation options.
_deviceOptions: [],
// The <form> element used to edit Simulator options.
_form: null,
// The Simulator object being edited.
_simulator: null,
// Generate the dynamic form elements.
init() {
let promises = [];
// Grab the <form> element.
let form = this._form;
if (!form) {
// This is the first time we run `init()`, bootstrap some things.
form = this._form = document.querySelector("#simulator-editor");
form.addEventListener("change", this.update.bind(this));
Simulators.on("configure", (e, simulator) => { this.edit(simulator) });
// Extract the list of device simulation options we'll support.
let deviceFields = form.querySelectorAll("*[data-device]");
this._deviceOptions = [].map.call(deviceFields, field => field.name);
}
// Append a new <option> to a <select> (or <optgroup>) element.
function opt(select, value, text) {
let option = document.createElement("option");
option.value = value;
option.textContent = text;
select.appendChild(option);
}
// Generate B2G version selector.
promises.push(Simulators.findSimulatorAddons().then(addons => {
this._addons = {};
form.version.innerHTML = "";
form.version.classList.remove("custom");
addons.forEach(addon => {
this._addons[addon.id] = addon;
opt(form.version, addon.id, addon.name);
});
opt(form.version, "custom", "");
opt(form.version, "pick", Strings.GetStringFromName("simulator_custom_binary"));
}));
// Generate profile selector.
form.profile.innerHTML = "";
form.profile.classList.remove("custom");
opt(form.profile, "default", Strings.GetStringFromName("simulator_default_profile"));
opt(form.profile, "custom", "");
opt(form.profile, "pick", Strings.GetStringFromName("simulator_custom_profile"));
// Generate example devices list.
form.device.innerHTML = "";
form.device.classList.remove("custom");
opt(form.device, "custom", Strings.GetStringFromName("simulator_custom_device"));
promises.push(GetDevices().then(devices => {
devices.TYPES.forEach(type => {
let b2gDevices = devices[type].filter(d => d.firefoxOS);
if (b2gDevices.length < 1) {
return;
}
let optgroup = document.createElement("optgroup");
optgroup.label = GetDeviceString(type);
b2gDevices.forEach(device => {
this._devices[device.name] = device;
opt(optgroup, device.name, device.name);
});
form.device.appendChild(optgroup);
});
}));
return promise.all(promises);
},
// Edit the configuration of an existing Simulator, or create a new one.
edit(simulator) {
// If no Simulator was given to edit, we're creating a new one.
if (!simulator) {
simulator = new Simulator(); // Default options.
Simulators.add(simulator);
}
this._simulator = null;
return this.init().then(() => {
this._simulator = simulator;
// Update the form fields.
this._form.name.value = simulator.name;
this.updateVersionSelector();
this.updateProfileSelector();
this.updateDeviceSelector();
this.updateDeviceFields();
});
},
// Close the configuration panel.
close() {
this._simulator = null;
window.parent.UI.openProject();
},
// Restore the simulator to its default configuration.
restoreDefaults() {
let simulator = this._simulator;
this.version = simulator.addon.id;
this.profile = "default";
simulator.restoreDefaults();
Simulators.emitUpdated();
return this.edit(simulator);
},
// Delete this simulator.
deleteSimulator() {
Simulators.remove(this._simulator);
this.close();
},
// Select an available option, or set the "custom" option.
updateSelector(selector, value) {
selector.value = value;
if (selector[selector.selectedIndex].value !== value) {
selector.value = "custom";
selector.classList.add("custom");
selector[selector.selectedIndex].textContent = value;
}
},
// VERSION: Can be an installed `addon.id` or a custom binary path.
get version() {
return this._simulator.options.b2gBinary || this._simulator.addon.id;
},
set version(value) {
let form = this._form;
let simulator = this._simulator;
let oldVer = simulator.version;
if (this._addons[value]) {
// `value` is a simulator addon ID.
simulator.addon = this._addons[value];
simulator.options.b2gBinary = null;
} else {
// `value` is a custom binary path.
simulator.options.b2gBinary = value;
// TODO (Bug 1146531) Indicate that a custom profile is now required.
}
// If `form.name` contains the old version, update its last occurrence.
if (form.name.value.contains(oldVer) && simulator.version !== oldVer) {
let regex = new RegExp("(.*)" + oldVer);
let name = form.name.value.replace(regex, "$1" + simulator.version);
simulator.options.name = form.name.value = Simulators.uniqueName(name);
}
},
updateVersionSelector() {
this.updateSelector(this._form.version, this.version);
},
// PROFILE. Can be "default" or a custom profile directory path.
get profile() {
return this._simulator.options.gaiaProfile || "default";
},
set profile(value) {
this._simulator.options.gaiaProfile = (value == "default" ? null : value);
},
updateProfileSelector() {
this.updateSelector(this._form.profile, this.profile);
},
// DEVICE. Can be an existing `device.name` or "custom".
get device() {
let devices = this._devices;
let simulator = this._simulator;
// Search for the name of a device matching current simulator options.
for (let name in devices) {
let match = true;
for (let option of this._deviceOptions) {
if (simulator.options[option] === devices[name][option]) {
continue;
}
match = false;
break;
}
if (match) {
return name;
}
}
return "custom";
},
set device(name) {
let device = this._devices[name];
if (!device) {
return;
}
let form = this._form;
let simulator = this._simulator;
this._deviceOptions.forEach(option => {
simulator.options[option] = form[option].value = device[option] || null;
});
// TODO (Bug 1146531) Indicate when a custom profile is required (e.g. for
// tablet, TV…).
},
updateDeviceSelector() {
this.updateSelector(this._form.device, this.device);
},
// Erase any current values, trust only the `simulator.options`.
updateDeviceFields() {
let form = this._form;
let simulator = this._simulator;
this._deviceOptions.forEach(option => {
form[option].value = simulator.options[option];
});
},
// Handle a change in our form's fields.
update(event) {
let simulator = this._simulator;
if (!simulator) {
return;
}
let form = this._form;
let input = event.target;
switch (input.name) {
case "name":
simulator.options.name = input.value;
break;
case "version":
switch (input.value) {
case "pick":
let file = utils.getCustomBinary(window);
if (file) {
this.version = file.path;
}
// Whatever happens, don't stay on the "pick" option.
this.updateVersionSelector();
break;
case "custom":
this.version = input[input.selectedIndex].textContent;
break;
default:
this.version = input.value;
}
break;
case "profile":
switch (input.value) {
case "pick":
let directory = utils.getCustomProfile(window);
if (directory) {
this.profile = directory.path;
}
// Whatever happens, don't stay on the "pick" option.
this.updateProfileSelector();
break;
case "custom":
this.profile = input[input.selectedIndex].textContent;
break;
default:
this.profile = input.value;
}
break;
case "device":
this.device = input.value;
break;
default:
simulator.options[input.name] = input.value || null;
this.updateDeviceSelector();
}
Simulators.emitUpdated();
},
};
window.addEventListener("load", function onLoad() {
document.querySelector("#close").onclick = e => {
SimulatorEditor.close();
};
document.querySelector("#reset").onclick = e => {
SimulatorEditor.restoreDefaults();
};
document.querySelector("#remove").onclick = e => {
SimulatorEditor.deleteSimulator();
};
// We just loaded, so we probably missed the first configure request.
SimulatorEditor.edit(Simulators._lastConfiguredSimulator);
});