176 lines
5.7 KiB
JavaScript
176 lines
5.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/. */
|
|
|
|
"use strict";
|
|
|
|
var Cc = Components.classes;
|
|
var Cu = Components.utils;
|
|
var Ci = Components.interfaces;
|
|
|
|
const {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
|
|
const {XPCOMUtils} = require("resource://gre/modules/XPCOMUtils.jsm");
|
|
const Services = require("Services");
|
|
const {FileUtils} = require("resource://gre/modules/FileUtils.jsm");
|
|
const {AppProjects} = require("devtools/client/webide/modules/app-projects");
|
|
const {AppManager} = require("devtools/client/webide/modules/app-manager");
|
|
const {getJSON} = require("devtools/client/shared/getjson");
|
|
|
|
XPCOMUtils.defineLazyModuleGetter(this, "ZipUtils", "resource://gre/modules/ZipUtils.jsm");
|
|
XPCOMUtils.defineLazyModuleGetter(this, "Downloads", "resource://gre/modules/Downloads.jsm");
|
|
|
|
const TEMPLATES_URL = "devtools.webide.templatesURL";
|
|
|
|
var gTemplateList = null;
|
|
|
|
// See bug 989619
|
|
console.log = console.log.bind(console);
|
|
console.warn = console.warn.bind(console);
|
|
console.error = console.error.bind(console);
|
|
|
|
window.addEventListener("load", function onLoad() {
|
|
window.removeEventListener("load", onLoad);
|
|
let projectNameNode = document.querySelector("#project-name");
|
|
projectNameNode.addEventListener("input", canValidate, true);
|
|
getTemplatesJSON();
|
|
}, true);
|
|
|
|
function getTemplatesJSON() {
|
|
getJSON(TEMPLATES_URL).then(list => {
|
|
if (!Array.isArray(list)) {
|
|
throw new Error("JSON response not an array");
|
|
}
|
|
if (list.length == 0) {
|
|
throw new Error("JSON response is an empty array");
|
|
}
|
|
gTemplateList = list;
|
|
let templatelistNode = document.querySelector("#templatelist");
|
|
templatelistNode.innerHTML = "";
|
|
for (let template of list) {
|
|
let richlistitemNode = document.createElement("richlistitem");
|
|
let imageNode = document.createElement("image");
|
|
imageNode.setAttribute("src", template.icon);
|
|
let labelNode = document.createElement("label");
|
|
labelNode.setAttribute("value", template.name);
|
|
let descriptionNode = document.createElement("description");
|
|
descriptionNode.textContent = template.description;
|
|
let vboxNode = document.createElement("vbox");
|
|
vboxNode.setAttribute("flex", "1");
|
|
richlistitemNode.appendChild(imageNode);
|
|
vboxNode.appendChild(labelNode);
|
|
vboxNode.appendChild(descriptionNode);
|
|
richlistitemNode.appendChild(vboxNode);
|
|
templatelistNode.appendChild(richlistitemNode);
|
|
}
|
|
templatelistNode.selectedIndex = 0;
|
|
|
|
/* Chrome mochitest support */
|
|
let testOptions = window.arguments[0].testOptions;
|
|
if (testOptions) {
|
|
templatelistNode.selectedIndex = testOptions.index;
|
|
document.querySelector("#project-name").value = testOptions.name;
|
|
doOK();
|
|
}
|
|
}, (e) => {
|
|
failAndBail("Can't download app templates: " + e);
|
|
});
|
|
}
|
|
|
|
function failAndBail(msg) {
|
|
let promptService = Cc["@mozilla.org/embedcomp/prompt-service;1"].getService(Ci.nsIPromptService);
|
|
promptService.alert(window, "error", msg);
|
|
window.close();
|
|
}
|
|
|
|
function canValidate() {
|
|
let projectNameNode = document.querySelector("#project-name");
|
|
let dialogNode = document.querySelector("dialog");
|
|
if (projectNameNode.value.length > 0) {
|
|
dialogNode.removeAttribute("buttondisabledaccept");
|
|
} else {
|
|
dialogNode.setAttribute("buttondisabledaccept", "true");
|
|
}
|
|
}
|
|
|
|
function doOK() {
|
|
let projectName = document.querySelector("#project-name").value;
|
|
|
|
if (!projectName) {
|
|
console.error("No project name");
|
|
return false;
|
|
}
|
|
|
|
if (!gTemplateList) {
|
|
console.error("No template index");
|
|
return false;
|
|
}
|
|
|
|
let templatelistNode = document.querySelector("#templatelist");
|
|
if (templatelistNode.selectedIndex < 0) {
|
|
console.error("No template selected");
|
|
return false;
|
|
}
|
|
|
|
let folder;
|
|
|
|
/* Chrome mochitest support */
|
|
let testOptions = window.arguments[0].testOptions;
|
|
if (testOptions) {
|
|
folder = testOptions.folder;
|
|
} else {
|
|
let fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
|
|
fp.init(window, "Select directory where to create app directory", Ci.nsIFilePicker.modeGetFolder);
|
|
let res = fp.show();
|
|
if (res == Ci.nsIFilePicker.returnCancel) {
|
|
console.error("No directory selected");
|
|
return false;
|
|
}
|
|
folder = fp.file;
|
|
}
|
|
|
|
// Create subfolder with fs-friendly name of project
|
|
let subfolder = projectName.replace(/[\\/:*?"<>|]/g, "").toLowerCase();
|
|
let win = Services.wm.getMostRecentWindow("devtools:webide");
|
|
folder.append(subfolder);
|
|
|
|
try {
|
|
folder.create(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
|
|
} catch (e) {
|
|
win.UI.reportError("error_folderCreationFailed");
|
|
window.close();
|
|
return false;
|
|
}
|
|
|
|
// Download boilerplate zip
|
|
let template = gTemplateList[templatelistNode.selectedIndex];
|
|
let source = template.file;
|
|
let target = folder.clone();
|
|
target.append(subfolder + ".zip");
|
|
|
|
let bail = (e) => {
|
|
console.error(e);
|
|
window.close();
|
|
};
|
|
|
|
Downloads.fetch(source, target).then(() => {
|
|
ZipUtils.extractFiles(target, folder);
|
|
target.remove(false);
|
|
AppProjects.addPackaged(folder).then((project) => {
|
|
window.arguments[0].location = project.location;
|
|
AppManager.validateAndUpdateProject(project).then(() => {
|
|
if (project.manifest) {
|
|
project.manifest.name = projectName;
|
|
AppManager.writeManifest(project).then(() => {
|
|
AppManager.validateAndUpdateProject(project).then(
|
|
() => {window.close();}, bail);
|
|
}, bail);
|
|
} else {
|
|
bail("Manifest not found");
|
|
}
|
|
}, bail);
|
|
}, bail);
|
|
}, bail);
|
|
|
|
return false;
|
|
}
|