/* Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/ */ /** * Test for Bug 670318 * * When LoadEntry() is called on a browser that has multiple duplicate history * entries, history.index can end up out of range (>= history.count). */ const URL = "http://mochi.test:8888/browser/docshell/test/browser/file_bug670318.html"; async function test_body(browser) { let history = browser.browsingContext.sessionHistory; let count = 0; let testDone = {}; testDone.promise = new Promise(resolve => { testDone.resolve = resolve; }); let listener = { async OnHistoryNewEntry(aNewURI) { if (aNewURI.spec == URL && 5 == ++count) { history.removeSHistoryListener(listener); let loaded = BrowserTestUtils.browserLoaded(browser); SpecialPowers.spawn(browser, [], () => { content.location.reload(); }); await loaded; Assert.less(history.index, history.count, "history.index is valid"); testDone.resolve(); } }, OnHistoryReload: () => true, OnHistoryGotoIndex: () => {}, OnHistoryPurge: () => {}, OnHistoryReplaceEntry: () => { // The initial load of about:blank causes a transient entry to be // created, so our first navigation to a real page is a replace // instead of a new entry. ++count; // XXX I think this will be notified once |URL|, i.e. file_bug670318.html loads. // this is probably not desired. }, QueryInterface: ChromeUtils.generateQI([ "nsISHistoryListener", "nsISupportsWeakReference", ]), }; history.addSHistoryListener(listener); BrowserTestUtils.startLoadingURIString(browser, URL); await testDone.promise; } add_task(async function test() { await BrowserTestUtils.withNewTab( { gBrowser, url: "about:blank" }, test_body ); });