/* Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/ */ let win; let contentWindow; let originalTab; function test() { waitForExplicitFinish(); setup(); } function setup() { win = window.openDialog(getBrowserURL(), "_blank", "chrome,all,dialog=no,height=800,width=800"); let onLoad = function() { win.removeEventListener("load", onLoad, false); originalTab = win.gBrowser.visibleTabs[0]; win.gBrowser.addTab(); win.gBrowser.pinTab(originalTab); let onTabViewShown = function() { win.removeEventListener("tabviewshown", onTabViewShown, false); ok(win.TabView.isVisible(), "Tab View is visible"); contentWindow = win.document.getElementById("tab-view").contentWindow; is(contentWindow.GroupItems.groupItems.length, 1, "There is one group"); is(contentWindow.GroupItems.groupItems[0].getChildren().length, 1, "The group has only one tab item"); // show the undo close group button let group = contentWindow.GroupItems.groupItems[0]; group.closeAll(); group.addSubscriber(group, "groupHidden", function() { group.removeSubscriber(group, "groupHidden"); restore(group.id); }); }; win.addEventListener("tabviewshown", onTabViewShown, false); win.TabView.toggle(); } win.addEventListener("load", onLoad, false); } function restore(groupId) { // window state ready let handleSSWindowStateReady = function() { win.removeEventListener("SSWindowStateReady", handleSSWindowStateReady, false); executeSoon(function() { is(contentWindow.GroupItems.groupItems.length, 1, "There is one group"); let group = contentWindow.GroupItems.groupItems[0]; ok(!group.hidden, "The group is visible"); is(group.getChildren().length, 2, "This group has two tab items"); // check the position of the group item and the tab items. let tabItemOne = group.getChildren()[0]; let tabItemTwo = group.getChildren()[1]; let groupBounds = group.getBounds(); let tabItemOneBounds = tabItemOne.getBounds(); let tabItemTwoBounds = tabItemTwo.getBounds(); ok(groupBounds.left < tabItemOneBounds.left && (groupBounds.right) > (tabItemOneBounds.right) && groupBounds.top < tabItemOneBounds.top && (groupBounds.bottom) > (tabItemOneBounds.bottom), "Tab item one is within the group"); ok(groupBounds.left < tabItemOneBounds.left && (groupBounds.right) > (tabItemTwoBounds.right) && groupBounds.top < tabItemOneBounds.top && (groupBounds.bottom) > (tabItemTwoBounds.bottom), "Tab item two is within the group"); win.close(); finish(); }); } win.addEventListener("SSWindowStateReady", handleSSWindowStateReady, false); // simulate restoring previous session (one group and two tab items) const DUMMY_PAGE_URL = "http://example.com/"; let newState = { windows: [{ tabs: [{ entries: [{ url: DUMMY_PAGE_URL }], index: 2, hidden: false, attributes: {}, extData: { "tabview-tab": '{"bounds":{"left":208,"top":54,"width":205,"height":169},' + '"userSize":null,"url":"' + DUMMY_PAGE_URL + '","groupID":' + groupId + ',"imageData":null,"title":null}' }}, { entries: [{ url: DUMMY_PAGE_URL }], index: 1, hidden: false, attributes: {}, extData: { "tabview-tab": '{"bounds":{"left":429,"top":54,"width":205,"height":169},' + '"userSize":null,"url":"' + DUMMY_PAGE_URL + '","groupID":' + groupId + ',"imageData":null,"title":null}' } }], extData: { "tabview-groups": '{"nextID":' + (groupId + 1) + ',"activeGroupId":' + groupId + '}', "tabview-group": '{"' + groupId + '":{"bounds":{"left":202,"top":30,"width":455,"height":249},' + '"userSize":null,"locked":{},"title":"","id":' + groupId +'}}', "tabview-ui": '{"pageBounds":{"left":0,"top":0,"width":788,"height":548}}' }, sizemode:"normal" }] }; let ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore); ss.setWindowState(win, JSON.stringify(newState), false); }