|
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 484108 **/ |
|
7 waitForExplicitFinish(); |
|
8 requestLongerTimeout(5); |
|
9 |
|
10 // builds the tests state based on a few parameters |
|
11 function buildTestState(num, selected, hidden, pinned) { |
|
12 let state = { windows: [ { "tabs": [], "selected": selected + 1 } ] }; |
|
13 while (num--) { |
|
14 state.windows[0].tabs.push({ |
|
15 entries: [ |
|
16 { url: "http://example.com/?t=" + state.windows[0].tabs.length } |
|
17 ] |
|
18 }); |
|
19 let i = state.windows[0].tabs.length - 1; |
|
20 if (hidden.length > 0 && i == hidden[0]) { |
|
21 state.windows[0].tabs[i].hidden = true; |
|
22 hidden.splice(0, 1); |
|
23 } |
|
24 if (pinned.length > 0 && i == pinned[0]) { |
|
25 state.windows[0].tabs[i].pinned = true; |
|
26 pinned.splice(0, 1); |
|
27 } |
|
28 } |
|
29 return state; |
|
30 } |
|
31 |
|
32 let tests = [ |
|
33 { testNum: 1, |
|
34 totalTabs: 13, |
|
35 selectedTab: 0, |
|
36 shownTabs: 6, |
|
37 hiddenTabs: [], |
|
38 pinnedTabs: [], |
|
39 order: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] |
|
40 }, |
|
41 { testNum: 2, |
|
42 totalTabs: 13, |
|
43 selectedTab: 12, |
|
44 shownTabs: 6, |
|
45 hiddenTabs: [], |
|
46 pinnedTabs: [], |
|
47 order: [12, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6] |
|
48 }, |
|
49 { testNum: 3, |
|
50 totalTabs: 13, |
|
51 selectedTab: 3, |
|
52 shownTabs: 6, |
|
53 hiddenTabs: [], |
|
54 pinnedTabs: [], |
|
55 order: [3, 4, 5, 6, 7, 8, 0, 1, 2, 9, 10, 11, 12] |
|
56 }, |
|
57 { testNum: 4, |
|
58 totalTabs: 13, |
|
59 selectedTab: 10, |
|
60 shownTabs: 6, |
|
61 hiddenTabs: [], |
|
62 pinnedTabs: [], |
|
63 order: [10, 7, 8, 9, 11, 12, 0, 1, 2, 3, 4, 5, 6] |
|
64 }, |
|
65 { testNum: 5, |
|
66 totalTabs: 13, |
|
67 selectedTab: 12, |
|
68 shownTabs: 6, |
|
69 hiddenTabs: [0, 4, 9], |
|
70 pinnedTabs: [], |
|
71 order: [12, 6, 7, 8, 10, 11, 1, 2, 3, 5, 0, 4, 9] |
|
72 }, |
|
73 { testNum: 6, |
|
74 totalTabs: 13, |
|
75 selectedTab: 3, |
|
76 shownTabs: 6, |
|
77 hiddenTabs: [1, 7, 12], |
|
78 pinnedTabs: [], |
|
79 order: [3, 4, 5, 6, 8, 9, 0, 2, 10, 11, 1, 7, 12] |
|
80 }, |
|
81 { testNum: 7, |
|
82 totalTabs: 13, |
|
83 selectedTab: 3, |
|
84 shownTabs: 6, |
|
85 hiddenTabs: [0, 1, 2], |
|
86 pinnedTabs: [], |
|
87 order: [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 1, 2] |
|
88 }, |
|
89 { testNum: 8, |
|
90 totalTabs: 13, |
|
91 selectedTab: 0, |
|
92 shownTabs: 6, |
|
93 hiddenTabs: [], |
|
94 pinnedTabs: [0], |
|
95 order: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] |
|
96 }, |
|
97 { testNum: 9, |
|
98 totalTabs: 13, |
|
99 selectedTab: 1, |
|
100 shownTabs: 6, |
|
101 hiddenTabs: [], |
|
102 pinnedTabs: [0], |
|
103 order: [1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] |
|
104 }, |
|
105 { testNum: 10, |
|
106 totalTabs: 13, |
|
107 selectedTab: 3, |
|
108 shownTabs: 6, |
|
109 hiddenTabs: [2], |
|
110 pinnedTabs: [0,1], |
|
111 order: [3, 0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 2] |
|
112 }, |
|
113 { testNum: 11, |
|
114 totalTabs: 13, |
|
115 selectedTab: 12, |
|
116 shownTabs: 6, |
|
117 hiddenTabs: [], |
|
118 pinnedTabs: [0,1,2], |
|
119 order: [12, 0, 1, 2, 7, 8, 9, 10, 11, 3, 4, 5, 6] |
|
120 }, |
|
121 { testNum: 12, |
|
122 totalTabs: 13, |
|
123 selectedTab: 6, |
|
124 shownTabs: 6, |
|
125 hiddenTabs: [3,4,5], |
|
126 pinnedTabs: [0,1,2], |
|
127 order: [6, 0, 1, 2, 7, 8, 9, 10, 11, 12, 3, 4, 5] |
|
128 }, |
|
129 { testNum: 13, |
|
130 totalTabs: 13, |
|
131 selectedTab: 1, |
|
132 shownTabs: 6, |
|
133 hiddenTabs: [3,4,5], |
|
134 pinnedTabs: [0,1,2], |
|
135 order: [1, 0, 2, 6, 7, 8, 9, 10, 11, 12, 3, 4, 5] |
|
136 }, |
|
137 { testNum: 14, |
|
138 totalTabs: 13, |
|
139 selectedTab: 2, |
|
140 shownTabs: 6, |
|
141 hiddenTabs: [], |
|
142 pinnedTabs: [0,1,2], |
|
143 order: [2, 0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] |
|
144 }, |
|
145 { testNum: 15, |
|
146 totalTabs: 13, |
|
147 selectedTab: 3, |
|
148 shownTabs: 6, |
|
149 hiddenTabs: [1,4], |
|
150 pinnedTabs: [0,1,2], |
|
151 order: [3, 0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 4] |
|
152 } |
|
153 ]; |
|
154 |
|
155 let tabMinWidth = |
|
156 parseInt(getComputedStyle(gBrowser.selectedTab, null).minWidth); |
|
157 let testIndex = 0; |
|
158 |
|
159 function runNextTest() { |
|
160 if (tests.length == 0) { |
|
161 finish(); |
|
162 return; |
|
163 } |
|
164 |
|
165 let wu = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) |
|
166 .getInterface(Components.interfaces.nsIDOMWindowUtils); |
|
167 wu.garbageCollect(); |
|
168 |
|
169 setTimeout(function() { |
|
170 info ("Starting test " + (++testIndex)); |
|
171 let test = tests.shift(); |
|
172 let state = buildTestState(test.totalTabs, test.selectedTab, |
|
173 test.hiddenTabs, test.pinnedTabs); |
|
174 let tabbarWidth = Math.floor((test.shownTabs - 0.5) * tabMinWidth); |
|
175 let win = openDialog(location, "_blank", "chrome,all,dialog=no"); |
|
176 let tabsRestored = []; |
|
177 |
|
178 win.addEventListener("SSTabRestoring", function onSSTabRestoring(aEvent) { |
|
179 let tab = aEvent.originalTarget; |
|
180 let tabLink = tab.linkedBrowser.currentURI.spec; |
|
181 let tabIndex = |
|
182 tabLink.substring(tabLink.indexOf("?t=") + 3, tabLink.length); |
|
183 |
|
184 // we need to compare with the tab's restoring index, no with the |
|
185 // position index, since the pinned tabs change the positions in the |
|
186 // tabbar. |
|
187 tabsRestored.push(tabIndex); |
|
188 |
|
189 if (tabsRestored.length < state.windows[0].tabs.length) |
|
190 return; |
|
191 |
|
192 // all of the tabs should be restoring or restored by now |
|
193 is(tabsRestored.length, state.windows[0].tabs.length, |
|
194 "Test #" + testIndex + ": Number of restored tabs is as expected"); |
|
195 |
|
196 is(tabsRestored.join(" "), test.order.join(" "), |
|
197 "Test #" + testIndex + ": 'visible' tabs restored first"); |
|
198 |
|
199 // cleanup |
|
200 win.removeEventListener("SSTabRestoring", onSSTabRestoring, false); |
|
201 win.close(); |
|
202 executeSoon(runNextTest); |
|
203 }, false); |
|
204 |
|
205 whenWindowLoaded(win, function(aEvent) { |
|
206 let extent = |
|
207 win.outerWidth - win.gBrowser.tabContainer.mTabstrip.scrollClientSize; |
|
208 let windowWidth = tabbarWidth + extent; |
|
209 win.resizeTo(windowWidth, win.outerHeight); |
|
210 ss.setWindowState(win, JSON.stringify(state), true); |
|
211 }); |
|
212 }, 1000); |
|
213 }; |
|
214 |
|
215 runNextTest(); |
|
216 } |