diff options
Diffstat (limited to 'docshell/test/browser/browser_bug503832.js')
-rw-r--r-- | docshell/test/browser/browser_bug503832.js | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/docshell/test/browser/browser_bug503832.js b/docshell/test/browser/browser_bug503832.js new file mode 100644 index 000000000..66904cbae --- /dev/null +++ b/docshell/test/browser/browser_bug503832.js @@ -0,0 +1,87 @@ +/* Test for Bug 503832 + * https://bugzilla.mozilla.org/show_bug.cgi?id=503832 + */ + +add_task(function* () { + var pagetitle = "Page Title for Bug 503832"; + var pageurl = "http://mochi.test:8888/browser/docshell/test/browser/file_bug503832.html"; + var fragmenturl = "http://mochi.test:8888/browser/docshell/test/browser/file_bug503832.html#firefox"; + + var historyService = Cc["@mozilla.org/browser/nav-history-service;1"] + .getService(Ci.nsINavHistoryService); + + let fragmentPromise = new Promise(resolve => { + /* Global history observer that triggers for the two test URLs above. */ + var historyObserver = { + onBeginUpdateBatch: function() {}, + onEndUpdateBatch: function() {}, + onVisit: function(aURI, aVisitID, aTime, aSessionId, aReferringId, + aTransitionType, _added) {}, + onTitleChanged: function(aURI, aPageTitle) { + aURI = aURI.spec; + switch (aURI) { + case pageurl: + is(aPageTitle, pagetitle, "Correct page title for " + aURI); + return; + case fragmenturl: + is(aPageTitle, pagetitle, "Correct page title for " + aURI); + // If titles for fragment URLs aren't set, this code + // branch won't be called and the test will timeout, + // resulting in a failure + historyService.removeObserver(historyObserver, false); + resolve(); + } + }, + onDeleteURI: function(aURI) {}, + onClearHistory: function() {}, + onPageChanged: function(aURI, aWhat, aValue) {}, + onDeleteVisits: function () {}, + QueryInterface: function(iid) { + if (iid.equals(Ci.nsINavHistoryObserver) || + iid.equals(Ci.nsISupports)) { + return this; + } + throw Cr.NS_ERROR_NO_INTERFACE; + } + }; + + historyService.addObserver(historyObserver, false); + }); + + /* Queries nsINavHistoryService and returns a single history entry + * for a given URI */ + function getNavHistoryEntry(aURI) { + var options = historyService.getNewQueryOptions(); + options.queryType = Ci.nsINavHistoryQueryOptions.QUERY_TYPE_HISTORY; + options.maxResults = 1; + + var query = historyService.getNewQuery(); + query.uri = aURI; + + var result = historyService.executeQuery(query, options); + result.root.containerOpen = true; + + if (!result.root.childCount) { + return null; + } + var node = result.root.getChild(0); + result.root.containerOpen = false; + return node; + } + + // Make sure neither of the test pages haven't been loaded before. + var info = getNavHistoryEntry(makeURI(pageurl)); + ok(!info, "The test page must not have been visited already."); + info = getNavHistoryEntry(makeURI(fragmenturl)); + ok(!info, "The fragment test page must not have been visited already."); + + // Now open the test page in a new tab + yield BrowserTestUtils.openNewForegroundTab(gBrowser, pageurl); + + // Now that the page is loaded, click on fragment link + yield BrowserTestUtils.synthesizeMouseAtCenter("#firefox-link", {}, + gBrowser.selectedBrowser); + yield fragmentPromise; + + gBrowser.removeCurrentTab(); +}); |