AppValidator.prototype._getPackagedManifestURL = function () { let manifestFile = this._getPackagedManifestFile(); if (!manifestFile) { return null; } return Services.io.newFileURI(manifestFile).spec; };
/** * Returns the full path of the file with the specified name in a * platform-independent and URL-like form. */ function getFilePath(aName, aAllowMissing=false) { let file = do_get_file(aName, aAllowMissing); let path = Services.io.newFileURI(file).spec; let filePrePath = "file://"; if ("nsILocalFileWin" in Ci && file instanceof Ci.nsILocalFileWin) { filePrePath += "/"; } return path.slice(filePrePath.length); }
_mapSourceToAddon: function () { try { var nsuri = Services.io.newURI(this.url.split(" -> ").pop(), null, null); } catch (e) { // We can't do anything with an invalid URI return; } let localURI = resolveURIToLocalPath(nsuri); if (!localURI) { return; } let id = mapURIToAddonID(localURI); if (!id) { return; } this._addonID = id; if (localURI instanceof Ci.nsIJARURI) { // The path in the add-on is easy for jar: uris this._addonPath = localURI.JAREntry; } else if (localURI instanceof Ci.nsIFileURL) { // For file: uris walk up to find the last directory that is part of the // add-on let target = localURI.file; let path = target.leafName; // We can assume that the directory containing the source file is part // of the add-on let root = target.parent; let file = root.parent; while (file && mapURIToAddonID(Services.io.newFileURI(file))) { path = root.leafName + "/" + path; root = file; file = file.parent; } if (!file) { const error = new Error("Could not find the root of the add-on for " + this.url); DevToolsUtils.reportException("SourceActor.prototype._mapSourceToAddon", error); return; } this._addonPath = path; } },
/** * Returns the full path of the file with the specified name in a * platform-independent and URL-like form. */ function getFilePath(name, allowMissing = false, usePlatformPathSeparator = false) { const file = do_get_file(name, allowMissing); let path = Services.io.newFileURI(file).spec; let filePrePath = "file://"; if ("nsILocalFileWin" in Ci && file instanceof Ci.nsILocalFileWin) { filePrePath += "/"; } path = path.slice(filePrePath.length); if (usePlatformPathSeparator && path.match(/^\w:/)) { path = path.replace(/\//g, "\\"); } return path; }
return (async function() { const packageDir = project.location; const validation = new AppValidator({ type: project.type, // Build process may place the manifest in a non-root directory location: packageDir, }); await validation.validate(); if (validation.manifest) { const manifest = validation.manifest; let iconPath; if (manifest.icons) { const size = Object.keys(manifest.icons).sort((a, b) => b - a)[0]; if (size) { iconPath = manifest.icons[size]; } } if (!iconPath) { project.icon = AppManager.DEFAULT_PROJECT_ICON; } else if (project.type == "hosted") { const manifestURL = Services.io.newURI(project.location); const origin = Services.io.newURI(manifestURL.prePath); project.icon = Services.io.newURI(iconPath, null, origin).spec; } else if (project.type == "packaged") { const projectFolder = FileUtils.File(packageDir); const folderURI = Services.io.newFileURI(projectFolder).spec; project.icon = folderURI + iconPath.replace(/^\/|\\/, ""); } project.manifest = validation.manifest; if ("name" in project.manifest) { project.name = project.manifest.name; } else { project.name = AppManager.DEFAULT_PROJECT_NAME; } } else { project.manifest = null; project.icon = AppManager.DEFAULT_PROJECT_ICON; project.name = AppManager.DEFAULT_PROJECT_NAME; } project.validationStatus = "valid"; if (validation.warnings.length > 0) { project.warningsCount = validation.warnings.length; project.warnings = validation.warnings; project.validationStatus = "warning"; } else { project.warnings = ""; project.warningsCount = 0; } if (validation.errors.length > 0) { project.errorsCount = validation.errors.length; project.errors = validation.errors; project.validationStatus = "error"; } else { project.errors = ""; project.errorsCount = 0; } if (project.warningsCount && project.errorsCount) { project.validationStatus = "error warning"; } if (project.type === "hosted" && project.location !== validation.manifestURL) { await AppProjects.updateLocation(project, validation.manifestURL); } else if (AppProjects.get(project.location)) { await AppProjects.update(project); } if (AppManager.selectedProject === project) { AppManager.update("project-validated"); } })();
/** * Takes a relative file path and returns the absolute file url for it. */ function getFileUrl(name, allowMissing = false) { const file = do_get_file(name, allowMissing); return Services.io.newFileURI(file).spec; }
/** * Takes a relative file path and returns the absolute file url for it. */ function getFileUrl(aName, aAllowMissing=false) { let file = do_get_file(aName, aAllowMissing); return Services.io.newFileURI(file).spec; }
var saveToFile = Task.async(function*(context, reply) { let document = context.environment.chromeDocument; let window = context.environment.chromeWindow; // Check there is a .png extension to filename if (!reply.filename.match(/.png$/i)) { reply.filename += ".png"; } let downloadsDir = yield Downloads.getPreferredDownloadsDirectory(); let downloadsDirExists = yield OS.File.exists(downloadsDir); if (downloadsDirExists) { // If filename is absolute, it will override the downloads directory and // still be applied as expected. reply.filename = OS.Path.join(downloadsDir, reply.filename); } let sourceURI = Services.io.newURI(reply.data, null, null); let targetFile = new FileUtils.File(reply.filename); let targetFileURI = Services.io.newFileURI(targetFile); // Create download and track its progress. // This is adapted from saveURL in contentAreaUtils.js, but simplified greatly // and modified to allow saving to arbitrary paths on disk. Using these // objects as opposed to just writing with OS.File allows us to tie into the // download manager to record a download entry and to get visual feedback from // the downloads toolbar button when the save is done. const nsIWBP = Ci.nsIWebBrowserPersist; const flags = nsIWBP.PERSIST_FLAGS_REPLACE_EXISTING_FILES | nsIWBP.PERSIST_FLAGS_FORCE_ALLOW_COOKIES | nsIWBP.PERSIST_FLAGS_BYPASS_CACHE | nsIWBP.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION; let isPrivate = PrivateBrowsingUtils.isContentWindowPrivate(document.defaultView); let persist = Cc["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"] .createInstance(Ci.nsIWebBrowserPersist); persist.persistFlags = flags; let tr = Cc["@mozilla.org/transfer;1"].createInstance(Ci.nsITransfer); tr.init(sourceURI, targetFileURI, "", null, null, null, persist, isPrivate); let listener = new DownloadListener(window, tr); persist.progressListener = listener; persist.savePrivacyAwareURI(sourceURI, null, document.documentURIObject, Ci.nsIHttpChannel .REFERRER_POLICY_NO_REFERRER_WHEN_DOWNGRADE, null, null, targetFileURI, isPrivate); try { // Await successful completion of the save via the listener yield listener.completed; reply.destinations.push(l10n.lookup("screenshotSavedToFile") + ` "${reply.filename}"`); } catch (ex) { console.error(ex); reply.destinations.push(l10n.lookup("screenshotErrorSavingToFile") + " " + reply.filename); } });