diff options
Diffstat (limited to 'mobile/android/tests/browser/robocop/testHistoryService.js')
-rw-r--r-- | mobile/android/tests/browser/robocop/testHistoryService.js | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/mobile/android/tests/browser/robocop/testHistoryService.js b/mobile/android/tests/browser/robocop/testHistoryService.js new file mode 100644 index 000000000..612928c4c --- /dev/null +++ b/mobile/android/tests/browser/robocop/testHistoryService.js @@ -0,0 +1,128 @@ +// -*- indent-tabs-mode: nil; js-indent-level: 2 -*- +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +var { classes: Cc, interfaces: Ci, utils: Cu } = Components; + +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +Cu.import("resource://gre/modules/Services.jsm"); + +// Make the timer global so it doesn't get GC'd +var gTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); + +function sleep(wait) { + return new Promise((resolve, reject) => { + do_print("sleep start"); + gTimer.initWithCallback({ + notify: function () { + do_print("sleep end"); + resolve(); + }, + }, wait, gTimer.TYPE_ONE_SHOT); + }); +} + +function promiseLoadEvent(browser, url, eventType="load") { + return new Promise((resolve, reject) => { + do_print("Wait browser event: " + eventType); + + function handle(event) { + // Since we'll be redirecting, don't make assumptions about the given URL and the loaded URL + if (event.target != browser.contentDocument || event.target.location.href == "about:blank") { + do_print("Skipping spurious '" + eventType + "' event" + " for " + event.target.location.href); + return; + } + + browser.removeEventListener(eventType, handle, true); + do_print("Browser event received: " + eventType); + resolve(event); + } + + browser.addEventListener(eventType, handle, true); + if (url) { + browser.loadURI(url); + } + }); +} + +// Wait 6 seconds for the pending visits to flush (which should happen in 3 seconds) +const PENDING_VISIT_WAIT = 6000; +// Longer wait required after first load +const PENDING_VISIT_WAIT_LONG = 20000; + +// Manage the saved history visits so we can compare in the tests +var gVisitURLs = []; +function visitObserver(subject, topic, data) { + let uri = subject.QueryInterface(Ci.nsIURI); + do_print("Observer: " + uri.spec); + gVisitURLs.push(uri.spec); +}; + +// Track the <browser> where the tests are happening +var gBrowser; + +add_test(function setup_browser() { + let chromeWin = Services.wm.getMostRecentWindow("navigator:browser"); + let BrowserApp = chromeWin.BrowserApp; + + do_register_cleanup(function cleanup() { + Services.obs.removeObserver(visitObserver, "link-visited"); + BrowserApp.closeTab(BrowserApp.getTabForBrowser(gBrowser)); + }); + + Services.obs.addObserver(visitObserver, "link-visited", false); + + // Load a blank page + let url = "about:blank"; + gBrowser = BrowserApp.addTab(url, { selected: true, parentId: BrowserApp.selectedTab.id }).browser; + gBrowser.addEventListener("load", function startTests(event) { + gBrowser.removeEventListener("load", startTests, true); + Services.tm.mainThread.dispatch(run_next_test, Ci.nsIThread.DISPATCH_NORMAL); + }, true); +}); + +add_task(function* () { + // Wait for any initial page loads to be saved to history + yield sleep(PENDING_VISIT_WAIT); + + // Load a simple HTML page with no redirects + gVisitURLs = []; + yield promiseLoadEvent(gBrowser, "http://example.org/tests/robocop/robocop_blank_01.html"); + yield sleep(PENDING_VISIT_WAIT_LONG); + + do_print("visit counts: " + gVisitURLs.length); + ok(gVisitURLs.length == 1, "Simple visit makes 1 history item"); + + do_print("visit URL: " + gVisitURLs[0]); + ok(gVisitURLs[0] == "http://example.org/tests/robocop/robocop_blank_01.html", "Simple visit makes final history item"); + + // Load a simple HTML page via a 301 temporary redirect + gVisitURLs = []; + yield promiseLoadEvent(gBrowser, "http://example.org/tests/robocop/simple_redirect.sjs?http://example.org/tests/robocop/robocop_blank_02.html"); + yield sleep(PENDING_VISIT_WAIT); + + do_print("visit counts: " + gVisitURLs.length); + ok(gVisitURLs.length == 1, "Simple 301 redirect makes 1 history item"); + + do_print("visit URL: " + gVisitURLs[0]); + ok(gVisitURLs[0] == "http://example.org/tests/robocop/robocop_blank_02.html", "Simple 301 redirect makes final history item"); + + // Load a simple HTML page via a JavaScript redirect + gVisitURLs = []; + yield promiseLoadEvent(gBrowser, "http://example.org/tests/robocop/javascript_redirect.sjs?http://example.org/tests/robocop/robocop_blank_03.html"); + yield sleep(PENDING_VISIT_WAIT); + + do_print("visit counts: " + gVisitURLs.length); + ok(gVisitURLs.length == 2, "JavaScript redirect makes 2 history items"); + + do_print("visit URL 1: " + gVisitURLs[0]); + ok(gVisitURLs[0] == "http://example.org/tests/robocop/javascript_redirect.sjs?http://example.org/tests/robocop/robocop_blank_03.html", "JavaScript redirect makes intermediate history item"); + + do_print("visit URL 2: " + gVisitURLs[1]); + ok(gVisitURLs[1] == "http://example.org/tests/robocop/robocop_blank_03.html", "JavaScript redirect makes final history item"); +}); + +run_next_test(); |