Bug 1334975 - Get rid of nsIFilePicker.show() use in gecko, r=Gijs, r=ochameau

This commit is contained in:
Andrea Marchesini 2017-02-21 07:51:00 +01:00
parent 920b5f6d15
commit 5da6bc7a06
24 changed files with 476 additions and 373 deletions

View File

@ -47,22 +47,23 @@ module.exports = createClass({
fp.init(window,
Strings.GetStringFromName("selectAddonFromFile2"),
Ci.nsIFilePicker.modeOpen);
let res = fp.show();
if (res == Ci.nsIFilePicker.returnCancel || !fp.file) {
return;
}
let file = fp.file;
// AddonManager.installTemporaryAddon accepts either
// addon directory or final xpi file.
if (!file.isDirectory() && !file.leafName.endsWith(".xpi")) {
file = file.parent;
}
fp.open(res => {
if (res == Ci.nsIFilePicker.returnCancel || !fp.file) {
return;
}
let file = fp.file;
// AddonManager.installTemporaryAddon accepts either
// addon directory or final xpi file.
if (!file.isDirectory() && !file.leafName.endsWith(".xpi")) {
file = file.parent;
}
AddonManager.installTemporaryAddon(file)
.catch(e => {
console.error(e);
this.setState({ installError: e.message });
});
AddonManager.installTemporaryAddon(file)
.catch(e => {
console.error(e);
this.setState({ installError: e.message });
});
});
},
render() {

View File

@ -113,7 +113,7 @@ function getTabList(document) {
function* installAddon({document, path, name, isWebExtension}) {
// Mock the file picker to select a test addon
let MockFilePicker = SpecialPowers.MockFilePicker;
MockFilePicker.init(null);
MockFilePicker.init(window);
let file = getSupportsFile(path);
MockFilePicker.returnFiles = [file.file];

View File

@ -357,38 +357,40 @@ var SnapshotsListView = Heritage.extend(WidgetMethods, {
fp.appendFilter(L10N.getStr("snapshotsList.saveDialogJSONFilter"), "*.json");
fp.appendFilter(L10N.getStr("snapshotsList.saveDialogAllFilter"), "*.*");
if (fp.show() != Ci.nsIFilePicker.returnOK) {
return;
}
let channel = NetUtil.newChannel({
uri: NetUtil.newURI(fp.file), loadUsingSystemPrincipal: true});
channel.contentType = "text/plain";
NetUtil.asyncFetch(channel, (inputStream, status) => {
if (!Components.isSuccessCode(status)) {
console.error("Could not import recorded animation frame snapshot file.");
return;
}
try {
let string = NetUtil.readInputStreamToString(inputStream, inputStream.available());
var data = JSON.parse(string);
} catch (e) {
console.error("Could not read animation frame snapshot file.");
return;
}
if (data.fileType != CALLS_LIST_SERIALIZER_IDENTIFIER) {
console.error("Unrecognized animation frame snapshot file.");
fp.open(rv => {
if (rv != Ci.nsIFilePicker.returnOK) {
return;
}
// Add a `isLoadedFromDisk` flag on everything to avoid sending invalid
// requests to the backend, since we're not dealing with actors anymore.
let snapshotItem = this.addSnapshot();
snapshotItem.isLoadedFromDisk = true;
data.calls.forEach(e => e.isLoadedFromDisk = true);
let channel = NetUtil.newChannel({
uri: NetUtil.newURI(fp.file), loadUsingSystemPrincipal: true});
channel.contentType = "text/plain";
this.customizeSnapshot(snapshotItem, data.calls, data);
NetUtil.asyncFetch(channel, (inputStream, status) => {
if (!Components.isSuccessCode(status)) {
console.error("Could not import recorded animation frame snapshot file.");
return;
}
try {
let string = NetUtil.readInputStreamToString(inputStream, inputStream.available());
var data = JSON.parse(string);
} catch (e) {
console.error("Could not read animation frame snapshot file.");
return;
}
if (data.fileType != CALLS_LIST_SERIALIZER_IDENTIFIER) {
console.error("Unrecognized animation frame snapshot file.");
return;
}
// Add a `isLoadedFromDisk` flag on everything to avoid sending invalid
// requests to the backend, since we're not dealing with actors anymore.
let snapshotItem = this.addSnapshot();
snapshotItem.isLoadedFromDisk = true;
data.calls.forEach(e => e.isLoadedFromDisk = true);
this.customizeSnapshot(snapshotItem, data.calls, data);
});
});
},

View File

@ -50,11 +50,11 @@ var JsonView = {
* in the parent process.
*/
onSave: function (message) {
let value = message.data;
let file = JsonViewUtils.getTargetFile();
if (file) {
JsonViewUtils.saveToFile(file, value);
}
JsonViewUtils.getTargetFile(file => {
if (file) {
JsonViewUtils.saveToFile(file, message.data);
}
});
}
};

View File

@ -23,21 +23,24 @@ const OPEN_FLAGS = {
* Open File Save As dialog and let the user to pick proper file location.
*/
exports.getTargetFile = function () {
let fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
return new Promise(resolve => {
let fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
let win = getMostRecentBrowserWindow();
fp.init(win, null, Ci.nsIFilePicker.modeSave);
fp.appendFilter("JSON Files", "*.json; *.jsonp;");
fp.appendFilters(Ci.nsIFilePicker.filterText);
fp.appendFilters(Ci.nsIFilePicker.filterAll);
fp.filterIndex = 0;
let win = getMostRecentBrowserWindow();
fp.init(win, null, Ci.nsIFilePicker.modeSave);
fp.appendFilter("JSON Files", "*.json; *.jsonp;");
fp.appendFilters(Ci.nsIFilePicker.filterText);
fp.appendFilters(Ci.nsIFilePicker.filterAll);
fp.filterIndex = 0;
let rv = fp.show();
if (rv == Ci.nsIFilePicker.returnOK || rv == Ci.nsIFilePicker.returnReplace) {
return fp.file;
}
return null;
fp.open(rv => {
if (rv == Ci.nsIFilePicker.returnOK || rv == Ci.nsIFilePicker.returnReplace) {
resolve(fp.file);
} else {
resolve(null);
}
});
});
};
/**

View File

@ -70,22 +70,22 @@ const HarExporter = {
// Get target file for exported data. Bail out, if the user
// presses cancel.
let file = HarUtils.getTargetFile(options.defaultFileName,
options.jsonp, options.compress);
return HarUtils.getTargetFile(options.defaultFileName, options.jsonp,
options.compress).then(file => {
if (!file) {
return null;
}
if (!file) {
return Promise.resolve();
}
trace.log("HarExporter.save; " + options.defaultFileName, options);
trace.log("HarExporter.save; " + options.defaultFileName, options);
return this.fetchHarData(options).then(jsonString => {
if (!HarUtils.saveToFile(file, jsonString, options.compress)) {
let msg = "Failed to save HAR file at: " + options.defaultFileName;
console.error(msg);
}
return jsonString;
});
return this.fetchHarData(options).then(jsonString => {
if (!HarUtils.saveToFile(file, jsonString, options.compress)) {
let msg = "Failed to save HAR file at: " + options.defaultFileName;
console.error(msg);
}
return jsonString;
});
});
},
/**

View File

@ -56,7 +56,7 @@ var HarUtils = {
* Open File Save As dialog and let the user pick the proper file
* location for generated HAR log.
*/
getTargetFile: function (fileName, jsonp, compress) {
getTargetFile: function (fileName, jsonp, compress, cb) {
let browser = getMostRecentBrowserWindow();
let fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
@ -68,12 +68,13 @@ var HarUtils = {
fp.defaultString = this.getHarFileName(fileName, jsonp, compress);
let rv = fp.show();
if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) {
return fp.file;
}
return null;
fp.open(rv => {
if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) {
cb(fp.file);
} else {
cb(null);
}
});
},
getHarFileName: function (defaultFileName, jsonp, compress) {

View File

@ -359,9 +359,11 @@ var PerformanceView = {
fp.appendFilter(L10N.getStr("recordingsList.saveDialogJSONFilter"), "*.json");
fp.appendFilter(L10N.getStr("recordingsList.saveDialogAllFilter"), "*.*");
if (fp.show() == Ci.nsIFilePicker.returnOK) {
this.emit(EVENTS.UI_IMPORT_RECORDING, fp.file);
}
fp.open(rv => {
if (rv == Ci.nsIFilePicker.returnOK) {
this.emit(EVENTS.UI_IMPORT_RECORDING, fp.file);
}
});
},
/**

View File

@ -110,62 +110,65 @@ function doOK() {
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;
let promise = new Promise((resolve, reject) => {
let testOptions = window.arguments[0].testOptions;
if (testOptions) {
resolve(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);
fp.open(res => {
if (res == Ci.nsIFilePicker.returnCancel) {
console.error("No directory selected");
reject(null);
} else {
resolve(fp.file);
}
});
}
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");
}
promise.then(folder => {
// 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;
}
// Download boilerplate zip
let template = gTemplateList[templatelistNode.selectedIndex];
let source = template.file;
let target = folder.clone();
target.append(subfolder + ".zip");
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);
}, bail);

View File

@ -289,12 +289,13 @@ var SimulatorEditor = {
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();
utils.getCustomBinary(window).then(file => {
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;
@ -306,12 +307,13 @@ var SimulatorEditor = {
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();
utils.getCustomProfile(window).then(directory => {
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;

View File

@ -92,7 +92,7 @@ ProjectList.prototype = {
let parentWindow = this._parentWindow;
let UI = this._UI;
return UI.busyUntil(Task.spawn(function* () {
let directory = utils.getPackagedDirectory(parentWindow, location);
let directory = yield utils.getPackagedDirectory(parentWindow, location);
if (!directory) {
// User cancelled directory selection

View File

@ -15,15 +15,20 @@ exports.doesFileExist = doesFileExist;
function _getFile(location, ...pickerParams) {
if (location) {
return new FileUtils.File(location);
return Promise.resolve(new FileUtils.File(location));
}
let fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
fp.init(...pickerParams);
let res = fp.show();
if (res == Ci.nsIFilePicker.returnCancel) {
return null;
}
return fp.file;
return new Promise(resolve => {
fp.open(res => {
if (res == Ci.nsIFilePicker.returnCancel) {
resolve(null);
} else {
resolve(fp.file);
}
});
});
}
function getCustomBinary(window, location) {

View File

@ -167,10 +167,12 @@ function openFile()
.createInstance(nsIFilePicker);
fp.init(window, "Select a File", nsIFilePicker.modeOpen);
fp.appendFilters(nsIFilePicker.filterHTML | nsIFilePicker.filterAll);
if (fp.show() == nsIFilePicker.returnOK && fp.fileURL.spec &&
fp.fileURL.spec.length > 0) {
gBrowser.loadURI(fp.fileURL.spec);
}
fp.open(rv => {
if (rv == nsIFilePicker.returnOK && fp.fileURL.spec &&
fp.fileURL.spec.length > 0) {
gBrowser.loadURI(fp.fileURL.spec);
}
});
}
const LDB_RDFNS = "http://mozilla.org/newlayout/LDB-rdf#";
const NC_RDFNS = "http://home.netscape.com/NC-rdf#";
@ -264,17 +266,19 @@ RTestIndexList.prototype = {
fp.init(window, "New Regression Test List", nsIFilePicker.modeOpen);
fp.appendFilters(nsIFilePicker.filterAll);
fp.defaultString = "rtest.lst";
if (fp.show() != nsIFilePicker.returnOK)
return;
fp.open(rv => {
if (rv != nsIFilePicker.returnOK) {
return;
}
var file = fp.file.persistentDescriptor;
var resource = this.mRDFService.GetResource(file);
var literal = this.mRDFService.GetLiteral(file);
this.mDataSource.Assert(this.mLDB_Root, this.mNC_Child, resource, true);
this.mDataSource.Assert(resource, this.mNC_Name, literal, true);
this.save();
var file = fp.file.persistentDescriptor;
var resource = this.mRDFService.GetResource(file);
var literal = this.mRDFService.GetLiteral(file);
this.mDataSource.Assert(this.mLDB_Root, this.mNC_Child, resource, true);
this.mDataSource.Assert(resource, this.mNC_Name, literal, true);
this.save();
});
},
remove : function(file)

View File

@ -332,10 +332,11 @@ function backupCerts()
fp.appendFilter(bundle.getString("file_browse_PKCS12_spec"),
"*.p12");
fp.appendFilters(nsIFilePicker.filterAll);
var rv = fp.show();
if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) {
certdb.exportPKCS12File(fp.file, selected_certs.length, selected_certs);
}
fp.open(rv => {
if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) {
certdb.exportPKCS12File(fp.file, selected_certs.length, selected_certs);
}
});
}
function backupAllCerts()
@ -367,7 +368,11 @@ function restoreCerts()
fp.appendFilter(bundle.getString("file_browse_Certificate_spec"),
gCertFileTypes);
fp.appendFilters(nsIFilePicker.filterAll);
if (fp.show() == nsIFilePicker.returnOK) {
fp.open(rv => {
if (rv != nsIFilePicker.returnOK) {
return;
}
// If this is an X509 user certificate, import it as one.
var isX509FileType = false;
@ -407,7 +412,7 @@ function restoreCerts()
caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
caTreeView.selection.clearSelection();
enableBackupAllButton();
}
});
}
function exportCerts()
@ -485,11 +490,13 @@ function addCACerts()
fp.appendFilter(bundle.getString("file_browse_Certificate_spec"),
gCertFileTypes);
fp.appendFilters(nsIFilePicker.filterAll);
if (fp.show() == nsIFilePicker.returnOK) {
certdb.importCertsFromFile(fp.file, nsIX509Cert.CA_CERT);
caTreeView.loadCerts(nsIX509Cert.CA_CERT);
caTreeView.selection.clearSelection();
}
fp.open(rv => {
if (rv == nsIFilePicker.returnOK) {
certdb.importCertsFromFile(fp.file, nsIX509Cert.CA_CERT);
caTreeView.loadCerts(nsIX509Cert.CA_CERT);
caTreeView.selection.clearSelection();
}
});
}
function onSmartCardChange()
@ -519,14 +526,16 @@ function addEmailCert()
fp.appendFilter(bundle.getString("file_browse_Certificate_spec"),
gCertFileTypes);
fp.appendFilters(nsIFilePicker.filterAll);
if (fp.show() == nsIFilePicker.returnOK) {
certdb.importCertsFromFile(fp.file, nsIX509Cert.EMAIL_CERT);
var certcache = certdb.getCerts();
emailTreeView.loadCertsFromCache(certcache, nsIX509Cert.EMAIL_CERT);
emailTreeView.selection.clearSelection();
caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
caTreeView.selection.clearSelection();
}
fp.open(rv => {
if (rv == nsIFilePicker.returnOK) {
certdb.importCertsFromFile(fp.file, nsIX509Cert.EMAIL_CERT);
var certcache = certdb.getCerts();
emailTreeView.loadCertsFromCache(certcache, nsIX509Cert.EMAIL_CERT);
emailTreeView.selection.clearSelection();
caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
caTreeView.selection.clearSelection();
}
});
}
function addException()

View File

@ -76,6 +76,7 @@ this.MockFilePicker = {
this.returnFiles = [];
this.returnValue = null;
this.showCallback = null;
this.afterOpenCallback = null;
this.shown = false;
this.showing = false;
},
@ -210,6 +211,9 @@ MockFilePickerInstance.prototype = {
};
},
show: function() {
throw "This is not implemented";
},
_openInternal: function() {
MockFilePicker.displayDirectory = this.displayDirectory;
MockFilePicker.shown = true;
if (typeof MockFilePicker.showCallback == "function") {
@ -224,12 +228,17 @@ MockFilePickerInstance.prototype = {
this.window.setTimeout(function() {
let result = Components.interfaces.nsIFilePicker.returnCancel;
try {
result = this.show();
result = this._openInternal();
} catch(ex) {
}
if (aFilePickerShownCallback) {
aFilePickerShownCallback.done(result);
}
if (typeof MockFilePicker.afterOpenCallback == "function") {
this.window.setTimeout(() => {
MockFilePicker.afterOpenCallback(this);
}, 0);
}
}.bind(this), 0);
}
};

View File

@ -193,15 +193,17 @@ AppPicker.prototype =
fp.displayDirectory =
fileLoc.get(startLocation, Components.interfaces.nsILocalFile);
if (fp.show() == nsIFilePicker.returnOK && fp.file) {
var localHandlerApp =
Components.classes["@mozilla.org/uriloader/local-handler-app;1"].
createInstance(Components.interfaces.nsILocalHandlerApp);
localHandlerApp.executable = fp.file;
fp.open(rv => {
if (rv == nsIFilePicker.returnOK && fp.file) {
var localHandlerApp =
Components.classes["@mozilla.org/uriloader/local-handler-app;1"].
createInstance(Components.interfaces.nsILocalHandlerApp);
localHandlerApp.executable = fp.file;
this._incomingParams.handlerApp = localHandlerApp;
window.close();
}
this._incomingParams.handlerApp = localHandlerApp;
window.close();
}
});
return true;
}
}

View File

@ -302,7 +302,11 @@ function onLoad() {
// ---------------------------------------------------
function onAccept() {
if (gPrintSettings != null) {
let promise;
if (gPrintSettings == null) {
promise = Promise.resolve();
} else {
var print_howToEnableUI = gPrintSetInterface.kFrameEnableNone;
// save these out so they can be picked up by the device spec
@ -310,66 +314,75 @@ function onAccept() {
print_howToEnableUI = gPrintSettings.howToEnableFrameUI;
gPrintSettings.printToFile = dialog.fileCheck.checked;
if (gPrintSettings.printToFile && !chooseFile())
return false;
if (dialog.allpagesRadio.selected) {
gPrintSettings.printRange = gPrintSetInterface.kRangeAllPages;
} else if (dialog.rangeRadio.selected) {
gPrintSettings.printRange = gPrintSetInterface.kRangeSpecifiedPageRange;
} else if (dialog.selectionRadio.selected) {
gPrintSettings.printRange = gPrintSetInterface.kRangeSelection;
if (gPrintSettings.printToFile) {
promise = chooseFile();
} else {
promise = Promise.resolve();
}
gPrintSettings.startPageRange = dialog.frompageInput.value;
gPrintSettings.endPageRange = dialog.topageInput.value;
gPrintSettings.numCopies = dialog.numCopiesInput.value;
var frametype = gPrintSetInterface.kNoFrames;
if (print_howToEnableUI != gPrintSetInterface.kFrameEnableNone) {
if (dialog.aslaidoutRadio.selected) {
frametype = gPrintSetInterface.kFramesAsIs;
} else if (dialog.selectedframeRadio.selected) {
frametype = gPrintSetInterface.kSelectedFrame;
} else if (dialog.eachframesepRadio.selected) {
frametype = gPrintSetInterface.kEachFrameSep;
} else {
frametype = gPrintSetInterface.kSelectedFrame;
promise = promise.then(() => {
if (dialog.allpagesRadio.selected) {
gPrintSettings.printRange = gPrintSetInterface.kRangeAllPages;
} else if (dialog.rangeRadio.selected) {
gPrintSettings.printRange = gPrintSetInterface.kRangeSpecifiedPageRange;
} else if (dialog.selectionRadio.selected) {
gPrintSettings.printRange = gPrintSetInterface.kRangeSelection;
}
gPrintSettings.startPageRange = dialog.frompageInput.value;
gPrintSettings.endPageRange = dialog.topageInput.value;
gPrintSettings.numCopies = dialog.numCopiesInput.value;
var frametype = gPrintSetInterface.kNoFrames;
if (print_howToEnableUI != gPrintSetInterface.kFrameEnableNone) {
if (dialog.aslaidoutRadio.selected) {
frametype = gPrintSetInterface.kFramesAsIs;
} else if (dialog.selectedframeRadio.selected) {
frametype = gPrintSetInterface.kSelectedFrame;
} else if (dialog.eachframesepRadio.selected) {
frametype = gPrintSetInterface.kEachFrameSep;
} else {
frametype = gPrintSetInterface.kSelectedFrame;
}
}
gPrintSettings.printFrameType = frametype;
if (doDebug) {
dump("onAccept*********************************************\n");
dump("frametype " + frametype + "\n");
dump("numCopies " + gPrintSettings.numCopies + "\n");
dump("printRange " + gPrintSettings.printRange + "\n");
dump("printerName " + gPrintSettings.printerName + "\n");
dump("startPageRange " + gPrintSettings.startPageRange + "\n");
dump("endPageRange " + gPrintSettings.endPageRange + "\n");
dump("printToFile " + gPrintSettings.printToFile + "\n");
}
});
}
promise.then(() => {
var saveToPrefs = false;
saveToPrefs = gPrefs.getBoolPref("print.save_print_settings");
if (saveToPrefs && printService != null) {
var flags = gPrintSetInterface.kInitSavePaperSize |
gPrintSetInterface.kInitSaveEdges |
gPrintSetInterface.kInitSaveInColor |
gPrintSetInterface.kInitSaveShrinkToFit |
gPrintSetInterface.kInitSaveScaling;
printService.savePrintSettingsToPrefs(gPrintSettings, true, flags);
}
gPrintSettings.printFrameType = frametype;
if (doDebug) {
dump("onAccept*********************************************\n");
dump("frametype " + frametype + "\n");
dump("numCopies " + gPrintSettings.numCopies + "\n");
dump("printRange " + gPrintSettings.printRange + "\n");
dump("printerName " + gPrintSettings.printerName + "\n");
dump("startPageRange " + gPrintSettings.startPageRange + "\n");
dump("endPageRange " + gPrintSettings.endPageRange + "\n");
dump("printToFile " + gPrintSettings.printToFile + "\n");
// set return value to "print"
if (paramBlock) {
paramBlock.SetInt(0, 1);
} else {
dump("*** FATAL ERROR: No paramBlock\n");
}
}
var saveToPrefs = false;
window.close();
});
saveToPrefs = gPrefs.getBoolPref("print.save_print_settings");
if (saveToPrefs && printService != null) {
var flags = gPrintSetInterface.kInitSavePaperSize |
gPrintSetInterface.kInitSaveEdges |
gPrintSetInterface.kInitSaveInColor |
gPrintSetInterface.kInitSaveShrinkToFit |
gPrintSetInterface.kInitSaveScaling;
printService.savePrintSettingsToPrefs(gPrintSettings, true, flags);
}
// set return value to "print"
if (paramBlock) {
paramBlock.SetInt(0, 1);
} else {
dump("*** FATAL ERROR: No paramBlock\n");
}
return true;
return false;
}
// ---------------------------------------------------
@ -387,19 +400,17 @@ function onCancel() {
// ---------------------------------------------------
const nsIFilePicker = Components.interfaces.nsIFilePicker;
function chooseFile() {
try {
return new Promise(resolve => {
var fp = Components.classes["@mozilla.org/filepicker;1"]
.createInstance(nsIFilePicker);
fp.init(window, dialog.fpDialog.getAttribute("label"), nsIFilePicker.modeSave);
fp.appendFilters(nsIFilePicker.filterAll);
if (fp.show() != Components.interfaces.nsIFilePicker.returnCancel &&
fp.file && fp.file.path) {
gPrintSettings.toFileName = fp.file.path;
return true;
}
} catch (ex) {
dump(ex);
}
return false;
fp.open(rv => {
if (rv != Components.interfaces.nsIFilePicker.returnCancel &&
fp.file && fp.file.path) {
gPrintSettings.toFileName = fp.file.path;
resolve(null);
}
});
});
}

View File

@ -316,53 +316,55 @@ nsUnknownContentTypeDialog.prototype = {
if (lastDir && isUsableDirectory(lastDir))
picker.displayDirectory = lastDir;
if (picker.show() == nsIFilePicker.returnCancel) {
// null result means user cancelled.
aLauncher.saveDestinationAvailable(null);
return;
}
// Be sure to save the directory the user chose through the Save As...
// dialog as the new browser.download.dir since the old one
// didn't exist.
result = picker.file;
if (result) {
try {
// Remove the file so that it's not there when we ensure non-existence later;
// this is safe because for the file to exist, the user would have had to
// confirm that he wanted the file overwritten.
// Only remove file if final name exists
if (result.exists() && this.getFinalLeafName(result.leafName) == result.leafName)
result.remove(false);
}
catch (ex) {
// As it turns out, the failure to remove the file, for example due to
// permission error, will be handled below eventually somehow.
picker.open(returnValue => {
if (returnValue == nsIFilePicker.returnCancel) {
// null result means user cancelled.
aLauncher.saveDestinationAvailable(null);
return;
}
var newDir = result.parent.QueryInterface(Components.interfaces.nsILocalFile);
// Be sure to save the directory the user chose through the Save As...
// dialog as the new browser.download.dir since the old one
// didn't exist.
result = picker.file;
// Do not store the last save directory as a pref inside the private browsing mode
gDownloadLastDir.setFile(aLauncher.source, newDir);
try {
result = this.validateLeafName(newDir, result.leafName, null);
}
catch (ex) {
// When the chosen download directory is write-protected,
// display an informative error message.
// In all cases, download will be stopped.
if (ex.result == Components.results.NS_ERROR_FILE_ACCESS_DENIED) {
this.displayBadPermissionAlert();
aLauncher.saveDestinationAvailable(null);
return;
if (result) {
try {
// Remove the file so that it's not there when we ensure non-existence later;
// this is safe because for the file to exist, the user would have had to
// confirm that he wanted the file overwritten.
// Only remove file if final name exists
if (result.exists() && this.getFinalLeafName(result.leafName) == result.leafName)
result.remove(false);
}
catch (ex) {
// As it turns out, the failure to remove the file, for example due to
// permission error, will be handled below eventually somehow.
}
var newDir = result.parent.QueryInterface(Components.interfaces.nsILocalFile);
// Do not store the last save directory as a pref inside the private browsing mode
gDownloadLastDir.setFile(aLauncher.source, newDir);
try {
result = this.validateLeafName(newDir, result.leafName, null);
}
catch (ex) {
// When the chosen download directory is write-protected,
// display an informative error message.
// In all cases, download will be stopped.
if (ex.result == Components.results.NS_ERROR_FILE_ACCESS_DENIED) {
this.displayBadPermissionAlert();
aLauncher.saveDestinationAvailable(null);
return;
}
}
}
}
aLauncher.saveDestinationAvailable(result);
aLauncher.saveDestinationAvailable(result);
});
}.bind(this));
}.bind(this)).then(null, Components.utils.reportError);
},

View File

@ -1391,17 +1391,19 @@ var gViewController = {
fp.appendFilters(nsIFilePicker.filterAll);
} catch (e) { }
if (fp.show() != nsIFilePicker.returnOK)
return;
fp.open(result => {
if (result != nsIFilePicker.returnOK)
return;
let browser = getBrowserElement();
let files = fp.files;
while (files.hasMoreElements()) {
let file = files.getNext();
AddonManager.getInstallForFile(file, install => {
AddonManager.installAddonFromAOM(browser, document.documentURI, install);
});
}
let browser = getBrowserElement();
let files = fp.files;
while (files.hasMoreElements()) {
let file = files.getNext();
AddonManager.getInstallForFile(file, install => {
AddonManager.installAddonFromAOM(browser, document.documentURI, install);
});
}
});
}
},

View File

@ -374,10 +374,12 @@
}
} catch (e) {}
}
if (filePicker.show() != Ci.nsIFilePicker.returnCancel) {
this.value = filePicker.file.path;
this.inputChanged();
}
filePicker.open(rv => {
if (rv != Ci.nsIFilePicker.returnCancel && filePicker.file) {
this.value = filePicker.file.path;
this.inputChanged();
}
});
]]>
</body>
</method>

View File

@ -277,20 +277,25 @@ add_test(function() {
is(input.color, "#FF9900", "Color picker should have updated value");
is(Services.prefs.getCharPref("extensions.inlinesettings1.color"), "#FF9900", "Color pref should have been updated");
try {
ok(!settings[6].hasAttribute("first-row"), "Not the first row");
var button = gManagerWindow.document.getAnonymousElementByAttribute(settings[6], "anonid", "button");
input = gManagerWindow.document.getAnonymousElementByAttribute(settings[6], "anonid", "input");
is(input.value, "", "Label value should be empty");
is(input.tooltipText, "", "Label tooltip should be empty");
ok(!settings[6].hasAttribute("first-row"), "Not the first row");
var button = gManagerWindow.document.getAnonymousElementByAttribute(settings[6], "anonid", "button");
input = gManagerWindow.document.getAnonymousElementByAttribute(settings[6], "anonid", "input");
is(input.value, "", "Label value should be empty");
is(input.tooltipText, "", "Label tooltip should be empty");
var testFile = Services.dirsvc.get("ProfD", Ci.nsIFile);
testFile.append("\u2622");
var curProcD = Services.dirsvc.get("CurProcD", Ci.nsIFile);
var testFile = Services.dirsvc.get("ProfD", Ci.nsIFile);
testFile.append("\u2622");
var curProcD = Services.dirsvc.get("CurProcD", Ci.nsIFile);
MockFilePicker.returnFiles = [testFile];
MockFilePicker.returnValue = Ci.nsIFilePicker.returnOK;
MockFilePicker.returnFiles = [testFile];
MockFilePicker.returnValue = Ci.nsIFilePicker.returnOK;
let promise = new Promise(resolve => {
MockFilePicker.afterOpenCallback = resolve;
EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow);
});
promise.then(() => {
is(MockFilePicker.mode, Ci.nsIFilePicker.modeOpen, "File picker mode should be open file");
is(input.value, testFile.path, "Label value should match file chosen");
is(input.tooltipText, testFile.path, "Label tooltip should match file chosen");
@ -298,7 +303,12 @@ add_test(function() {
MockFilePicker.returnFiles = [curProcD];
MockFilePicker.returnValue = Ci.nsIFilePicker.returnCancel;
EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow);
return new Promise(resolve => {
MockFilePicker.afterOpenCallback = resolve;
EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow);
});
}).then(() => {
is(MockFilePicker.mode, Ci.nsIFilePicker.modeOpen, "File picker mode should be open file");
is(input.value, testFile.path, "Label value should not have changed");
is(input.tooltipText, testFile.path, "Label tooltip should not have changed");
@ -312,7 +322,12 @@ add_test(function() {
MockFilePicker.returnFiles = [testFile];
MockFilePicker.returnValue = Ci.nsIFilePicker.returnOK;
EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow);
return new Promise(resolve => {
MockFilePicker.afterOpenCallback = resolve;
EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow);
});
}).then(() => {
is(MockFilePicker.mode, Ci.nsIFilePicker.modeGetFolder, "File picker mode should be directory");
is(input.value, testFile.path, "Label value should match file chosen");
is(input.tooltipText, testFile.path, "Label tooltip should match file chosen");
@ -320,7 +335,12 @@ add_test(function() {
MockFilePicker.returnFiles = [curProcD];
MockFilePicker.returnValue = Ci.nsIFilePicker.returnCancel;
EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow);
return new Promise(resolve => {
MockFilePicker.afterOpenCallback = resolve;
EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow);
});
}).then(() => {
is(MockFilePicker.mode, Ci.nsIFilePicker.modeGetFolder, "File picker mode should be directory");
is(input.value, testFile.path, "Label value should not have changed");
is(input.tooltipText, testFile.path, "Label tooltip should not have changed");
@ -329,12 +349,12 @@ add_test(function() {
var unsizedInput = gManagerWindow.document.getAnonymousElementByAttribute(settings[2], "anonid", "input");
var sizedInput = gManagerWindow.document.getAnonymousElementByAttribute(settings[8], "anonid", "input");
is(unsizedInput.clientWidth > sizedInput.clientWidth, true, "Input with size attribute should be smaller than input without");
} finally {
}).then(() => {
button = gManagerWindow.document.getElementById("detail-prefs-btn");
is_element_hidden(button, "Preferences button should not be visible");
gCategoryUtilities.openType("extension", run_next_test);
}
});
});
});

View File

@ -269,23 +269,28 @@ add_test(function() {
is(input.color, "#FF9900", "Color picker should have updated value");
is(Services.prefs.getCharPref("extensions.inlinesettings1.color"), "#FF9900", "Color pref should have been updated");
try {
ok(!settings[6].hasAttribute("first-row"), "Not the first row");
var button = gManagerWindow.document.getAnonymousElementByAttribute(settings[6], "anonid", "button");
ok(!settings[6].hasAttribute("first-row"), "Not the first row");
var button = gManagerWindow.document.getAnonymousElementByAttribute(settings[6], "anonid", "button");
// Workaround for bug 1155324 - we need to ensure that the button is scrolled into view.
button.scrollIntoView();
// Workaround for bug 1155324 - we need to ensure that the button is scrolled into view.
button.scrollIntoView();
input = gManagerWindow.document.getAnonymousElementByAttribute(settings[6], "anonid", "input");
is(input.value, "", "Label value should be empty");
is(input.tooltipText, "", "Label tooltip should be empty");
input = gManagerWindow.document.getAnonymousElementByAttribute(settings[6], "anonid", "input");
is(input.value, "", "Label value should be empty");
is(input.tooltipText, "", "Label tooltip should be empty");
var profD = Services.dirsvc.get("ProfD", Ci.nsIFile);
var curProcD = Services.dirsvc.get("CurProcD", Ci.nsIFile);
var profD = Services.dirsvc.get("ProfD", Ci.nsIFile);
var curProcD = Services.dirsvc.get("CurProcD", Ci.nsIFile);
MockFilePicker.returnFiles = [profD];
MockFilePicker.returnValue = Ci.nsIFilePicker.returnOK;
MockFilePicker.returnFiles = [profD];
MockFilePicker.returnValue = Ci.nsIFilePicker.returnOK;
let promise = new Promise(resolve => {
MockFilePicker.afterOpenCallback = resolve;
EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow);
});
promise.then(() => {
is(MockFilePicker.mode, Ci.nsIFilePicker.modeOpen, "File picker mode should be open file");
is(input.value, profD.path, "Label value should match file chosen");
is(input.tooltipText, profD.path, "Label tooltip should match file chosen");
@ -293,7 +298,12 @@ add_test(function() {
MockFilePicker.returnFiles = [curProcD];
MockFilePicker.returnValue = Ci.nsIFilePicker.returnCancel;
EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow);
return promise = new Promise(resolve => {
MockFilePicker.afterOpenCallback = resolve;
EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow);
});
}).then(() => {
is(MockFilePicker.mode, Ci.nsIFilePicker.modeOpen, "File picker mode should be open file");
is(input.value, profD.path, "Label value should not have changed");
is(input.tooltipText, profD.path, "Label tooltip should not have changed");
@ -307,7 +317,12 @@ add_test(function() {
MockFilePicker.returnFiles = [profD];
MockFilePicker.returnValue = Ci.nsIFilePicker.returnOK;
EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow);
return new Promise(resolve => {
MockFilePicker.afterOpenCallback = resolve;
EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow);
});
}).then(() => {
is(MockFilePicker.mode, Ci.nsIFilePicker.modeGetFolder, "File picker mode should be directory");
is(input.value, profD.path, "Label value should match file chosen");
is(input.tooltipText, profD.path, "Label tooltip should match file chosen");
@ -315,18 +330,22 @@ add_test(function() {
MockFilePicker.returnFiles = [curProcD];
MockFilePicker.returnValue = Ci.nsIFilePicker.returnCancel;
EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow);
return new Promise(resolve => {
MockFilePicker.afterOpenCallback = resolve;
EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow);
});
}).then(() => {
is(MockFilePicker.mode, Ci.nsIFilePicker.modeGetFolder, "File picker mode should be directory");
is(input.value, profD.path, "Label value should not have changed");
is(input.tooltipText, profD.path, "Label tooltip should not have changed");
is(Services.prefs.getCharPref("extensions.inlinesettings1.directory"), profD.path, "Directory pref should not have changed");
} finally {
}).then(() => {
button = gManagerWindow.document.getElementById("detail-prefs-btn");
is_element_hidden(button, "Preferences button should not be visible");
gCategoryUtilities.openType("extension", run_next_test);
}
});
});
});

View File

@ -166,35 +166,37 @@ var dialog = {
fp.init(window, title, Ci.nsIFilePicker.modeOpen);
fp.appendFilters(Ci.nsIFilePicker.filterApps);
if (fp.show() == Ci.nsIFilePicker.returnOK && fp.file) {
let uri = Cc["@mozilla.org/network/util;1"].
getService(Ci.nsIIOService).
newFileURI(fp.file);
fp.open(rv => {
if (rv == Ci.nsIFilePicker.returnOK && fp.file) {
let uri = Cc["@mozilla.org/network/util;1"].
getService(Ci.nsIIOService).
newFileURI(fp.file);
let handlerApp = Cc["@mozilla.org/uriloader/local-handler-app;1"].
createInstance(Ci.nsILocalHandlerApp);
handlerApp.executable = fp.file;
let handlerApp = Cc["@mozilla.org/uriloader/local-handler-app;1"].
createInstance(Ci.nsILocalHandlerApp);
handlerApp.executable = fp.file;
// if this application is already in the list, select it and don't add it again
let parent = document.getElementById("items");
for (let i = 0; i < parent.childNodes.length; ++i) {
let elm = parent.childNodes[i];
if (elm.obj instanceof Ci.nsILocalHandlerApp && elm.obj.equals(handlerApp)) {
parent.selectedItem = elm;
parent.ensureSelectedElementIsVisible();
return;
// if this application is already in the list, select it and don't add it again
let parent = document.getElementById("items");
for (let i = 0; i < parent.childNodes.length; ++i) {
let elm = parent.childNodes[i];
if (elm.obj instanceof Ci.nsILocalHandlerApp && elm.obj.equals(handlerApp)) {
parent.selectedItem = elm;
parent.ensureSelectedElementIsVisible();
return;
}
}
let elm = document.createElement("richlistitem");
elm.setAttribute("type", "handler");
elm.setAttribute("name", fp.file.leafName);
elm.setAttribute("image", "moz-icon://" + uri.spec + "?size=32");
elm.obj = handlerApp;
parent.selectedItem = parent.insertBefore(elm, parent.firstChild);
parent.ensureSelectedElementIsVisible();
}
let elm = document.createElement("richlistitem");
elm.setAttribute("type", "handler");
elm.setAttribute("name", fp.file.leafName);
elm.setAttribute("image", "moz-icon://" + uri.spec + "?size=32");
elm.obj = handlerApp;
parent.selectedItem = parent.insertBefore(elm, parent.firstChild);
parent.ensureSelectedElementIsVisible();
}
});
},
/**

View File

@ -165,6 +165,8 @@ interface nsIFilePicker : nsISupports
attribute boolean addToRecentDocs;
/**
* This method is **deprecated**. Please use open()
*
* Show File Dialog. The dialog is displayed modally.
*
* @return returnOK if the user selects OK, returnCancel if the user selects cancel