Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  browser_bug1303838.js

  Sprache: JAVA
 

/* 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/. */


/**
 * Test for bug 1303838.
 * Load a tab with some links, emulate link clicks and check if the
 * browser would switch to the existing target tab opened by previous
 * link click if loadDivertedInBackground is set to true.
 */


"use strict";

const BASE_URL = "http://mochi.test:8888/browser/dom/base/test/";

add_task(async function () {
  // On Linux, in our test automation, the mouse cursor floats over
  // the first tab, which causes it to be warmed up when tab warming
  // is enabled. The TabSwitchDone event doesn't fire until the warmed
  // tab is evicted, which is after a few seconds. That means that
  // this test ends up taking longer than we'd like, since its waiting
  // for the TabSwitchDone event between tab switches.
  //
  // So now we make sure that warmed tabs are evicted very shortly
  // after warming to avoid the test running too long.
  await SpecialPowers.pushPrefEnv({
    set: [
      ["browser.tabs.remote.warmup.unloadDelayMs"50],
      ["test.wait300msAfterTabSwitch"true],
    ],
  });
  await testLinkClick(falsefalse);
  await testLinkClick(falsetrue);
  await testLinkClick(truefalse);
  await testLinkClick(truetrue);
});

async function waitForTestReady(loadDivertedInBackground, tab) {
  if (!loadDivertedInBackground) {
    await BrowserTestUtils.switchTab(gBrowser, tab);
  } else {
    await new Promise(resolve => setTimeout(resolve, 0));
  }
}

async function testLinkClick(withFrame, loadDivertedInBackground) {
  await SpecialPowers.pushPrefEnv({
    set: [["browser.tabs.loadDivertedInBackground", loadDivertedInBackground]],
  });

  let tab = await BrowserTestUtils.openNewForegroundTab(
    gBrowser,
    BASE_URL +
      (withFrame ? "file_bug1303838_with_iframe.html" : "file_bug1303838.html")
  );
  is(gBrowser.tabs.length, 2"check tabs.length");
  is(gBrowser.selectedTab, tab, "check selectedTab");

  info(
    "Test normal links with loadDivertedInBackground=" +
      loadDivertedInBackground +
      ", withFrame=" +
      withFrame
  );

  let testTabPromise = BrowserTestUtils.waitForNewTab(gBrowser);
  await clickLink(withFrame, "#link-1", tab.linkedBrowser);
  let testTab = await testTabPromise;
  is(gBrowser.tabs.length, 3"check tabs.length");
  is(
    gBrowser.selectedTab,
    loadDivertedInBackground ? tab : testTab,
    "check selectedTab"
  );

  await waitForTestReady(loadDivertedInBackground, tab);
  await clickLink(
    withFrame,
    "#link-2",
    tab.linkedBrowser,
    testTab.linkedBrowser,
    !loadDivertedInBackground
  );
  is(gBrowser.tabs.length, 3"check tabs.length");
  is(
    gBrowser.selectedTab,
    loadDivertedInBackground ? tab : testTab,
    "check selectedTab"
  );

  await waitForTestReady(loadDivertedInBackground, tab);
  await clickLink(
    withFrame,
    "#link-3",
    tab.linkedBrowser,
    testTab.linkedBrowser,
    !loadDivertedInBackground
  );
  is(gBrowser.tabs.length, 3"check tabs.length");
  is(
    gBrowser.selectedTab,
    loadDivertedInBackground ? tab : testTab,
    "check selectedTab"
  );

  await waitForTestReady(loadDivertedInBackground, tab);
  await clickLink(
    withFrame,
    "#link-4",
    tab.linkedBrowser,
    testTab.linkedBrowser,
    !loadDivertedInBackground
  );
  is(gBrowser.tabs.length, 3"check tabs.length");
  is(
    gBrowser.selectedTab,
    loadDivertedInBackground ? tab : testTab,
    "check selectedTab"
  );

  // Location APIs shouldn't steal focus.
  await waitForTestReady(loadDivertedInBackground, tab);
  await clickLink(
    withFrame,
    "#link-5",
    tab.linkedBrowser,
    testTab.linkedBrowser,
    /* awaitTabSwitch = */ false
  );
  is(gBrowser.tabs.length, 3"check tabs.length");
  is(gBrowser.selectedTab, tab, "check selectedTab");

  await waitForTestReady(/* diverted = */ true, tab);
  await clickLink(
    withFrame,
    "#link-6",
    tab.linkedBrowser,
    testTab.linkedBrowser,
    /* awaitTabSwitch = */ false
  );
  is(gBrowser.tabs.length, 3"check tabs.length");
  is(gBrowser.selectedTab, tab, "check selectedTab");

  await waitForTestReady(/* diverted = */ true, tab);
  let loaded = BrowserTestUtils.browserLoaded(
    testTab.linkedBrowser,
    true,
    "data:text/html;charset=utf-8,testFrame"
  );
  await clickLink(
    withFrame,
    "#link-7",
    tab.linkedBrowser,
    testTab.linkedBrowser,
    !loadDivertedInBackground,
    false
  );
  await loaded;
  is(gBrowser.tabs.length, 3"check tabs.length");
  is(
    gBrowser.selectedTab,
    loadDivertedInBackground ? tab : testTab,
    "check selectedTab"
  );

  info(
    "Test anchor links with loadDivertedInBackground=" +
      loadDivertedInBackground +
      ", withFrame=" +
      withFrame
  );

  await waitForTestReady(loadDivertedInBackground, tab);
  await clickLink(
    withFrame,
    "#anchor-link-1",
    tab.linkedBrowser,
    testTab.linkedBrowser,
    !loadDivertedInBackground
  );
  is(gBrowser.tabs.length, 3"check tabs.length");
  is(
    gBrowser.selectedTab,
    loadDivertedInBackground ? tab : testTab,
    "check selectedTab"
  );

  await waitForTestReady(loadDivertedInBackground, tab);
  await clickLink(
    withFrame,
    "#anchor-link-2",
    tab.linkedBrowser,
    testTab.linkedBrowser,
    !loadDivertedInBackground
  );
  is(gBrowser.tabs.length, 3"check tabs.length");
  is(
    gBrowser.selectedTab,
    loadDivertedInBackground ? tab : testTab,
    "check selectedTab"
  );

  await waitForTestReady(loadDivertedInBackground, tab);
  await clickLink(
    withFrame,
    "#anchor-link-3",
    tab.linkedBrowser,
    testTab.linkedBrowser,
    !loadDivertedInBackground
  );
  is(gBrowser.tabs.length, 3"check tabs.length");
  is(
    gBrowser.selectedTab,
    loadDivertedInBackground ? tab : testTab,
    "check selectedTab"
  );

  info(
    "Test iframe links with loadDivertedInBackground=" +
      loadDivertedInBackground +
      ", withFrame=" +
      withFrame
  );

  await waitForTestReady(loadDivertedInBackground, tab);
  await clickLink(
    withFrame,
    "#frame-link-1",
    tab.linkedBrowser,
    testTab.linkedBrowser,
    !loadDivertedInBackground,
    true
  );
  is(gBrowser.tabs.length, 3"check tabs.length");
  is(
    gBrowser.selectedTab,
    loadDivertedInBackground ? tab : testTab,
    "check selectedTab"
  );

  await waitForTestReady(loadDivertedInBackground, tab);
  await clickLink(
    withFrame,
    "#frame-link-2",
    tab.linkedBrowser,
    testTab.linkedBrowser,
    !loadDivertedInBackground,
    true
  );
  is(gBrowser.tabs.length, 3"check tabs.length");
  is(
    gBrowser.selectedTab,
    loadDivertedInBackground ? tab : testTab,
    "check selectedTab"
  );

  await waitForTestReady(loadDivertedInBackground, tab);
  await clickLink(
    withFrame,
    "#frame-link-3",
    tab.linkedBrowser,
    testTab.linkedBrowser,
    !loadDivertedInBackground,
    true
  );
  is(gBrowser.tabs.length, 3"check tabs.length");
  is(
    gBrowser.selectedTab,
    loadDivertedInBackground ? tab : testTab,
    "check selectedTab"
  );

  BrowserTestUtils.removeTab(testTab);
  BrowserTestUtils.removeTab(tab);
}

