mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 10:18:41 +02:00 
			
		
		
		
	# ignore-this-changeset Differential Revision: https://phabricator.services.mozilla.com/D36042 --HG-- extra : source : d3afcafdce650a6f36cebbc126ee93b17f13cf52
		
			
				
	
	
		
			140 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* Any copyright is dedicated to the Public Domain.
 | 
						|
   http://creativecommons.org/publicdomain/zero/1.0/ */
 | 
						|
 | 
						|
var stateBackup = ss.getBrowserState();
 | 
						|
 | 
						|
var statePinned = {
 | 
						|
  windows: [
 | 
						|
    {
 | 
						|
      tabs: [
 | 
						|
        {
 | 
						|
          entries: [
 | 
						|
            { url: "http://example.com#1", triggeringPrincipal_base64 },
 | 
						|
          ],
 | 
						|
          pinned: true,
 | 
						|
        },
 | 
						|
      ],
 | 
						|
    },
 | 
						|
  ],
 | 
						|
};
 | 
						|
 | 
						|
var state = {
 | 
						|
  windows: [
 | 
						|
    {
 | 
						|
      tabs: [
 | 
						|
        {
 | 
						|
          entries: [
 | 
						|
            { url: "http://example.com#1", triggeringPrincipal_base64 },
 | 
						|
          ],
 | 
						|
        },
 | 
						|
        {
 | 
						|
          entries: [
 | 
						|
            { url: "http://example.com#2", triggeringPrincipal_base64 },
 | 
						|
          ],
 | 
						|
        },
 | 
						|
        {
 | 
						|
          entries: [
 | 
						|
            { url: "http://example.com#3", triggeringPrincipal_base64 },
 | 
						|
          ],
 | 
						|
        },
 | 
						|
        {
 | 
						|
          entries: [
 | 
						|
            { url: "http://example.com#4", triggeringPrincipal_base64 },
 | 
						|
          ],
 | 
						|
        },
 | 
						|
      ],
 | 
						|
    },
 | 
						|
  ],
 | 
						|
};
 | 
						|
 | 
						|
function test() {
 | 
						|
  waitForExplicitFinish();
 | 
						|
 | 
						|
  registerCleanupFunction(function() {
 | 
						|
    TabsProgressListener.uninit();
 | 
						|
    ss.setBrowserState(stateBackup);
 | 
						|
  });
 | 
						|
 | 
						|
  TabsProgressListener.init();
 | 
						|
 | 
						|
  window.addEventListener(
 | 
						|
    "SSWindowStateReady",
 | 
						|
    function() {
 | 
						|
      let firstProgress = true;
 | 
						|
 | 
						|
      TabsProgressListener.setCallback(function(needsRestore, isRestoring) {
 | 
						|
        if (firstProgress) {
 | 
						|
          firstProgress = false;
 | 
						|
          is(isRestoring, 3, "restoring 3 tabs concurrently");
 | 
						|
        } else {
 | 
						|
          ok(isRestoring <= 3, "restoring max. 2 tabs concurrently");
 | 
						|
        }
 | 
						|
 | 
						|
        if (0 == needsRestore) {
 | 
						|
          TabsProgressListener.unsetCallback();
 | 
						|
          waitForFocus(finish);
 | 
						|
        }
 | 
						|
      });
 | 
						|
 | 
						|
      ss.setBrowserState(JSON.stringify(state));
 | 
						|
    },
 | 
						|
    { once: true }
 | 
						|
  );
 | 
						|
 | 
						|
  ss.setBrowserState(JSON.stringify(statePinned));
 | 
						|
}
 | 
						|
 | 
						|
function countTabs() {
 | 
						|
  let needsRestore = 0,
 | 
						|
    isRestoring = 0;
 | 
						|
  for (let window of Services.wm.getEnumerator("navigator:browser")) {
 | 
						|
    if (window.closed) {
 | 
						|
      continue;
 | 
						|
    }
 | 
						|
 | 
						|
    for (let i = 0; i < window.gBrowser.tabs.length; i++) {
 | 
						|
      let browserState = ss.getInternalObjectState(
 | 
						|
        window.gBrowser.tabs[i].linkedBrowser
 | 
						|
      );
 | 
						|
      if (browserState == TAB_STATE_RESTORING) {
 | 
						|
        isRestoring++;
 | 
						|
      } else if (browserState == TAB_STATE_NEEDS_RESTORE) {
 | 
						|
        needsRestore++;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return [needsRestore, isRestoring];
 | 
						|
}
 | 
						|
 | 
						|
var TabsProgressListener = {
 | 
						|
  init() {
 | 
						|
    Services.obs.addObserver(this, "sessionstore-debug-tab-restored");
 | 
						|
  },
 | 
						|
 | 
						|
  uninit() {
 | 
						|
    Services.obs.removeObserver(this, "sessionstore-debug-tab-restored");
 | 
						|
    this.unsetCallback();
 | 
						|
  },
 | 
						|
 | 
						|
  setCallback(callback) {
 | 
						|
    this.callback = callback;
 | 
						|
  },
 | 
						|
 | 
						|
  unsetCallback() {
 | 
						|
    delete this.callback;
 | 
						|
  },
 | 
						|
 | 
						|
  observe(browser, topic, data) {
 | 
						|
    TabsProgressListener.onRestored(browser);
 | 
						|
  },
 | 
						|
 | 
						|
  onRestored(browser) {
 | 
						|
    if (
 | 
						|
      this.callback &&
 | 
						|
      ss.getInternalObjectState(browser) == TAB_STATE_RESTORING
 | 
						|
    ) {
 | 
						|
      this.callback.apply(null, countTabs());
 | 
						|
    }
 | 
						|
  },
 | 
						|
};
 |