Mypal/devtools/client/webide/content/newapp.js

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;
}