|
1 /* Any copyright is dedicated to the Public Domain. |
|
2 http://creativecommons.org/publicdomain/zero/1.0/ */ |
|
3 |
|
4 let stateBackup = ss.getBrowserState(); |
|
5 |
|
6 let statePinned = {windows:[{tabs:[ |
|
7 {entries:[{url:"http://example.com#1"}], pinned: true} |
|
8 ]}]}; |
|
9 |
|
10 let state = {windows:[{tabs:[ |
|
11 {entries:[{url:"http://example.com#1"}]}, |
|
12 {entries:[{url:"http://example.com#2"}]}, |
|
13 {entries:[{url:"http://example.com#3"}]}, |
|
14 {entries:[{url:"http://example.com#4"}]}, |
|
15 ]}]}; |
|
16 |
|
17 function test() { |
|
18 waitForExplicitFinish(); |
|
19 |
|
20 registerCleanupFunction(function () { |
|
21 TabsProgressListener.uninit(); |
|
22 ss.setBrowserState(stateBackup); |
|
23 }); |
|
24 |
|
25 |
|
26 TabsProgressListener.init(); |
|
27 |
|
28 window.addEventListener("SSWindowStateReady", function onReady() { |
|
29 window.removeEventListener("SSWindowStateReady", onReady, false); |
|
30 |
|
31 let firstProgress = true; |
|
32 |
|
33 TabsProgressListener.setCallback(function (needsRestore, isRestoring) { |
|
34 if (firstProgress) { |
|
35 firstProgress = false; |
|
36 is(isRestoring, 3, "restoring 3 tabs concurrently"); |
|
37 } else { |
|
38 ok(isRestoring <= 3, "restoring max. 2 tabs concurrently"); |
|
39 } |
|
40 |
|
41 if (0 == needsRestore) { |
|
42 TabsProgressListener.unsetCallback(); |
|
43 waitForFocus(finish); |
|
44 } |
|
45 }); |
|
46 |
|
47 ss.setBrowserState(JSON.stringify(state)); |
|
48 }, false); |
|
49 |
|
50 ss.setBrowserState(JSON.stringify(statePinned)); |
|
51 } |
|
52 |
|
53 function countTabs() { |
|
54 let needsRestore = 0, isRestoring = 0; |
|
55 let windowsEnum = Services.wm.getEnumerator("navigator:browser"); |
|
56 |
|
57 while (windowsEnum.hasMoreElements()) { |
|
58 let window = windowsEnum.getNext(); |
|
59 if (window.closed) |
|
60 continue; |
|
61 |
|
62 for (let i = 0; i < window.gBrowser.tabs.length; i++) { |
|
63 let browser = window.gBrowser.tabs[i].linkedBrowser; |
|
64 if (browser.__SS_restoreState == TAB_STATE_RESTORING) |
|
65 isRestoring++; |
|
66 else if (browser.__SS_restoreState == TAB_STATE_NEEDS_RESTORE) |
|
67 needsRestore++; |
|
68 } |
|
69 } |
|
70 |
|
71 return [needsRestore, isRestoring]; |
|
72 } |
|
73 |
|
74 let TabsProgressListener = { |
|
75 init: function () { |
|
76 Services.obs.addObserver(this, "sessionstore-debug-tab-restored", false); |
|
77 }, |
|
78 |
|
79 uninit: function () { |
|
80 Services.obs.removeObserver(this, "sessionstore-debug-tab-restored"); |
|
81 this.unsetCallback(); |
|
82 }, |
|
83 |
|
84 setCallback: function (callback) { |
|
85 this.callback = callback; |
|
86 }, |
|
87 |
|
88 unsetCallback: function () { |
|
89 delete this.callback; |
|
90 }, |
|
91 |
|
92 observe: function (browser, topic, data) { |
|
93 TabsProgressListener.onRestored(browser); |
|
94 }, |
|
95 |
|
96 onRestored: function (browser) { |
|
97 if (this.callback && browser.__SS_restoreState == TAB_STATE_RESTORING) { |
|
98 this.callback.apply(null, countTabs()); |
|
99 } |
|
100 } |
|
101 } |