docshell/test/browser/browser_bug420605.js

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:89bb3d90e35f
1 /* Test for Bug 420605
2 * https://bugzilla.mozilla.org/show_bug.cgi?id=420605
3 */
4
5 function test() {
6 waitForExplicitFinish();
7
8 var pageurl = "http://mochi.test:8888/browser/docshell/test/browser/file_bug420605.html";
9 var fragmenturl = "http://mochi.test:8888/browser/docshell/test/browser/file_bug420605.html#firefox";
10
11 var historyService = Cc["@mozilla.org/browser/nav-history-service;1"]
12 .getService(Ci.nsINavHistoryService);
13
14 /* Queries nsINavHistoryService and returns a single history entry
15 * for a given URI */
16 function getNavHistoryEntry(aURI) {
17 var options = historyService.getNewQueryOptions();
18 options.queryType = Ci.nsINavHistoryQueryOptions.QUERY_TYPE_HISTORY;
19 options.maxResults = 1;
20
21 var query = historyService.getNewQuery();
22 query.uri = aURI;
23
24 var result = historyService.executeQuery(query, options);
25 result.root.containerOpen = true;
26
27 if (!result.root.childCount) {
28 return null;
29 }
30 return result.root.getChild(0);
31 }
32
33 // We'll save the favicon URL of the orignal page here and check that the
34 // page with a hash has the same favicon.
35 var originalFavicon;
36
37 // Control flow in this test is a bit complicated.
38 //
39 // When the page loads, onPageLoad (the DOMContentLoaded handler) and
40 // historyObserver::onPageChanged are both called, in some order. Once
41 // they've both run, we click a fragment link in the content page
42 // (clickLinkIfReady), which should trigger another onPageChanged event,
43 // this time for the fragment's URL.
44
45 var _clickLinkTimes = 0;
46 function clickLinkIfReady() {
47 _clickLinkTimes++;
48 if (_clickLinkTimes == 2) {
49 EventUtils.sendMouseEvent({type:'click'}, 'firefox-link',
50 gBrowser.selectedBrowser.contentWindow);
51 }
52 }
53
54 /* Global history observer that triggers for the two test URLs above. */
55 var historyObserver = {
56 onBeginUpdateBatch: function() {},
57 onEndUpdateBatch: function() {},
58 onVisit: function(aURI, aVisitID, aTime, aSessionId, aReferringId,
59 aTransitionType, _added) {},
60 onTitleChanged: function(aURI, aPageTitle) {},
61 onDeleteURI: function(aURI) {},
62 onClearHistory: function() {},
63 onPageChanged: function(aURI, aWhat, aValue) {
64 if (aWhat != Ci.nsINavHistoryObserver.ATTRIBUTE_FAVICON) {
65 return;
66 }
67 aURI = aURI.spec;
68 switch (aURI) {
69 case pageurl:
70 ok(aValue, "Favicon value is not null for page without fragment.");
71 originalFavicon = aValue;
72
73 // Now that the favicon has loaded, click on fragment link.
74 // This should trigger the |case fragmenturl| below.
75 clickLinkIfReady();
76
77 return;
78 case fragmenturl:
79 // If the fragment URL's favicon isn't set, this branch won't
80 // be called and the test will time out.
81
82 is(aValue, originalFavicon, "New favicon should be same as original favicon.");
83
84 // Let's explicitly check that we can get the favicon
85 // from nsINavHistoryService now.
86 let info = getNavHistoryEntry(makeURI(aURI));
87 ok(info, "There must be a history entry for the fragment.");
88 ok(info.icon, "The history entry must have an associated favicon.");
89 historyService.removeObserver(historyObserver, false);
90 gBrowser.removeCurrentTab();
91 finish();
92 }
93 },
94 onPageExpired: function(aURI, aVisitTime, aWholeEntry) {},
95 QueryInterface: function(iid) {
96 if (iid.equals(Ci.nsINavHistoryObserver) ||
97 iid.equals(Ci.nsISupports)) {
98 return this;
99 }
100 throw Cr.NS_ERROR_NO_INTERFACE;
101 }
102 };
103 historyService.addObserver(historyObserver, false);
104
105 function onPageLoad() {
106 gBrowser.selectedBrowser
107 .removeEventListener("DOMContentLoaded", arguments.callee, true);
108 clickLinkIfReady();
109 }
110
111 // Make sure neither of the test pages haven't been loaded before.
112 var info = getNavHistoryEntry(makeURI(pageurl));
113 ok(!info, "The test page must not have been visited already.");
114 info = getNavHistoryEntry(makeURI(fragmenturl));
115 ok(!info, "The fragment test page must not have been visited already.");
116
117 // Now open the test page in a new tab.
118 gBrowser.selectedTab = gBrowser.addTab();
119 gBrowser.selectedBrowser.addEventListener(
120 "DOMContentLoaded", onPageLoad, true);
121 content.location = pageurl;
122 }

mercurial