browser_necko_l10n.js (3240B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 /* globals do_timeout */ 7 8 const { HttpServer } = ChromeUtils.importESModule( 9 "resource://testing-common/httpd.sys.mjs" 10 ); 11 12 const gOverride = Cc["@mozilla.org/network/native-dns-override;1"].getService( 13 Ci.nsINativeDNSResolverOverride 14 ); 15 16 const DOMAIN_NAME = "example.com"; 17 const HTTPS_FIRST = "dom.security.https_first"; 18 19 let statuspanelLabel = document.getElementById("statuspanel-label"); 20 21 registerCleanupFunction(function () { 22 Services.prefs.clearUserPref(HTTPS_FIRST); 23 }); 24 25 function waitForStatusChange(browser, expectedMessage) { 26 return new Promise(resolve => { 27 let listener = { 28 QueryInterface: ChromeUtils.generateQI([ 29 "nsIWebProgressListener", 30 "nsISupportsWeakReference", 31 ]), 32 33 onStatusChange(webProgress, request, status, message) { 34 info(`onStatusChange: ${message}`); 35 // When we catch the correct message 36 if (message === expectedMessage) { 37 browser.webProgress.removeProgressListener(listener); 38 resolve({ message }); 39 } 40 }, 41 onProgressChange() {}, 42 onLocationChange() {}, 43 onSecurityChange() {}, 44 onStateChange() {}, 45 onContentBlockingEvent() {}, 46 }; 47 48 browser.webProgress.addProgressListener( 49 listener, 50 Ci.nsIWebProgress.NOTIFY_STATUS 51 ); 52 }); 53 } 54 55 add_task(async function test_domain_change() { 56 await SpecialPowers.pushPrefEnv({ 57 set: [ 58 ["test.wait300msAfterTabSwitch", true], 59 [HTTPS_FIRST, false], 60 ], 61 }); 62 63 gOverride.addIPOverride(DOMAIN_NAME, "127.0.0.1"); 64 let server = new HttpServer(); 65 server.start(-1); 66 registerCleanupFunction(async () => { 67 await server.stop(); 68 gOverride.clearOverrides(); 69 }); 70 71 // eslint-disable-next-line @microsoft/sdl/no-insecure-url 72 let serverURL = `http://${DOMAIN_NAME}:${server.identity.primaryPort}/`; 73 server.identity.add("http", DOMAIN_NAME, server.identity.primaryPort); 74 75 server.registerPathHandler("/", (request, response) => { 76 response.processAsync(); 77 do_timeout(1000, () => { 78 response.setStatusLine(request.httpVersion, 200, "OK"); 79 response.setHeader("Content-Type", "text/html"); 80 const BODY = `testing..`; 81 response.bodyOutputStream.write(BODY, BODY.length); 82 response.finish(); 83 }); 84 }); 85 86 await SpecialPowers.pushPrefEnv({ 87 set: [["network.proxy.no_proxies_on", DOMAIN_NAME]], 88 }); 89 90 let browser = gBrowser.selectedBrowser; 91 let expectedMessage = `Waiting for ${DOMAIN_NAME}…`; 92 let statusPromise = waitForStatusChange(browser, expectedMessage); 93 BrowserTestUtils.startLoadingURIString(browser, serverURL); 94 let { message } = await statusPromise; 95 // There's a delay in the status label being updated, so by the time the 96 // progress listener sees waiting for, the statuspanel is still on 97 // looking up. This may be racy. 98 ok( 99 statuspanelLabel.value == `Looking up ${DOMAIN_NAME}…` || 100 statuspanelLabel.value == `Transferring data from ${DOMAIN_NAME}…`, 101 `statuspanel has expected value. got ${statuspanelLabel.value}` 102 ); 103 is(message, expectedMessage, "Status message was received correctly"); 104 });