Files
tubestation/browser/extensions/activity-stream/lib/ASRouterTargeting.jsm
2018-06-29 11:59:55 -07:00

79 lines
2.7 KiB
JavaScript

ChromeUtils.import("resource://gre/modules/components-utils/FilterExpressions.jsm");
ChromeUtils.import("resource://gre/modules/Services.jsm");
ChromeUtils.defineModuleGetter(this, "ProfileAge",
"resource://gre/modules/ProfileAge.jsm");
ChromeUtils.import("resource://gre/modules/Console.jsm");
const FXA_USERNAME_PREF = "services.sync.username";
const ONBOARDING_EXPERIMENT_PREF = "browser.newtabpage.activity-stream.asrouterOnboardingCohort";
/**
* removeRandomItemFromArray - Removes a random item from the array and returns it.
*
* @param {Array} arr An array of items
* @returns one of the items in the array
*/
function removeRandomItemFromArray(arr) {
return arr.splice(Math.floor(Math.random() * arr.length), 1)[0];
}
const TargetingGetters = {
get profileAgeCreated() {
return new ProfileAge(null, null).created;
},
get profileAgeReset() {
return new ProfileAge(null, null).reset;
},
get hasFxAccount() {
return Services.prefs.prefHasUserValue(FXA_USERNAME_PREF);
},
// Temporary targeting function for the purposes of running the simplified onboarding experience
get isInExperimentCohort() {
return Services.prefs.getIntPref(ONBOARDING_EXPERIMENT_PREF, 0);
}
};
this.ASRouterTargeting = {
Environment: TargetingGetters,
isMatch(filterExpression, target, context = this.Environment) {
return FilterExpressions.eval(filterExpression, context);
},
/**
* findMatchingMessage - Given an array of messages, returns one message
* whos targeting expression evaluates to true
*
* @param {Array} messages An array of AS router messages
* @param {obj|null} context A FilterExpression context. Defaults to TargetingGetters above.
* @returns {obj} an AS router message
*/
async findMatchingMessage(messages, target, context) {
const arrayOfItems = [...messages];
let match;
let candidate;
while (!match && arrayOfItems.length) {
candidate = removeRandomItemFromArray(arrayOfItems);
if (candidate && !candidate.trigger && (!candidate.targeting || await this.isMatch(candidate.targeting, target, context))) {
match = candidate;
}
}
return match;
},
async findMatchingMessageWithTrigger(messages, target, trigger, context) {
const arrayOfItems = [...messages];
let match;
let candidate;
while (!match && arrayOfItems.length) {
candidate = removeRandomItemFromArray(arrayOfItems);
if (candidate && candidate.trigger === trigger && (!candidate.targeting || await this.isMatch(candidate.targeting, target, context))) {
match = candidate;
}
}
return match;
}
};
this.EXPORTED_SYMBOLS = ["ASRouterTargeting", "removeRandomItemFromArray"];