forked from mirrors/gecko-dev
		
	 ccfae51c32
			
		
	
	
		ccfae51c32
		
	
	
	
	
		
			
			Differential Revision: https://phabricator.services.mozilla.com/D26996 --HG-- extra : moz-landing-system : lando
		
			
				
	
	
		
			97 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| add_task(async function() {
 | |
|   info("Starting tlsSessionTickets test");
 | |
| 
 | |
|   await SpecialPowers.flushPrefEnv();
 | |
|   await SpecialPowers.pushPrefEnv({"set": [
 | |
|     ["browser.cache.disk.enable", false],
 | |
|     ["browser.cache.memory.enable", false],
 | |
|     ["browser.contentblocking.allowlist.annotations.enabled", true],
 | |
|     ["browser.contentblocking.allowlist.storage.enabled", true],
 | |
|     ["network.cookie.cookieBehavior", Ci.nsICookieService.BEHAVIOR_REJECT_TRACKER],
 | |
|     ["privacy.trackingprotection.enabled", false],
 | |
|     ["privacy.trackingprotection.pbmode.enabled", false],
 | |
|     ["privacy.trackingprotection.annotate_channels", true],
 | |
|   ]});
 | |
| 
 | |
|   await UrlClassifierTestUtils.addTestTrackers();
 | |
| 
 | |
|   info("Creating a new tab");
 | |
|   let tab = BrowserTestUtils.addTab(gBrowser, TEST_TOP_PAGE);
 | |
|   gBrowser.selectedTab = tab;
 | |
| 
 | |
|   let browser = gBrowser.getBrowserForTab(tab);
 | |
|   await BrowserTestUtils.browserLoaded(browser);
 | |
| 
 | |
|   const trackingURL = "https://tlsresumptiontest.example.org/browser/toolkit/components/antitracking/test/browser/empty.js";
 | |
|   const kTopic = "http-on-examine-response";
 | |
| 
 | |
|   let resumedState = [];
 | |
|   let hashKeys = [];
 | |
| 
 | |
|   function observer(subject, topic, data) {
 | |
|     if (topic != kTopic) {
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     subject.QueryInterface(Ci.nsIChannel);
 | |
|     if (subject.URI.spec != trackingURL) {
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     resumedState.push(subject.securityInfo
 | |
|                              .QueryInterface(Ci.nsISSLSocketControl)
 | |
|                              .resumed);
 | |
|     hashKeys.push(subject.QueryInterface(Ci.nsIHttpChannelInternal)
 | |
|                          .connectionInfoHashKey);
 | |
|   }
 | |
| 
 | |
|   Services.obs.addObserver(observer, kTopic);
 | |
|   registerCleanupFunction(() => Services.obs.removeObserver(observer, kTopic));
 | |
| 
 | |
|   info("Loading tracking scripts and tracking images");
 | |
|   await ContentTask.spawn(browser, {trackingURL}, async function(obj) {
 | |
|     {
 | |
|       let src = content.document.createElement("script");
 | |
|       let p = new content.Promise(resolve => { src.onload = resolve; });
 | |
|       content.document.body.appendChild(src);
 | |
|       src.src = obj.trackingURL;
 | |
|       await p;
 | |
|     }
 | |
|   });
 | |
| 
 | |
|   // Load our tracking URL two more times, but this time in the first-party context.
 | |
|   // The TLS session should be resumed the second time here.
 | |
|   await fetch(trackingURL);
 | |
|   // Wait a little bit before issuing the second load to ensure both don't happen
 | |
|   // at the same time.
 | |
|   // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
 | |
|   await new Promise(resolve => setTimeout(resolve, 10));
 | |
|   await fetch(trackingURL).then(() => {
 | |
|     is(resumedState.length, 3, "We should have observed 3 loads for " + trackingURL);
 | |
|     ok(!resumedState[0], "The first load should NOT have been resumed");
 | |
|     ok(!resumedState[1], "The second load should NOT have been resumed");
 | |
|     ok(resumedState[2], "The third load SHOULD have been resumed");
 | |
| 
 | |
|     // We also verify that the hashKey of the first connection is different to
 | |
|     // both the second and third connections, and that the hashKey of the
 | |
|     // second and third connections are the same.  The reason why this check is
 | |
|     // done is that the private bit on the connection info object is used to
 | |
|     // construct the hash key, so when the connection is isolated because it
 | |
|     // comes from a third-party tracker context, its hash key must be
 | |
|     // different.
 | |
|     is(hashKeys.length, 3, "We should have observed 3 loads for " + trackingURL);
 | |
|     is(hashKeys[1], hashKeys[2], "The second and third hash keys should match");
 | |
|     isnot(hashKeys[0], hashKeys[1], "The first and second hash keys should not match");
 | |
|   });
 | |
| 
 | |
|   info("Removing the tab");
 | |
|   BrowserTestUtils.removeTab(tab);
 | |
| });
 | |
| 
 | |
| add_task(async function() {
 | |
|   info("Cleaning up.");
 | |
|   await new Promise(resolve => {
 | |
|     Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, value => resolve());
 | |
|   });
 | |
| });
 | |
| 
 |