49 lines
1.7 KiB
JavaScript
49 lines
1.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/. */
|
|
|
|
const NUL = 0x0;
|
|
const TAB = 0x9;
|
|
|
|
export var MacAttribution = {
|
|
/**
|
|
* The file path to the `.app` directory.
|
|
*/
|
|
get applicationPath() {
|
|
// On macOS, `GreD` is like "App.app/Contents/macOS". Return "App.app".
|
|
return Services.dirsvc.get("GreD", Ci.nsIFile).parent.parent.path;
|
|
},
|
|
|
|
async setAttributionString(aAttrStr, path = this.applicationPath) {
|
|
return IOUtils.setMacXAttr(
|
|
path,
|
|
"com.apple.application-instance",
|
|
new TextEncoder().encode(`__MOZCUSTOM__${aAttrStr}`)
|
|
);
|
|
},
|
|
|
|
async getAttributionString(path = this.applicationPath) {
|
|
let promise = IOUtils.getMacXAttr(path, "com.apple.application-instance");
|
|
return promise.then(bytes => {
|
|
// We need to process the extended attribute a little bit to isolate
|
|
// the attribution string:
|
|
// - nul bytes and tabs may be present in raw attribution strings, but are
|
|
// never part of the attribution data
|
|
// - attribution data is expected to be preceeded by the string `__MOZCUSTOM__`
|
|
let attrStr = new TextDecoder().decode(
|
|
bytes.filter(b => b != NUL && b != TAB)
|
|
);
|
|
|
|
if (attrStr.startsWith("__MOZCUSTOM__")) {
|
|
// Return everything after __MOZCUSTOM__
|
|
return attrStr.slice(13);
|
|
}
|
|
|
|
throw new Error(`No attribution data found in ${path}`);
|
|
});
|
|
},
|
|
|
|
async delAttributionString(path = this.applicationPath) {
|
|
return IOUtils.delMacXAttr(path, "com.apple.application-instance");
|
|
},
|
|
};
|