fune/toolkit/components/normandy/test/browser/browser_EventEmitter.js
Mike Cooper 3c101aa22a Bug 1436113 - Part 1: Move browser/extensions/shield-recipe-client to toolkit/components/normandy r=Gijs
MozReview-Commit-ID: LidgzhI4Z7h

--HG--
rename : browser/extensions/shield-recipe-client/content/AboutPages.jsm => toolkit/components/normandy/content/AboutPages.jsm
rename : browser/extensions/shield-recipe-client/content/about-studies/about-studies.css => toolkit/components/normandy/content/about-studies/about-studies.css
rename : browser/extensions/shield-recipe-client/content/about-studies/about-studies.html => toolkit/components/normandy/content/about-studies/about-studies.html
rename : browser/extensions/shield-recipe-client/content/about-studies/about-studies.js => toolkit/components/normandy/content/about-studies/about-studies.js
rename : browser/extensions/shield-recipe-client/content/about-studies/common.js => toolkit/components/normandy/content/about-studies/common.js
rename : browser/extensions/shield-recipe-client/content/about-studies/img/shield-logo.png => toolkit/components/normandy/content/about-studies/img/shield-logo.png
rename : browser/extensions/shield-recipe-client/content/about-studies/shield-studies.js => toolkit/components/normandy/content/about-studies/shield-studies.js
rename : browser/extensions/shield-recipe-client/content/shield-content-frame.js => toolkit/components/normandy/content/shield-content-frame.js
rename : browser/extensions/shield-recipe-client/content/shield-content-process.js => toolkit/components/normandy/content/shield-content-process.js
rename : browser/extensions/shield-recipe-client/docs/data-collection.rst => toolkit/components/normandy/docs/data-collection.rst
rename : browser/extensions/shield-recipe-client/docs/index.rst => toolkit/components/normandy/docs/index.rst
rename : browser/extensions/shield-recipe-client/jar.mn => toolkit/components/normandy/jar.mn
rename : browser/extensions/shield-recipe-client/lib/ActionSandboxManager.jsm => toolkit/components/normandy/lib/ActionSandboxManager.jsm
rename : browser/extensions/shield-recipe-client/lib/AddonStudies.jsm => toolkit/components/normandy/lib/AddonStudies.jsm
rename : browser/extensions/shield-recipe-client/lib/Addons.jsm => toolkit/components/normandy/lib/Addons.jsm
rename : browser/extensions/shield-recipe-client/lib/CleanupManager.jsm => toolkit/components/normandy/lib/CleanupManager.jsm
rename : browser/extensions/shield-recipe-client/lib/ClientEnvironment.jsm => toolkit/components/normandy/lib/ClientEnvironment.jsm
rename : browser/extensions/shield-recipe-client/lib/EventEmitter.jsm => toolkit/components/normandy/lib/EventEmitter.jsm
rename : browser/extensions/shield-recipe-client/lib/FilterExpressions.jsm => toolkit/components/normandy/lib/FilterExpressions.jsm
rename : browser/extensions/shield-recipe-client/lib/Heartbeat.jsm => toolkit/components/normandy/lib/Heartbeat.jsm
rename : browser/extensions/shield-recipe-client/lib/LogManager.jsm => toolkit/components/normandy/lib/LogManager.jsm
rename : browser/extensions/shield-recipe-client/lib/NormandyApi.jsm => toolkit/components/normandy/lib/NormandyApi.jsm
rename : browser/extensions/shield-recipe-client/lib/NormandyDriver.jsm => toolkit/components/normandy/lib/NormandyDriver.jsm
rename : browser/extensions/shield-recipe-client/lib/PreferenceExperiments.jsm => toolkit/components/normandy/lib/PreferenceExperiments.jsm
rename : browser/extensions/shield-recipe-client/lib/PreferenceFilters.jsm => toolkit/components/normandy/lib/PreferenceFilters.jsm
rename : browser/extensions/shield-recipe-client/lib/RecipeRunner.jsm => toolkit/components/normandy/lib/RecipeRunner.jsm
rename : browser/extensions/shield-recipe-client/lib/Sampling.jsm => toolkit/components/normandy/lib/Sampling.jsm
rename : browser/extensions/shield-recipe-client/lib/SandboxManager.jsm => toolkit/components/normandy/lib/SandboxManager.jsm
rename : browser/extensions/shield-recipe-client/lib/ShieldPreferences.jsm => toolkit/components/normandy/lib/ShieldPreferences.jsm
rename : browser/extensions/shield-recipe-client/lib/Storage.jsm => toolkit/components/normandy/lib/Storage.jsm
rename : browser/extensions/shield-recipe-client/lib/TelemetryEvents.jsm => toolkit/components/normandy/lib/TelemetryEvents.jsm
rename : browser/extensions/shield-recipe-client/lib/Uptake.jsm => toolkit/components/normandy/lib/Uptake.jsm
rename : browser/extensions/shield-recipe-client/lib/Utils.jsm => toolkit/components/normandy/lib/Utils.jsm
rename : browser/extensions/shield-recipe-client/moz.build => toolkit/components/normandy/moz.build
rename : browser/extensions/shield-recipe-client/skin/osx/Heartbeat.css => toolkit/components/normandy/skin/osx/Heartbeat.css
rename : browser/extensions/shield-recipe-client/skin/shared/Heartbeat.css => toolkit/components/normandy/skin/shared/Heartbeat.css
rename : browser/extensions/shield-recipe-client/skin/shared/heartbeat-icon.svg => toolkit/components/normandy/skin/shared/heartbeat-icon.svg
rename : browser/extensions/shield-recipe-client/skin/shared/heartbeat-star-lit.svg => toolkit/components/normandy/skin/shared/heartbeat-star-lit.svg
rename : browser/extensions/shield-recipe-client/skin/shared/heartbeat-star-off.svg => toolkit/components/normandy/skin/shared/heartbeat-star-off.svg
rename : browser/extensions/shield-recipe-client/test/.eslintrc.js => toolkit/components/normandy/test/.eslintrc.js
rename : browser/extensions/shield-recipe-client/test/browser/.eslintrc.js => toolkit/components/normandy/test/browser/.eslintrc.js
rename : browser/extensions/shield-recipe-client/test/browser/action_server.sjs => toolkit/components/normandy/test/browser/action_server.sjs
rename : browser/extensions/shield-recipe-client/test/browser/browser.ini => toolkit/components/normandy/test/browser/browser.ini
rename : browser/extensions/shield-recipe-client/test/browser/browser_ActionSandboxManager.js => toolkit/components/normandy/test/browser/browser_ActionSandboxManager.js
rename : browser/extensions/shield-recipe-client/test/browser/browser_AddonStudies.js => toolkit/components/normandy/test/browser/browser_AddonStudies.js
rename : browser/extensions/shield-recipe-client/test/browser/browser_Addons.js => toolkit/components/normandy/test/browser/browser_Addons.js
rename : browser/extensions/shield-recipe-client/test/browser/browser_CleanupManager.js => toolkit/components/normandy/test/browser/browser_CleanupManager.js
rename : browser/extensions/shield-recipe-client/test/browser/browser_ClientEnvironment.js => toolkit/components/normandy/test/browser/browser_ClientEnvironment.js
rename : browser/extensions/shield-recipe-client/test/browser/browser_EventEmitter.js => toolkit/components/normandy/test/browser/browser_EventEmitter.js
rename : browser/extensions/shield-recipe-client/test/browser/browser_FilterExpressions.js => toolkit/components/normandy/test/browser/browser_FilterExpressions.js
rename : browser/extensions/shield-recipe-client/test/browser/browser_Heartbeat.js => toolkit/components/normandy/test/browser/browser_Heartbeat.js
rename : browser/extensions/shield-recipe-client/test/browser/browser_LogManager.js => toolkit/components/normandy/test/browser/browser_LogManager.js
rename : browser/extensions/shield-recipe-client/test/browser/browser_bootstrap.js => toolkit/components/normandy/test/browser/browser_Normandy.js
rename : browser/extensions/shield-recipe-client/test/browser/browser_NormandyDriver.js => toolkit/components/normandy/test/browser/browser_NormandyDriver.js
rename : browser/extensions/shield-recipe-client/test/browser/browser_PreferenceExperiments.js => toolkit/components/normandy/test/browser/browser_PreferenceExperiments.js
rename : browser/extensions/shield-recipe-client/test/browser/browser_RecipeRunner.js => toolkit/components/normandy/test/browser/browser_RecipeRunner.js
rename : browser/extensions/shield-recipe-client/test/browser/browser_ShieldPreferences.js => toolkit/components/normandy/test/browser/browser_ShieldPreferences.js
rename : browser/extensions/shield-recipe-client/test/browser/browser_ShieldRecipeClient.js => toolkit/components/normandy/test/browser/browser_ShieldRecipeClient.js
rename : browser/extensions/shield-recipe-client/test/browser/browser_Storage.js => toolkit/components/normandy/test/browser/browser_Storage.js
rename : browser/extensions/shield-recipe-client/test/browser/browser_about_preferences.js => toolkit/components/normandy/test/browser/browser_about_preferences.js
rename : browser/extensions/shield-recipe-client/test/browser/browser_about_studies.js => toolkit/components/normandy/test/browser/browser_about_studies.js
rename : browser/extensions/shield-recipe-client/test/browser/fixtures/addon-fixture/manifest.json => toolkit/components/normandy/test/browser/fixtures/addon-fixture/manifest.json
rename : browser/extensions/shield-recipe-client/test/browser/fixtures/normandy.xpi => toolkit/components/normandy/test/browser/fixtures/normandy.xpi
rename : browser/extensions/shield-recipe-client/test/browser/head.js => toolkit/components/normandy/test/browser/head.js
rename : browser/extensions/shield-recipe-client/test/unit/.eslintrc.js => toolkit/components/normandy/test/unit/.eslintrc.js
rename : browser/extensions/shield-recipe-client/test/unit/echo_server.sjs => toolkit/components/normandy/test/unit/echo_server.sjs
rename : browser/extensions/shield-recipe-client/test/unit/head_xpc.js => toolkit/components/normandy/test/unit/head_xpc.js
rename : browser/extensions/shield-recipe-client/test/unit/invalid_recipe_signature_api/api/v1/index.json => toolkit/components/normandy/test/unit/invalid_recipe_signature_api/api/v1/index.json
rename : browser/extensions/shield-recipe-client/test/unit/invalid_recipe_signature_api/api/v1/recipe/signed/index.json => toolkit/components/normandy/test/unit/invalid_recipe_signature_api/api/v1/recipe/signed/index.json
rename : browser/extensions/shield-recipe-client/test/unit/invalid_recipe_signature_api/normandy.content-signature.mozilla.org-20210705.dev.chain => toolkit/components/normandy/test/unit/invalid_recipe_signature_api/normandy.content-signature.mozilla.org-20210705.dev.chain
rename : browser/extensions/shield-recipe-client/test/unit/mock_api/api/v1/action/console-log/implementation/sha384-RGx3rydrSq53UfmW9kFcK0mQYra67XIvZvr4MhmAe--ljiiMQOtgM7Cmca48um3v => toolkit/components/normandy/test/unit/mock_api/api/v1/action/console-log/implementation/sha384-RGx3rydrSq53UfmW9kFcK0mQYra67XIvZvr4MhmAe--ljiiMQOtgM7Cmca48um3v
rename : browser/extensions/shield-recipe-client/test/unit/mock_api/api/v1/action/console-log/index.json => toolkit/components/normandy/test/unit/mock_api/api/v1/action/console-log/index.json
rename : browser/extensions/shield-recipe-client/test/unit/mock_api/api/v1/action/index.json => toolkit/components/normandy/test/unit/mock_api/api/v1/action/index.json
rename : browser/extensions/shield-recipe-client/test/unit/mock_api/api/v1/action/opt-out-study/implementation/sha384-HM_avYcD00o27ufwU1V7PIBtiuMAXML6MMwlYrDEqDX-XzGVuOfL52RCM680JExN => toolkit/components/normandy/test/unit/mock_api/api/v1/action/opt-out-study/implementation/sha384-HM_avYcD00o27ufwU1V7PIBtiuMAXML6MMwlYrDEqDX-XzGVuOfL52RCM680JExN
rename : browser/extensions/shield-recipe-client/test/unit/mock_api/api/v1/action/opt-out-study/index.json => toolkit/components/normandy/test/unit/mock_api/api/v1/action/opt-out-study/index.json
rename : browser/extensions/shield-recipe-client/test/unit/mock_api/api/v1/action/preference-experiment/implementation/sha384-KQgG38GQ7KZAb2VIB48ANQO6nBcxZoLm2ORzUviRT5nAvSywyPjZ5cJIElw6iXIt => toolkit/components/normandy/test/unit/mock_api/api/v1/action/preference-experiment/implementation/sha384-KQgG38GQ7KZAb2VIB48ANQO6nBcxZoLm2ORzUviRT5nAvSywyPjZ5cJIElw6iXIt
rename : browser/extensions/shield-recipe-client/test/unit/mock_api/api/v1/action/preference-experiment/index.json => toolkit/components/normandy/test/unit/mock_api/api/v1/action/preference-experiment/index.json
rename : browser/extensions/shield-recipe-client/test/unit/mock_api/api/v1/action/show-heartbeat/implementation/sha384-dEGiyKPEln8Ns5cQHzGpMIGdirSAAX0X-Kwlu-U3sJ05yNbO-ANij_a6c5SyL7G4 => toolkit/components/normandy/test/unit/mock_api/api/v1/action/show-heartbeat/implementation/sha384-dEGiyKPEln8Ns5cQHzGpMIGdirSAAX0X-Kwlu-U3sJ05yNbO-ANij_a6c5SyL7G4
rename : browser/extensions/shield-recipe-client/test/unit/mock_api/api/v1/action/show-heartbeat/index.json => toolkit/components/normandy/test/unit/mock_api/api/v1/action/show-heartbeat/index.json
rename : browser/extensions/shield-recipe-client/test/unit/mock_api/api/v1/action/signed/index.json => toolkit/components/normandy/test/unit/mock_api/api/v1/action/signed/index.json
rename : browser/extensions/shield-recipe-client/test/unit/mock_api/api/v1/classify_client/index.json => toolkit/components/normandy/test/unit/mock_api/api/v1/classify_client/index.json
rename : browser/extensions/shield-recipe-client/test/unit/mock_api/api/v1/index.json => toolkit/components/normandy/test/unit/mock_api/api/v1/index.json
rename : browser/extensions/shield-recipe-client/test/unit/mock_api/api/v1/recipe/index.json => toolkit/components/normandy/test/unit/mock_api/api/v1/recipe/index.json
rename : browser/extensions/shield-recipe-client/test/unit/mock_api/api/v1/recipe/signed/index.json => toolkit/components/normandy/test/unit/mock_api/api/v1/recipe/signed/index.json
rename : browser/extensions/shield-recipe-client/test/unit/mock_api/normandy.content-signature.mozilla.org-20210705.dev.chain => toolkit/components/normandy/test/unit/mock_api/normandy.content-signature.mozilla.org-20210705.dev.chain
rename : browser/extensions/shield-recipe-client/test/unit/query_server.sjs => toolkit/components/normandy/test/unit/query_server.sjs
rename : browser/extensions/shield-recipe-client/test/unit/test_NormandyApi.js => toolkit/components/normandy/test/unit/test_NormandyApi.js
rename : browser/extensions/shield-recipe-client/test/unit/test_Sampling.js => toolkit/components/normandy/test/unit/test_Sampling.js
rename : browser/extensions/shield-recipe-client/test/unit/test_SandboxManager.js => toolkit/components/normandy/test/unit/test_SandboxManager.js
rename : browser/extensions/shield-recipe-client/test/unit/test_Utils.js => toolkit/components/normandy/test/unit/test_Utils.js
rename : browser/extensions/shield-recipe-client/test/unit/utils.js => toolkit/components/normandy/test/unit/utils.js
rename : browser/extensions/shield-recipe-client/test/unit/xpcshell.ini => toolkit/components/normandy/test/unit/xpcshell.ini
rename : browser/extensions/shield-recipe-client/vendor/LICENSE_THIRDPARTY => toolkit/components/normandy/vendor/LICENSE_THIRDPARTY
rename : browser/extensions/shield-recipe-client/vendor/PropTypes.js => toolkit/components/normandy/vendor/PropTypes.js
rename : browser/extensions/shield-recipe-client/vendor/React.js => toolkit/components/normandy/vendor/React.js
rename : browser/extensions/shield-recipe-client/vendor/ReactDOM.js => toolkit/components/normandy/vendor/ReactDOM.js
rename : browser/extensions/shield-recipe-client/vendor/classnames.js => toolkit/components/normandy/vendor/classnames.js
rename : browser/extensions/shield-recipe-client/vendor/mozjexl.js => toolkit/components/normandy/vendor/mozjexl.js
extra : rebase_source : 23de90d080eb96bed8cab7c9f8557f1b27c5d9ae
extra : source : 18a7f08a6cdc379574836737f776c62c6e755134
2018-02-28 14:55:47 -08:00

