This was a little tricky to get right. The "spin the event loop" bit is weird but doing a setTimout to call resolve is already redundant since resolve calls the promise callbacks on the next turn of the event loop anyway. Basically, the test just needed to move more stuff to the content process. MozReview-Commit-ID: KrZZU5reJf7
99 lines
3.5 KiB
JavaScript
99 lines
3.5 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
const TEST_URI_NAV = "http://example.com/browser/dom/tests/browser/";
|
|
|
|
function tearDown()
|
|
{
|
|
while (gBrowser.tabs.length > 1)
|
|
gBrowser.removeCurrentTab();
|
|
}
|
|
|
|
add_task(function*()
|
|
{
|
|
// Don't cache removed tabs, so "clear console cache on tab close" triggers.
|
|
yield SpecialPowers.pushPrefEnv({ set: [[ "browser.tabs.max_tabs_undo", 0 ]] });
|
|
|
|
registerCleanupFunction(tearDown);
|
|
|
|
// Open a keepalive tab in the background to make sure we don't accidentally
|
|
// kill the content process
|
|
var keepaliveTab = gBrowser.addTab("about:blank");
|
|
|
|
// Open the main tab to run the test in
|
|
var tab = gBrowser.addTab("about:blank");
|
|
gBrowser.selectedTab = tab;
|
|
var browser = gBrowser.selectedBrowser;
|
|
|
|
let observerPromise = ContentTask.spawn(browser, null, function* (opt) {
|
|
const TEST_URI = "http://example.com/browser/dom/tests/browser/test-console-api.html";
|
|
let ConsoleAPIStorage = Cc["@mozilla.org/consoleAPI-storage;1"]
|
|
.getService(Ci.nsIConsoleAPIStorage);
|
|
|
|
let observerPromise = new Promise(resolve => {
|
|
let apiCallCount = 0;
|
|
let ConsoleObserver = {
|
|
QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver]),
|
|
|
|
observe: function(aSubject, aTopic, aData) {
|
|
if (aTopic == "console-storage-cache-event") {
|
|
apiCallCount++;
|
|
if (apiCallCount == 4) {
|
|
let windowId = content.window.QueryInterface(Ci.nsIInterfaceRequestor)
|
|
.getInterface(Ci.nsIDOMWindowUtils).currentInnerWindowID;
|
|
|
|
Services.obs.removeObserver(this, "console-storage-cache-event");
|
|
ok(ConsoleAPIStorage.getEvents(windowId).length >= 4, "Some messages found in the storage service");
|
|
ConsoleAPIStorage.clearEvents();
|
|
is(ConsoleAPIStorage.getEvents(windowId).length, 0, "Cleared Storage");
|
|
|
|
resolve(windowId);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
Services.obs.addObserver(ConsoleObserver, "console-storage-cache-event", false);
|
|
|
|
// Redirect the browser to the test URI
|
|
content.window.location = TEST_URI;
|
|
});
|
|
|
|
yield ContentTaskUtils.waitForEvent(this, "DOMContentLoaded");
|
|
|
|
content.console.log("this", "is", "a", "log message");
|
|
content.console.info("this", "is", "a", "info message");
|
|
content.console.warn("this", "is", "a", "warn message");
|
|
content.console.error("this", "is", "a", "error message");
|
|
return observerPromise;
|
|
});
|
|
|
|
let windowId = yield observerPromise;
|
|
|
|
yield ContentTask.spawn(browser, null, function() {
|
|
// make sure a closed window's events are in fact removed from
|
|
// the storage cache
|
|
content.console.log("adding a new event");
|
|
});
|
|
|
|
// Close the window.
|
|
gBrowser.removeTab(tab, {animate: false});
|
|
// Ensure actual window destruction is not delayed (too long).
|
|
SpecialPowers.DOMWindowUtils.garbageCollect();
|
|
|
|
// Spawn the check in the keepaliveTab, so that we can read the ConsoleAPIStorage correctly
|
|
gBrowser.selectedTab = keepaliveTab;
|
|
browser = gBrowser.selectedBrowser;
|
|
|
|
// Spin the event loop to make sure everything is cleared.
|
|
yield ContentTask.spawn(browser, null, function () {
|
|
return Promise.resolve();
|
|
});
|
|
|
|
yield ContentTask.spawn(browser, windowId, function(windowId) {
|
|
var ConsoleAPIStorage = Cc["@mozilla.org/consoleAPI-storage;1"]
|
|
.getService(Ci.nsIConsoleAPIStorage);
|
|
is(ConsoleAPIStorage.getEvents(windowId).length, 0, "tab close is clearing the cache");
|
|
});
|
|
});
|