svgedit/firefox-extension/handlers.js

61 lines
2.1 KiB
JavaScript

/* global svgCanvas, jQuery, Components, netscape */
// Note: This JavaScript file must be included as the last script on the main HTML editor page to override the open/save handlers
jQuery(function () {
if (!window.Components) return;
/**
* Offer choice of file.
* @param {boolean} readflag
* @returns {nsILocalFile}
*/
function mozFilePicker (readflag) {
const fp = window.Components.classes['@mozilla.org/filepicker;1']
.createInstance(Components.interfaces.nsIFilePicker);
if (readflag) fp.init(window, 'Pick a SVG file', fp.modeOpen);
else fp.init(window, 'Pick a SVG file', fp.modeSave);
fp.defaultExtension = '*.svg';
fp.show();
return fp.file;
}
svgCanvas.setCustomHandlers({
open () {
try {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
const file = mozFilePicker(true);
if (!file) {
return;
}
const inputStream = Components.classes['@mozilla.org/network/file-input-stream;1'].createInstance(Components.interfaces.nsIFileInputStream);
inputStream.init(file, 0x01, 0o00004, null);
const sInputStream = Components.classes['@mozilla.org/scriptableinputstream;1'].createInstance(Components.interfaces.nsIScriptableInputStream);
sInputStream.init(inputStream);
svgCanvas.setSvgString(sInputStream.read(sInputStream.available()));
} catch (e) {
console.log('Exception while attempting to load' + e); // eslint-disable-line no-console
}
},
save (svg, str) {
try {
const file = mozFilePicker(false);
if (!file) {
return;
}
if (!file.exists()) {
file.create(0, 0o0664);
}
const out = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream);
out.init(file, 0x20 | 0x02, 0o00004, null); // eslint-disable-line no-bitwise
out.write(str, str.length);
out.flush();
out.close();
} catch (e) {
alert(e); // eslint-disable-line no-alert
}
}
});
});