From 1675a6ff9c81528c58328d37cdd60cde88f84a9a Mon Sep 17 00:00:00 2001 From: Tim Taubert Date: Fri, 8 May 2015 15:15:32 +0200 Subject: [PATCH] Bug 1162871 - Test that duplicateTab() does wait for the flush to complete and includes flushed data r=billm --- .../components/sessionstore/test/browser.ini | 1 + .../sessionstore/test/browser_454908.js | 4 - .../test/browser_async_duplicate_tab.js | 78 +++++++++++++++++++ browser/components/sessionstore/test/head.js | 16 ++-- 4 files changed, 86 insertions(+), 13 deletions(-) create mode 100644 browser/components/sessionstore/test/browser_async_duplicate_tab.js diff --git a/browser/components/sessionstore/test/browser.ini b/browser/components/sessionstore/test/browser.ini index bb289fa8d893..efefaa8dd32d 100644 --- a/browser/components/sessionstore/test/browser.ini +++ b/browser/components/sessionstore/test/browser.ini @@ -65,6 +65,7 @@ support-files = [browser_aboutPrivateBrowsing.js] [browser_aboutSessionRestore.js] +[browser_async_duplicate_tab.js] [browser_async_remove_tab.js] run-if = e10s [browser_attributes.js] diff --git a/browser/components/sessionstore/test/browser_454908.js b/browser/components/sessionstore/test/browser_454908.js index 6352a1a03a7f..fb8206e2ff92 100644 --- a/browser/components/sessionstore/test/browser_454908.js +++ b/browser/components/sessionstore/test/browser_454908.js @@ -3,10 +3,6 @@ "use strict"; -let tmp = {}; -Cu.import("resource:///modules/sessionstore/SessionSaver.jsm", tmp); -let {SessionSaver} = tmp; - const URL = ROOT + "browser_454908_sample.html"; const PASS = "pwd-" + Math.random(); diff --git a/browser/components/sessionstore/test/browser_async_duplicate_tab.js b/browser/components/sessionstore/test/browser_async_duplicate_tab.js new file mode 100644 index 000000000000..8696a284fdd5 --- /dev/null +++ b/browser/components/sessionstore/test/browser_async_duplicate_tab.js @@ -0,0 +1,78 @@ +"use strict"; + +const URL = "data:text/html;charset=utf-8,clickme"; + +add_task(function* test_duplicate() { + // 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); + + // 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(); + }); + }); + + // Duplicate the tab. + let tab2 = ss.duplicateTab(window, tab); + + // Wait until the tab has fully restored. + yield promiseTabRestored(tab2); + yield TabStateFlusher.flush(tab2.linkedBrowser); + + // There should be two history entries now. + let {entries} = JSON.parse(ss.getTabState(tab2)); + is(entries.length, 2, "there are two shistory entries"); + + // Cleanup. + yield promiseRemoveTab(tab2); + yield promiseRemoveTab(tab); +}); + +add_task(function* test_duplicate_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); + + // 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(); + }); + }); + + // Duplicate the tab. + let tab2 = ss.duplicateTab(window, tab); + + // Before the duplication finished, remove the tab. + yield Promise.all([promiseRemoveTab(tab), promiseTabRestored(tab2)]); + yield TabStateFlusher.flush(tab2.linkedBrowser); + + // There should be two history entries now. + let {entries} = JSON.parse(ss.getTabState(tab2)); + is(entries.length, 2, "there are two shistory entries"); + + // Cleanup. + yield promiseRemoveTab(tab2); +}); diff --git a/browser/components/sessionstore/test/head.js b/browser/components/sessionstore/test/head.js index 79e29cfa515f..583d95743853 100644 --- a/browser/components/sessionstore/test/head.js +++ b/browser/components/sessionstore/test/head.js @@ -25,16 +25,14 @@ registerCleanupFunction(() => { } }); -let tmp = {}; -Cu.import("resource://gre/modules/Promise.jsm", tmp); -Cu.import("resource://gre/modules/Task.jsm", tmp); -Cu.import("resource:///modules/sessionstore/SessionStore.jsm", tmp); -Cu.import("resource:///modules/sessionstore/SessionSaver.jsm", tmp); -Cu.import("resource:///modules/sessionstore/SessionFile.jsm", tmp); -Cu.import("resource:///modules/sessionstore/TabState.jsm", tmp); -let {Promise, Task, SessionStore, SessionSaver, SessionFile, TabState} = tmp; +const {Promise} = Cu.import("resource://gre/modules/Promise.jsm", {}); +const {SessionStore} = Cu.import("resource:///modules/sessionstore/SessionStore.jsm", {}); +const {SessionSaver} = Cu.import("resource:///modules/sessionstore/SessionSaver.jsm", {}); +const {SessionFile} = Cu.import("resource:///modules/sessionstore/SessionFile.jsm", {}); +const {TabState} = Cu.import("resource:///modules/sessionstore/TabState.jsm", {}); +const {TabStateFlusher} = Cu.import("resource:///modules/sessionstore/TabStateFlusher.jsm", {}); -let ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore); +const ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore); // Some tests here assume that all restored tabs are loaded without waiting for // the user to bring them to the foreground. We ensure this by resetting the