FIX: Memory Leaks w/ Container (#7750)

Gives instance initializers the ability to add a `teardown` method that
will be called between tests to clean up after themselves.
This commit is contained in:
Robin Ward 2019-06-11 12:41:27 -04:00 committed by Joffrey JAFFEUX
parent 47095a7fa1
commit 3d7c26c15e
2 changed files with 25 additions and 9 deletions

View File

@ -1,21 +1,28 @@
// Append our CSRF token to AJAX requests when necessary. // Append our CSRF token to AJAX requests when necessary.
let installedFilter = false; let installed = false;
let callbacks = $.Callbacks();
export default { export default {
name: "csrf-token", name: "csrf-token",
initialize: function(container) { initialize(container) {
// Add a CSRF token to all AJAX requests // Add a CSRF token to all AJAX requests
let session = container.lookup("session:main"); let session = container.lookup("session:main");
session.set("csrfToken", $("meta[name=csrf-token]").attr("content")); session.set("csrfToken", $("meta[name=csrf-token]").attr("content"));
if (!installedFilter) { if (!installed) {
$.ajaxPrefilter(function(options, originalOptions, xhr) { $.ajaxPrefilter(callbacks.fire);
installed = true;
}
callbacks.add(function(options, originalOptions, xhr) {
if (!options.crossDomain) { if (!options.crossDomain) {
xhr.setRequestHeader("X-CSRF-Token", session.get("csrfToken")); xhr.setRequestHeader("X-CSRF-Token", session.get("csrfToken"));
} }
}); });
installedFilter = true; },
}
teardown() {
callbacks.empty();
} }
}; };

View File

@ -169,6 +169,15 @@ QUnit.testDone(function() {
}); });
}); });
Discourse._runInitializer("instanceInitializers", function(
name,
initializer
) {
if (initializer && initializer.teardown) {
initializer.teardown();
}
});
// attempts to remove any subscribed message bus callback // attempts to remove any subscribed message bus callback
window.MessageBus.callbacks.forEach(function(callback) { window.MessageBus.callbacks.forEach(function(callback) {
window.MessageBus.unsubscribe(callback.channel, callback.func); window.MessageBus.unsubscribe(callback.channel, callback.func);