"use strict"; Services.scriptloader.loadSubScript( new URL("head_local_network_access.js", gTestPath).href, this ); add_setup(async function () { await setupLnaPrefs(); await setupLnaServer(); }); requestLongerTimeout(4); add_task(async function test_lna_prompt_behavior() { // Non-LNA test: no prompt expected for (const test of testCases) { const rand = Math.random(); await runSingleTestCase( test, rand, test.allowStatus, `Non-LNA test for ${test.type}` ); } // Public -> Local test (loopback-network permission) Services.prefs.setCharPref( "network.lna.address_space.public.override", "127.0.0.1:4443" ); for (const test of testCases) { await runPromptedLnaTest(test, "public", "loopback-network"); } // Public -> Private (local-network permission) Services.prefs.setCharPref( "network.lna.address_space.private.override", "127.0.0.1:21555" ); for (const test of testCases) { await runPromptedLnaTest(test, "private", "local-network"); } Services.prefs.clearUserPref("network.lna.address_space.public.override"); Services.prefs.clearUserPref("network.lna.address_space.private.override"); }); add_task(async function test_lna_cancellation_during_prompt() { info("Testing LNA cancellation during permission prompt"); // Disable RCWN but enable caching for this test await SpecialPowers.pushPrefEnv({ set: [ ["network.http.rcwn.enabled", false], ["browser.cache.disk.enable", true], ["browser.cache.memory.enable", true], ["network.lna.address_space.public.override", "127.0.0.1:4443"], ], }); const testType = "fetch"; const rand1 = Math.random(); // Test 1: Cancel request during LNA prompt and verify proper cleanup info( "Step 1: Making request that will trigger LNA prompt, then cancelling it" ); // Open tab and wait for LNA prompt const tab1 = await BrowserTestUtils.openNewForegroundTab( gBrowser, `${LNA_BASE_URL}page_with_non_trackers.html?test=${testType}&rand=${rand1}` ); // Wait for the LNA permission prompt to appear await BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popupshown"); info("LNA permission prompt appeared"); gBrowser.removeTab(tab1); // Navigate to a new URL (which should cancel the pending request) const tab2 = await BrowserTestUtils.openNewForegroundTab( gBrowser, `${LNA_BASE_URL}page_with_non_trackers.html?test=${testType}&rand=${rand1}` ); info("Navigated to new URL, request should be cancelled"); // Wait for the navigation to complete await BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popupshown"); clickDoorhangerButton( PROMPT_ALLOW_BUTTON, gBrowser.selectedBrowser, "loopback-network" ); // Close the first tab now that we're done with it gBrowser.removeTab(tab2); // The main test objective is complete - we verified that cancellation // during LNA prompt works without hanging channels. The navigation // completed successfully, which means our fix is working correctly. info( "Test completed successfully - cancellation during LNA prompt handled correctly" ); await SpecialPowers.popPrefEnv(); });