function clickLink(
  isFrame,
  linkId,
  browser,
  testBrowser,
  awaitTabSwitch = false,
  targetsFrame = false,
  locationChangeNum = 1
) {
  let promises = [];
  if (awaitTabSwitch) {
    promises.push(waitForTabSwitch(gBrowser));
  }
  if (testBrowser) {
    promises.push(
      waitForLocationChange(targetsFrame, testBrowser, locationChangeNum)
    );
  }

  info("BC children: " + browser.browsingContext.children.length);
  promises.push(
    BrowserTestUtils.synthesizeMouseAtCenter(
      linkId,
      {},
      isFrame ? browser.browsingContext.children[0] : browser
    )
  );
  return Promise.all(promises);
}

function waitForTabSwitch(tabbrowser) {
  info("Waiting for TabSwitch");
  return new Promise(resolve => {
    tabbrowser.addEventListener("TabSwitchDone"function onSwitch() {
      info("TabSwitch done");
      tabbrowser.removeEventListener("TabSwitchDone", onSwitch);
      resolve(tabbrowser.selectedTab);
    });
  });
}

let locationChangeListener;
function waitForLocationChange(isFrame, browser, locationChangeNum) {
  if (isFrame) {
    return waitForFrameLocationChange(browser, locationChangeNum);
  }

  info("Waiting for " + locationChangeNum + " LocationChange");
  return new Promise(resolve => {
    let seen = 0;
    locationChangeListener = {
      onLocationChange(aWebProgress, aRequest, aLocation, aFlags) {
        info("LocationChange: " + aLocation.spec);
        if (++seen == locationChangeNum) {
          browser.removeProgressListener(this);
          resolve();
        }
      },
      QueryInterface: ChromeUtils.generateQI([
        "nsIWebProgressListener",
        "nsISupportsWeakReference",
      ]),
    };
    browser.addProgressListener(locationChangeListener);
  });
}

function waitForFrameLocationChange(browser, locationChangeNum) {
  info("Waiting for " + locationChangeNum + " LocationChange in subframe");
  return SpecialPowers.spawn(browser, [locationChangeNum], async changeNum => {
    let seen = 0;
    let webprogress = content.docShell.QueryInterface(Ci.nsIWebProgress);
    await new Promise(resolve => {
      locationChangeListener = {
        onLocationChange(aWebProgress, aRequest, aLocation, aFlags) {
          info("LocationChange: " + aLocation.spec);
          if (++seen == changeNum) {
            resolve();
          }
        },
        QueryInterface: ChromeUtils.generateQI([
          "nsIWebProgressListener",
          "nsISupportsWeakReference",
        ]),
      };
      webprogress.addProgressListener(
        locationChangeListener,
        Ci.nsIWebProgress.NOTIFY_LOCATION
      );
    });
    webprogress.removeProgressListener(locationChangeListener);
  });
}

Messung V0.5 in Prozent
C=96 H=99 G=97

¤ Dauer der Verarbeitung: 0.27 Sekunden  (vorverarbeitet am  2026-08-27) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Statistik
#Sources=476070
#Domains=661743