browser/components/sessionstore/test/browser_490040.js

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:f5fe25b98f0b
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4
5 function test() {
6 /** Test for Bug 490040 **/
7
8 waitForExplicitFinish();
9
10 function testWithState(aState) {
11 // Ensure we can store the window if needed.
12 let curClosedWindowCount = ss.getClosedWindowCount();
13 gPrefService.setIntPref("browser.sessionstore.max_windows_undo",
14 curClosedWindowCount + 1);
15
16 var origWin;
17 function windowObserver(aSubject, aTopic, aData) {
18 let theWin = aSubject.QueryInterface(Ci.nsIDOMWindow);
19 if (origWin && theWin != origWin)
20 return;
21
22 switch (aTopic) {
23 case "domwindowopened":
24 origWin = theWin;
25 theWin.addEventListener("load", function () {
26 theWin.removeEventListener("load", arguments.callee, false);
27 executeSoon(function () {
28 // Close the window as soon as the first tab loads, or
29 // immediately if there are no tabs.
30 if (aState.windowState.windows[0].tabs[0].entries.length) {
31 theWin.gBrowser.addEventListener("load", function() {
32 theWin.gBrowser.removeEventListener("load",
33 arguments.callee, true);
34 theWin.close();
35 }, true);
36 } else {
37 executeSoon(function () {
38 theWin.close();
39 });
40 }
41 ss.setWindowState(theWin, JSON.stringify(aState.windowState),
42 true);
43 });
44 }, false);
45 break;
46
47 case "domwindowclosed":
48 Services.ww.unregisterNotification(windowObserver);
49 // Use executeSoon to ensure this happens after SS observer.
50 executeSoon(function () {
51 is(ss.getClosedWindowCount(),
52 curClosedWindowCount + (aState.shouldBeAdded ? 1 : 0),
53 "That window should " + (aState.shouldBeAdded ? "" : "not ") +
54 "be restorable");
55 executeSoon(runNextTest);
56 });
57 break;
58 }
59 }
60 Services.ww.registerNotification(windowObserver);
61 Services.ww.openWindow(null,
62 location,
63 "_blank",
64 "chrome,all,dialog=no",
65 null);
66 }
67
68 // Only windows with open tabs are restorable. Windows where a lone tab is
69 // detached may have _closedTabs, but is left with just an empty tab.
70 let states = [
71 {
72 shouldBeAdded: true,
73 windowState: {
74 windows: [{
75 tabs: [{ entries: [{ url: "http://example.com", title: "example.com" }] }],
76 selected: 1,
77 _closedTabs: []
78 }]
79 }
80 },
81 {
82 shouldBeAdded: false,
83 windowState: {
84 windows: [{
85 tabs: [{ entries: [] }],
86 _closedTabs: []
87 }]
88 }
89 },
90 {
91 shouldBeAdded: false,
92 windowState: {
93 windows: [{
94 tabs: [{ entries: [] }],
95 _closedTabs: [{ state: { entries: [{ url: "http://example.com", index: 1 }] } }]
96 }]
97 }
98 },
99 {
100 shouldBeAdded: false,
101 windowState: {
102 windows: [{
103 tabs: [{ entries: [] }],
104 _closedTabs: [],
105 extData: { keyname: "pi != " + Math.random() }
106 }]
107 }
108 }
109 ];
110
111 function runNextTest() {
112 if (states.length) {
113 let state = states.shift();
114 testWithState(state);
115 }
116 else {
117 gPrefService.clearUserPref("browser.sessionstore.max_windows_undo");
118 finish();
119 }
120 }
121 runNextTest();
122 }
123

mercurial