"use strict"; const URL = "data:text/html;charset=utf-8,clickme"; add_task(function* test_flush() { // Create new tab. let tab = gBrowser.addTab(URL); let browser = tab.linkedBrowser; yield promiseBrowserLoaded(browser); // Flush to empty any queued update messages. yield TabStateFlusher.flush(browser); // There should be one history entry. let {entries} = JSON.parse(ss.getTabState(tab)); is(entries.length, 1, "there is a single history entry"); // Click the link to navigate, this will add second shistory entry. yield ContentTask.spawn(browser, null, function* () { return new Promise(resolve => { addEventListener("hashchange", function onHashChange() { removeEventListener("hashchange", onHashChange); resolve(); }); // Click the link. content.document.querySelector("a").click(); }); }); // Flush to empty any queued update messages. yield TabStateFlusher.flush(browser); // There should be two history entries now. ({entries} = JSON.parse(ss.getTabState(tab))); is(entries.length, 2, "there are two shistory entries"); // Cleanup. gBrowser.removeTab(tab); }); add_task(function* test_crash() { // Create new tab. let tab = gBrowser.addTab(URL); gBrowser.selectedTab = tab; let browser = tab.linkedBrowser; yield promiseBrowserLoaded(browser); // Flush to empty any queued update messages. yield TabStateFlusher.flush(browser); // There should be one history entry. let {entries} = JSON.parse(ss.getTabState(tab)); is(entries.length, 1, "there is a single history entry"); // Click the link to navigate. yield ContentTask.spawn(browser, null, function* () { return new Promise(resolve => { addEventListener("hashchange", function onHashChange() { removeEventListener("hashchange", onHashChange); resolve(); }); // Click the link. content.document.querySelector("a").click(); }); }); // Crash the browser and flush. Both messages are async and will be sent to // the content process. The "crash" message makes it first so that we don't // get a chance to process the flush. The TabStateFlusher however should be // notified so that the flush still completes. let promise1 = BrowserTestUtils.crashBrowser(browser); let promise2 = TabStateFlusher.flush(browser); yield Promise.all([promise1, promise2]); // The pending update should be lost. ({entries} = JSON.parse(ss.getTabState(tab))); is(entries.length, 1, "still only one history entry"); // Cleanup. gBrowser.removeTab(tab); }); add_task(function* test_remove() { // Create new tab. let tab = gBrowser.addTab(URL); let browser = tab.linkedBrowser; yield promiseBrowserLoaded(browser); // Flush to empty any queued update messages. yield TabStateFlusher.flush(browser); // There should be one history entry. let {entries} = JSON.parse(ss.getTabState(tab)); is(entries.length, 1, "there is a single history entry"); // Click the link to navigate. yield ContentTask.spawn(browser, null, function* () { return new Promise(resolve => { addEventListener("hashchange", function onHashChange() { removeEventListener("hashchange", onHashChange); resolve(); }); // Click the link. content.document.querySelector("a").click(); }); }); // Request a flush and remove the tab. The flush should still complete. yield Promise.all([TabStateFlusher.flush(browser), promiseRemoveTab(tab)]); })