browser/components/tabview/test/browser_tabview_bug595601.js

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:d262076c7b9b
1 /* Any copyright is dedicated to the Public Domain.
2 http://creativecommons.org/publicdomain/zero/1.0/ */
3
4 let ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);
5
6 const TAB_STATE_NEEDS_RESTORE = 1;
7 const TAB_STATE_RESTORING = 2;
8
9 let stateBackup = ss.getBrowserState();
10
11 let state = {windows:[{tabs:[
12 // first group
13 {entries:[{url:"http://example.com#1"}],extData:{"tabview-tab":"{\"bounds\":{\"left\":20,\"top\":20,\"width\":20,\"height\":20},\"url\":\"http://example.com#1\",\"groupID\":2}"}},
14 {entries:[{url:"http://example.com#2"}],extData:{"tabview-tab":"{\"bounds\":{\"left\":20,\"top\":20,\"width\":20,\"height\":20},\"url\":\"http://example.com#2\",\"groupID\":2}"}},
15 {entries:[{url:"http://example.com#3"}],extData:{"tabview-tab":"{\"bounds\":{\"left\":20,\"top\":20,\"width\":20,\"height\":20},\"url\":\"http://example.com#3\",\"groupID\":2}"}},
16 {entries:[{url:"http://example.com#4"}],extData:{"tabview-tab":"{\"bounds\":{\"left\":20,\"top\":20,\"width\":20,\"height\":20},\"url\":\"http://example.com#4\",\"groupID\":2}"}},
17
18 // second group
19 {entries:[{url:"http://example.com#5"}],hidden:true,extData:{"tabview-tab":"{\"bounds\":{\"left\":20,\"top\":20,\"width\":20,\"height\":20},\"url\":\"http://example.com#5\",\"groupID\":1}"}},
20 {entries:[{url:"http://example.com#6"}],hidden:true,extData:{"tabview-tab":"{\"bounds\":{\"left\":20,\"top\":20,\"width\":20,\"height\":20},\"url\":\"http://example.com#6\",\"groupID\":1}"}},
21 {entries:[{url:"http://example.com#7"}],hidden:true,extData:{"tabview-tab":"{\"bounds\":{\"left\":20,\"top\":20,\"width\":20,\"height\":20},\"url\":\"http://example.com#7\",\"groupID\":1}"}},
22 {entries:[{url:"http://example.com#8"}],hidden:true,extData:{"tabview-tab":"{\"bounds\":{\"left\":20,\"top\":20,\"width\":20,\"height\":20},\"url\":\"http://example.com#8\",\"groupID\":1}"}}
23 ],selected:4,extData:{
24 "tabview-groups":"{\"nextID\":8,\"activeGroupId\":1}","tabview-group":"{\"1\":{\"bounds\":{\"left\":15,\"top\":10,\"width\":415,\"height\":367},\"userSize\":{\"x\":415,\"y\":367},\"title\":\"\",\"id\":1},\"2\":{\"bounds\":{\"left\":286,\"top\":488,\"width\":418,\"height\":313},\"title\":\"\",\"id\":2}}",
25 "tabview-ui":"{\"pageBounds\":{\"left\":0,\"top\":0,\"width\":940,\"height\":1075}}"
26 }}]};
27
28 function test() {
29 waitForExplicitFinish();
30
31 Services.prefs.setBoolPref("browser.sessionstore.restore_hidden_tabs", false);
32
33 TabsProgressListener.init();
34
35 registerCleanupFunction(function () {
36 TabsProgressListener.uninit();
37
38 Services.prefs.clearUserPref("browser.sessionstore.restore_hidden_tabs");
39
40 gBrowser.selectedTab = gBrowser.tabs[0];
41 ss.setBrowserState(stateBackup);
42 });
43
44 TabView._initFrame(function () {
45 executeSoon(testRestoreWithHiddenTabs);
46 });
47 }
48
49 function testRestoreWithHiddenTabs() {
50 TabsProgressListener.setCallback(function (needsRestore, isRestoring) {
51 if (needsRestore <= 4) {
52 TabsProgressListener.unsetCallback();
53 is(needsRestore, 4, "4/8 tabs restored");
54 }
55 });
56
57 waitForBrowserState(state, 4, function () {
58 is(gBrowser.tabs.length, 8, "there are now eight tabs");
59 is(gBrowser.visibleTabs.length, 4, "four visible tabs");
60
61 let cw = TabView.getContentWindow();
62 is(cw.GroupItems.groupItems.length, 2, "there are now two groupItems");
63
64 testSwitchToInactiveGroup();
65 });
66 }
67
68 function testSwitchToInactiveGroup() {
69 let firstProgress = true;
70
71 TabsProgressListener.setCallback(function (needsRestore, isRestoring) {
72 if (firstProgress) {
73 firstProgress = false;
74 is(isRestoring, 3, "restoring 3 tabs concurrently");
75 } else {
76 ok(isRestoring < 4, "restoring max. 3 tabs concurrently");
77 }
78
79 if (needsRestore)
80 return;
81
82 TabsProgressListener.unsetCallback();
83
84 is(gBrowser.visibleTabs.length, 4, "four visible tabs");
85 waitForFocus(finish);
86 });
87
88 gBrowser.selectedTab = gBrowser.tabs[4];
89 }
90
91 function waitForBrowserState(state, numTabs, callback) {
92 let tabContainer = gBrowser.tabContainer;
93 tabContainer.addEventListener("SSTabRestored", function onRestored() {
94 if (--numTabs <= 0) {
95 tabContainer.removeEventListener("SSTabRestored", onRestored, true);
96 executeSoon(callback);
97 }
98 }, true);
99
100 ss.setBrowserState(JSON.stringify(state));
101 }
102
103 function countTabs() {
104 let needsRestore = 0, isRestoring = 0;
105 let windowsEnum = Services.wm.getEnumerator("navigator:browser");
106
107 while (windowsEnum.hasMoreElements()) {
108 let window = windowsEnum.getNext();
109 if (window.closed)
110 continue;
111
112 for (let i = 0; i < window.gBrowser.tabs.length; i++) {
113 let browser = window.gBrowser.tabs[i].linkedBrowser;
114 if (browser.__SS_restoreState == TAB_STATE_RESTORING)
115 isRestoring++;
116 else if (browser.__SS_restoreState == TAB_STATE_NEEDS_RESTORE)
117 needsRestore++;
118 }
119 }
120
121 return [needsRestore, isRestoring];
122 }
123
124 let TabsProgressListener = {
125 init: function () {
126 gBrowser.addTabsProgressListener(this);
127 },
128
129 uninit: function () {
130 this.unsetCallback();
131 gBrowser.removeTabsProgressListener(this);
132 },
133
134 setCallback: function (callback) {
135 this.callback = callback;
136 },
137
138 unsetCallback: function () {
139 delete this.callback;
140 },
141
142 onStateChange: function (aBrowser, aWebProgress, aRequest, aStateFlags, aStatus) {
143 let isNetwork = aStateFlags & Ci.nsIWebProgressListener.STATE_IS_NETWORK;
144 let isWindow = aStateFlags & Ci.nsIWebProgressListener.STATE_IS_WINDOW;
145
146 if (!(this.callback && isNetwork && isWindow))
147 return;
148
149 let self = this;
150 let finalize = function () {
151 if (wasRestoring)
152 delete aBrowser.__wasRestoring;
153
154 self.callback.apply(null, countTabs());
155 };
156
157 let isRestoring = aBrowser.__SS_restoreState == TAB_STATE_RESTORING;
158 let wasRestoring = !aBrowser.__SS_restoreState && aBrowser.__wasRestoring;
159 let hasStopped = aStateFlags & Ci.nsIWebProgressListener.STATE_STOP;
160
161 if (isRestoring && !hasStopped)
162 aBrowser.__wasRestoring = true;
163
164 if (hasStopped && (isRestoring || wasRestoring))
165 finalize();
166 }
167 }

mercurial