forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			155 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| const NUM_TABS = 12;
 | |
| 
 | |
| var stateBackup = ss.getBrowserState();
 | |
| 
 | |
| function test() {
 | |
|   /** Test for Bug 590268 - Provide access to sessionstore tab data sooner **/
 | |
|   waitForExplicitFinish();
 | |
|   requestLongerTimeout(2);
 | |
| 
 | |
|   // wasLoaded will be used to keep track of tabs that have already had SSTabRestoring
 | |
|   // fired for them.
 | |
|   let wasLoaded = {};
 | |
|   let restoringTabsCount = 0;
 | |
|   let restoredTabsCount = 0;
 | |
|   let uniq2 = {};
 | |
|   let uniq2Count = 0;
 | |
|   let state = { windows: [{ tabs: [] }] };
 | |
|   // We're going to put a bunch of tabs into this state
 | |
|   for (let i = 0; i < NUM_TABS; i++) {
 | |
|     let uniq = r();
 | |
|     let tabData = {
 | |
|       entries: [
 | |
|         { url: "http://example.com/#" + i, triggeringPrincipal_base64 },
 | |
|       ],
 | |
|       extData: { uniq, baz: "qux" },
 | |
|     };
 | |
|     state.windows[0].tabs.push(tabData);
 | |
|     wasLoaded[uniq] = false;
 | |
|   }
 | |
| 
 | |
|   function onSSTabRestoring(aEvent) {
 | |
|     restoringTabsCount++;
 | |
|     let uniq = ss.getCustomTabValue(aEvent.originalTarget, "uniq");
 | |
|     wasLoaded[uniq] = true;
 | |
| 
 | |
|     is(
 | |
|       ss.getCustomTabValue(aEvent.originalTarget, "foo"),
 | |
|       "",
 | |
|       "There is no value for 'foo'"
 | |
|     );
 | |
| 
 | |
|     // On the first SSTabRestoring we're going to run the the real test.
 | |
|     // We'll keep this listener around so we can keep marking tabs as restored.
 | |
|     if (restoringTabsCount == 1) {
 | |
|       onFirstSSTabRestoring();
 | |
|     } else if (restoringTabsCount == NUM_TABS) {
 | |
|       onLastSSTabRestoring();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   function onSSTabRestored(aEvent) {
 | |
|     if (++restoredTabsCount < NUM_TABS) {
 | |
|       return;
 | |
|     }
 | |
|     cleanup();
 | |
|   }
 | |
| 
 | |
|   function onTabOpen(aEvent) {
 | |
|     // To test bug 614708, we'll just set a value on the tab here. This value
 | |
|     // would previously cause us to not recognize the values in extData until
 | |
|     // much later. So testing "uniq" failed.
 | |
|     ss.setCustomTabValue(aEvent.originalTarget, "foo", "bar");
 | |
|   }
 | |
| 
 | |
|   // This does the actual testing. SSTabRestoring should be firing on tabs from
 | |
|   // left to right, so we're going to start with the rightmost tab.
 | |
|   function onFirstSSTabRestoring() {
 | |
|     info("onFirstSSTabRestoring...");
 | |
|     for (let i = gBrowser.tabs.length - 1; i >= 0; i--) {
 | |
|       let tab = gBrowser.tabs[i];
 | |
|       let actualUniq = ss.getCustomTabValue(tab, "uniq");
 | |
|       let expectedUniq = state.windows[0].tabs[i].extData.uniq;
 | |
| 
 | |
|       if (wasLoaded[actualUniq]) {
 | |
|         info("tab " + i + ": already restored");
 | |
|         continue;
 | |
|       }
 | |
|       is(actualUniq, expectedUniq, "tab " + i + ": extData was correct");
 | |
| 
 | |
|       // Now we're going to set a piece of data back on the tab so it can be read
 | |
|       // to test setting a value "early".
 | |
|       uniq2[actualUniq] = r();
 | |
|       ss.setCustomTabValue(tab, "uniq2", uniq2[actualUniq]);
 | |
| 
 | |
|       // Delete the value we have for "baz". This tests that deleteCustomTabValue
 | |
|       // will delete "early access" values (c.f. bug 617175). If this doesn't throw
 | |
|       // then the test is successful.
 | |
|       try {
 | |
|         ss.deleteCustomTabValue(tab, "baz");
 | |
|       } catch (e) {
 | |
|         ok(false, "no error calling deleteCustomTabValue - " + e);
 | |
|       }
 | |
| 
 | |
|       // This will be used in the final comparison to make sure we checked the
 | |
|       // same number as we set.
 | |
|       uniq2Count++;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   function onLastSSTabRestoring() {
 | |
|     let checked = 0;
 | |
|     for (let i = 0; i < gBrowser.tabs.length; i++) {
 | |
|       let tab = gBrowser.tabs[i];
 | |
|       let uniq = ss.getCustomTabValue(tab, "uniq");
 | |
| 
 | |
|       // Look to see if we set a uniq2 value for this uniq value
 | |
|       if (uniq in uniq2) {
 | |
|         is(
 | |
|           ss.getCustomTabValue(tab, "uniq2"),
 | |
|           uniq2[uniq],
 | |
|           "tab " + i + " has correct uniq2 value"
 | |
|         );
 | |
|         checked++;
 | |
|       }
 | |
|     }
 | |
|     ok(uniq2Count > 0, "at least 1 tab properly checked 'early access'");
 | |
|     is(checked, uniq2Count, "checked the same number of uniq2 as we set");
 | |
|   }
 | |
| 
 | |
|   function cleanup() {
 | |
|     // remove the event listener and clean up before finishing
 | |
|     gBrowser.tabContainer.removeEventListener(
 | |
|       "SSTabRestoring",
 | |
|       onSSTabRestoring
 | |
|     );
 | |
|     gBrowser.tabContainer.removeEventListener(
 | |
|       "SSTabRestored",
 | |
|       onSSTabRestored,
 | |
|       true
 | |
|     );
 | |
|     gBrowser.tabContainer.removeEventListener("TabOpen", onTabOpen);
 | |
|     // Put this in an executeSoon because we still haven't called restoreNextTab
 | |
|     // in sessionstore for the last tab (we'll call it after this). We end up
 | |
|     // trying to restore the tab (since we then add a closed tab to the array).
 | |
|     executeSoon(function () {
 | |
|       ss.setBrowserState(stateBackup);
 | |
|       executeSoon(finish);
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   // Add the event listeners
 | |
|   gBrowser.tabContainer.addEventListener("SSTabRestoring", onSSTabRestoring);
 | |
|   gBrowser.tabContainer.addEventListener(
 | |
|     "SSTabRestored",
 | |
|     onSSTabRestored,
 | |
|     true
 | |
|   );
 | |
|   gBrowser.tabContainer.addEventListener("TabOpen", onTabOpen);
 | |
|   // Restore state
 | |
|   ss.setBrowserState(JSON.stringify(state));
 | |
| }
 | 
