forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			220 lines
		
	
	
	
		
			6.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			220 lines
		
	
	
	
		
			6.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* eslint-disable mozilla/no-arbitrary-setTimeout */
 | 
						|
 | 
						|
add_task(async function clickWithPrefSet() {
 | 
						|
  let detectUnexpected = true;
 | 
						|
  window.addEventListener("TabMultiSelect", () => {
 | 
						|
    if (detectUnexpected) {
 | 
						|
      ok(false, "Shouldn't get unexpected event");
 | 
						|
    }
 | 
						|
  });
 | 
						|
  async function expectEvent(callback, expectedTabs) {
 | 
						|
    let event = new Promise(resolve => {
 | 
						|
      detectUnexpected = false;
 | 
						|
      window.addEventListener(
 | 
						|
        "TabMultiSelect",
 | 
						|
        () => {
 | 
						|
          detectUnexpected = true;
 | 
						|
          resolve();
 | 
						|
        },
 | 
						|
        { once: true }
 | 
						|
      );
 | 
						|
    });
 | 
						|
    await callback();
 | 
						|
    await event;
 | 
						|
    ok(true, "Got TabMultiSelect event");
 | 
						|
    expectSelected(expectedTabs);
 | 
						|
    // Await some time to ensure no additional event is triggered
 | 
						|
    await new Promise(resolve => setTimeout(resolve, 100));
 | 
						|
  }
 | 
						|
  async function expectNoEvent(callback, expectedTabs) {
 | 
						|
    await callback();
 | 
						|
    expectSelected(expectedTabs);
 | 
						|
    // Await some time to ensure no event is triggered
 | 
						|
    await new Promise(resolve => setTimeout(resolve, 100));
 | 
						|
  }
 | 
						|
  function expectSelected(expected) {
 | 
						|
    let { selectedTabs } = gBrowser;
 | 
						|
    is(selectedTabs.length, expected.length, "Check number of selected tabs");
 | 
						|
    for (
 | 
						|
      let i = 0, n = Math.min(expected.length, selectedTabs.length);
 | 
						|
      i < n;
 | 
						|
      ++i
 | 
						|
    ) {
 | 
						|
      is(selectedTabs[i], expected[i], `Check the selected tab #${i + 1}`);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  let initialTab = gBrowser.selectedTab;
 | 
						|
  let tab1, tab2, tab3;
 | 
						|
 | 
						|
  info("Expect no event when opening tabs");
 | 
						|
  await expectNoEvent(async () => {
 | 
						|
    tab1 = await addTab();
 | 
						|
    tab2 = await addTab();
 | 
						|
    tab3 = await addTab();
 | 
						|
  }, [initialTab]);
 | 
						|
 | 
						|
  info("Switching tab should trigger event");
 | 
						|
  await expectEvent(async () => {
 | 
						|
    await BrowserTestUtils.switchTab(gBrowser, tab1);
 | 
						|
  }, [tab1]);
 | 
						|
 | 
						|
  info("Multiselecting tab with Ctrl+click should trigger event");
 | 
						|
  await expectEvent(async () => {
 | 
						|
    await triggerClickOn(tab2, { ctrlKey: true });
 | 
						|
  }, [tab1, tab2]);
 | 
						|
 | 
						|
  info("Unselecting tab with Ctrl+click should trigger event");
 | 
						|
  await expectEvent(async () => {
 | 
						|
    await triggerClickOn(tab2, { ctrlKey: true });
 | 
						|
  }, [tab1]);
 | 
						|
 | 
						|
  info("Multiselecting tabs with Shift+click should trigger event");
 | 
						|
  await expectEvent(async () => {
 | 
						|
    await triggerClickOn(tab3, { shiftKey: true });
 | 
						|
  }, [tab1, tab2, tab3]);
 | 
						|
 | 
						|
  info("Expect no event if multiselection doesn't change with Shift+click");
 | 
						|
  await expectNoEvent(async () => {
 | 
						|
    await triggerClickOn(tab3, { shiftKey: true });
 | 
						|
  }, [tab1, tab2, tab3]);
 | 
						|
 | 
						|
  info(
 | 
						|
    "Expect no event if multiselection doesn't change with Ctrl+Shift+click"
 | 
						|
  );
 | 
						|
  await expectNoEvent(async () => {
 | 
						|
    await triggerClickOn(tab2, { ctrlKey: true, shiftKey: true });
 | 
						|
  }, [tab1, tab2, tab3]);
 | 
						|
 | 
						|
  info(
 | 
						|
    "Expect no event if selected tab doesn't change with gBrowser.selectedTab"
 | 
						|
  );
 | 
						|
  await expectNoEvent(async () => {
 | 
						|
    gBrowser.selectedTab = tab1;
 | 
						|
  }, [tab1, tab2, tab3]);
 | 
						|
 | 
						|
  info(
 | 
						|
    "Clearing multiselection by switching tab with gBrowser.selectedTab should trigger event"
 | 
						|
  );
 | 
						|
  await expectEvent(async () => {
 | 
						|
    await BrowserTestUtils.switchTab(gBrowser, () => {
 | 
						|
      gBrowser.selectedTab = tab3;
 | 
						|
    });
 | 
						|
  }, [tab3]);
 | 
						|
 | 
						|
  info(
 | 
						|
    "Click on the active and the only mutliselected tab should not trigger event"
 | 
						|
  );
 | 
						|
  await expectNoEvent(async () => {
 | 
						|
    await triggerClickOn(tab3, {});
 | 
						|
  }, [tab3]);
 | 
						|
 | 
						|
  info(
 | 
						|
    "Expect no event if selected tab doesn't change with gBrowser.selectedTabs"
 | 
						|
  );
 | 
						|
  gBrowser.selectedTabs = [tab3];
 | 
						|
  expectSelected([tab3]);
 | 
						|
 | 
						|
  info("Multiselecting tabs with gBrowser.selectedTabs should trigger event");
 | 
						|
  await expectEvent(async () => {
 | 
						|
    gBrowser.selectedTabs = [tab3, tab2, tab1];
 | 
						|
  }, [tab1, tab2, tab3]);
 | 
						|
 | 
						|
  info(
 | 
						|
    "Expect no event if multiselection doesn't change with gBrowser.selectedTabs"
 | 
						|
  );
 | 
						|
  await expectNoEvent(async () => {
 | 
						|
    gBrowser.selectedTabs = [tab3, tab1, tab2];
 | 
						|
  }, [tab1, tab2, tab3]);
 | 
						|
 | 
						|
  info("Switching tab with gBrowser.selectedTabs should trigger event");
 | 
						|
  await expectEvent(async () => {
 | 
						|
    gBrowser.selectedTabs = [tab1, tab2, tab3];
 | 
						|
  }, [tab1, tab2, tab3]);
 | 
						|
 | 
						|
  info(
 | 
						|
    "Unmultiselection tab with removeFromMultiSelectedTabs should trigger event"
 | 
						|
  );
 | 
						|
  await expectEvent(async () => {
 | 
						|
    gBrowser.removeFromMultiSelectedTabs(tab3);
 | 
						|
  }, [tab1, tab2]);
 | 
						|
 | 
						|
  info("Expect no event if the tab is not multiselected");
 | 
						|
  await expectNoEvent(async () => {
 | 
						|
    gBrowser.removeFromMultiSelectedTabs(tab3);
 | 
						|
  }, [tab1, tab2]);
 | 
						|
 | 
						|
  info(
 | 
						|
    "Clearing multiselection with clearMultiSelectedTabs should trigger event"
 | 
						|
  );
 | 
						|
  await expectEvent(async () => {
 | 
						|
    gBrowser.clearMultiSelectedTabs();
 | 
						|
  }, [tab1]);
 | 
						|
 | 
						|
  info("Expect no event if there is no multiselection to clear");
 | 
						|
  await expectNoEvent(async () => {
 | 
						|
    gBrowser.clearMultiSelectedTabs();
 | 
						|
  }, [tab1]);
 | 
						|
 | 
						|
  info(
 | 
						|
    "Expect no event if clearMultiSelectedTabs counteracts addToMultiSelectedTabs"
 | 
						|
  );
 | 
						|
  await expectNoEvent(async () => {
 | 
						|
    gBrowser.addToMultiSelectedTabs(tab3);
 | 
						|
    gBrowser.clearMultiSelectedTabs();
 | 
						|
  }, [tab1]);
 | 
						|
 | 
						|
  info(
 | 
						|
    "Multiselecting tab with gBrowser.addToMultiSelectedTabs should trigger event"
 | 
						|
  );
 | 
						|
  await expectEvent(async () => {
 | 
						|
    gBrowser.addToMultiSelectedTabs(tab2);
 | 
						|
  }, [tab1, tab2]);
 | 
						|
 | 
						|
  info(
 | 
						|
    "Expect no event if addToMultiSelectedTabs counteracts clearMultiSelectedTabs"
 | 
						|
  );
 | 
						|
  await expectNoEvent(async () => {
 | 
						|
    gBrowser.clearMultiSelectedTabs();
 | 
						|
    gBrowser.addToMultiSelectedTabs(tab1);
 | 
						|
    gBrowser.addToMultiSelectedTabs(tab2);
 | 
						|
  }, [tab1, tab2]);
 | 
						|
 | 
						|
  info(
 | 
						|
    "Expect no event if removeFromMultiSelectedTabs counteracts addToMultiSelectedTabs"
 | 
						|
  );
 | 
						|
  await expectNoEvent(async () => {
 | 
						|
    gBrowser.addToMultiSelectedTabs(tab3);
 | 
						|
    gBrowser.removeFromMultiSelectedTabs(tab3);
 | 
						|
  }, [tab1, tab2]);
 | 
						|
 | 
						|
  info(
 | 
						|
    "Expect no event if addToMultiSelectedTabs counteracts removeFromMultiSelectedTabs"
 | 
						|
  );
 | 
						|
  await expectNoEvent(async () => {
 | 
						|
    gBrowser.removeFromMultiSelectedTabs(tab2);
 | 
						|
    gBrowser.addToMultiSelectedTabs(tab2);
 | 
						|
  }, [tab1, tab2]);
 | 
						|
 | 
						|
  info("Multiselection with addRangeToMultiSelectedTabs should trigger event");
 | 
						|
  await expectEvent(async () => {
 | 
						|
    gBrowser.addRangeToMultiSelectedTabs(tab1, tab3);
 | 
						|
  }, [tab1, tab2, tab3]);
 | 
						|
 | 
						|
  info("Switching to a just multiselected tab should multiselect the old one");
 | 
						|
  await expectEvent(async () => {
 | 
						|
    gBrowser.clearMultiSelectedTabs();
 | 
						|
  }, [tab1]);
 | 
						|
  await expectEvent(async () => {
 | 
						|
    is(tab1.multiselected, false, "tab1 is not multiselected");
 | 
						|
    gBrowser.addToMultiSelectedTabs(tab2);
 | 
						|
    gBrowser.lockClearMultiSelectionOnce();
 | 
						|
    gBrowser.selectedTab = tab2;
 | 
						|
  }, [tab1, tab2]);
 | 
						|
  is(tab1.multiselected, true, "tab1 becomes multiselected");
 | 
						|
 | 
						|
  detectUnexpected = false;
 | 
						|
  BrowserTestUtils.removeTab(tab1);
 | 
						|
  BrowserTestUtils.removeTab(tab2);
 | 
						|
  BrowserTestUtils.removeTab(tab3);
 | 
						|
});
 |