132 lines
3.4 KiB
JavaScript

"use strict";
ChromeUtils.import("resource://gre/modules/Services.jsm", this);
ChromeUtils.import("resource://normandy/lib/EventEmitter.jsm", this);
const evidence = {
a: 0,
b: 0,
c: 0,
log: "",
};
function listenerA(x = 1) {
evidence.a += x;
evidence.log += "a";
}
function listenerB(x = 1) {
evidence.b += x;
evidence.log += "b";
}
function listenerC(x = 1) {
evidence.c += x;
evidence.log += "c";
}
decorate_task(
withSandboxManager(Assert),
async function(sandboxManager) {
const eventEmitter = new EventEmitter(sandboxManager);
// Fire an unrelated event, to make sure nothing goes wrong
eventEmitter.on("nothing");
// bind listeners
eventEmitter.on("event", listenerA);
eventEmitter.on("event", listenerB);
eventEmitter.once("event", listenerC);
// one event for all listeners
eventEmitter.emit("event");
// another event for a and b, since c should have turned off already
eventEmitter.emit("event", 10);
// make sure events haven't actually fired yet, just queued
Assert.deepEqual(evidence, {
a: 0,
b: 0,
c: 0,
log: "",
}, "events are fired async");
// Spin the event loop to run events, so we can safely "off"
await Promise.resolve();
// Check intermediate event results
Assert.deepEqual(evidence, {
a: 11,
b: 11,
c: 1,
log: "abcab",
}, "intermediate events are fired");
// one more event for a
eventEmitter.off("event", listenerB);
eventEmitter.emit("event", 100);
// And another unrelated event
eventEmitter.on("nothing");
// Spin the event loop to run events
await Promise.resolve();
Assert.deepEqual(evidence, {
a: 111,
b: 11,
c: 1,
log: "abcaba", // events are in order
}, "events fired as expected");
// Test that mutating the data passed to the event doesn't actually
// mutate it for other events.
let handlerRunCount = 0;
const mutationHandler = data => {
handlerRunCount++;
data.count++;
is(data.count, 1, "Event data is not mutated between handlers.");
};
eventEmitter.on("mutationTest", mutationHandler);
eventEmitter.on("mutationTest", mutationHandler);
const data = {count: 0};
eventEmitter.emit("mutationTest", data);
await Promise.resolve();
is(handlerRunCount, 2, "Mutation handler was executed twice.");
is(data.count, 0, "Event data cannot be mutated by handlers.");
}
);
decorate_task(
withSandboxManager(Assert),
async function sandboxedEmitter(sandboxManager) {
const eventEmitter = new EventEmitter(sandboxManager);
// Event handlers inside the sandbox should be run in response to
// events triggered outside the sandbox.
sandboxManager.addGlobal("emitter", eventEmitter.createSandboxedEmitter());
sandboxManager.evalInSandbox(`
this.eventCounts = {on: 0, once: 0};
emitter.on("event", value => {
this.eventCounts.on += value;
});
emitter.once("eventOnce", value => {
this.eventCounts.once += value;
});
`);
eventEmitter.emit("event", 5);
eventEmitter.emit("event", 10);
eventEmitter.emit("eventOnce", 5);
eventEmitter.emit("eventOnce", 10);
await Promise.resolve();
const eventCounts = sandboxManager.evalInSandbox("this.eventCounts");
Assert.deepEqual(eventCounts, {
on: 15,
once: 5,
}, "Events emitted outside a sandbox trigger handlers within a sandbox.");
}
);