browser/components/tabview/test/browser_tabview_bug595601.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* Any copyright is dedicated to the Public Domain.
     2    http://creativecommons.org/publicdomain/zero/1.0/ */
     4 let ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);
     6 const TAB_STATE_NEEDS_RESTORE = 1;
     7 const TAB_STATE_RESTORING = 2;
     9 let stateBackup = ss.getBrowserState();
    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}"}},
    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 }}]};
    28 function test() {
    29   waitForExplicitFinish();
    31   Services.prefs.setBoolPref("browser.sessionstore.restore_hidden_tabs", false);
    33   TabsProgressListener.init();
    35   registerCleanupFunction(function () {
    36     TabsProgressListener.uninit();
    38     Services.prefs.clearUserPref("browser.sessionstore.restore_hidden_tabs");
    40     gBrowser.selectedTab = gBrowser.tabs[0];
    41     ss.setBrowserState(stateBackup);
    42   });
    44   TabView._initFrame(function () {
    45     executeSoon(testRestoreWithHiddenTabs);
    46   });
    47 }
    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   });
    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");
    61     let cw = TabView.getContentWindow();
    62     is(cw.GroupItems.groupItems.length, 2, "there are now two groupItems");
    64     testSwitchToInactiveGroup();
    65   });
    66 }
    68 function testSwitchToInactiveGroup() {
    69   let firstProgress = true;
    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     }
    79     if (needsRestore)
    80       return;
    82     TabsProgressListener.unsetCallback();
    84     is(gBrowser.visibleTabs.length, 4, "four visible tabs");
    85     waitForFocus(finish);
    86   });
    88   gBrowser.selectedTab = gBrowser.tabs[4];
    89 }
    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);
   100   ss.setBrowserState(JSON.stringify(state));
   101 }
   103 function countTabs() {
   104   let needsRestore = 0, isRestoring = 0;
   105   let windowsEnum = Services.wm.getEnumerator("navigator:browser");
   107   while (windowsEnum.hasMoreElements()) {
   108     let window = windowsEnum.getNext();
   109     if (window.closed)
   110       continue;
   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   }
   121   return [needsRestore, isRestoring];
   122 }
   124 let TabsProgressListener = {
   125   init: function () {
   126     gBrowser.addTabsProgressListener(this);
   127   },
   129   uninit: function () {
   130     this.unsetCallback();
   131     gBrowser.removeTabsProgressListener(this);
   132  },
   134   setCallback: function (callback) {
   135     this.callback = callback;
   136   },
   138   unsetCallback: function () {
   139     delete this.callback;
   140   },
   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;
   146     if (!(this.callback && isNetwork && isWindow))
   147       return;
   149     let self = this;
   150     let finalize = function () {
   151       if (wasRestoring)
   152         delete aBrowser.__wasRestoring;
   154       self.callback.apply(null, countTabs());
   155     };
   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;
   161     if (isRestoring && !hasStopped)
   162       aBrowser.__wasRestoring = true;
   164     if (hasStopped && (isRestoring || wasRestoring))
   165       finalize();
   166   }
   167 }

mercurial