forked from mirrors/gecko-dev
		
	 42028efc71
			
		
	
	
		42028efc71
		
	
	
	
	
		
			
			This method only is async in order to allow callers to wait for a process switch triggered by the call to `loadURI` to be finished before resolving. With DocumentChannel, we should never trigger a process switch eagerly like this again, so we don't need any of the async behaviour here anymore. This part is largely mechanical changes to tests, removing the `await` calls on `loadURI`, and a follow-up part will remove the actual async logic from `BrowserTestUtils.loadURI`. Differential Revision: https://phabricator.services.mozilla.com/D94641
		
			
				
	
	
		
			415 lines
		
	
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			415 lines
		
	
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* eslint-disable mozilla/no-arbitrary-setTimeout */
 | |
| "use strict";
 | |
| 
 | |
| const kIteratorTimeout = Services.prefs.getIntPref("findbar.iteratorTimeout");
 | |
| const kPrefHighlightAll = "findbar.highlightAll";
 | |
| const kPrefModalHighlight = "findbar.modalHighlight";
 | |
| 
 | |
| add_task(async function setup() {
 | |
|   await SpecialPowers.pushPrefEnv({
 | |
|     set: [
 | |
|       [kPrefHighlightAll, true],
 | |
|       [kPrefModalHighlight, true],
 | |
|     ],
 | |
|   });
 | |
| });
 | |
| 
 | |
| // Test the results of modal highlighting, which is on by default.
 | |
| add_task(async function testModalResults() {
 | |
|   let tests = new Map([
 | |
|     [
 | |
|       "Roland",
 | |
|       {
 | |
|         rectCount: 2,
 | |
|         insertCalls: [2, 4],
 | |
|         removeCalls: [0, 1],
 | |
|         animationCalls: [1, 2],
 | |
|       },
 | |
|     ],
 | |
|     [
 | |
|       "their law might propagate their kind",
 | |
|       {
 | |
|         rectCount: 2,
 | |
|         insertCalls: [5, 6],
 | |
|         removeCalls: [4, 5],
 | |
|         // eslint-disable-next-line object-shorthand
 | |
|         extraTest: function(maskNode, outlineNode, rects) {
 | |
|           Assert.equal(
 | |
|             outlineNode.getElementsByTagName("div").length,
 | |
|             2,
 | |
|             "There should be multiple rects drawn"
 | |
|           );
 | |
|         },
 | |
|       },
 | |
|     ],
 | |
|     [
 | |
|       "ro",
 | |
|       {
 | |
|         rectCount: 41,
 | |
|         insertCalls: [1, 4],
 | |
|         removeCalls: [0, 2],
 | |
|       },
 | |
|     ],
 | |
|     [
 | |
|       "new",
 | |
|       {
 | |
|         rectCount: 2,
 | |
|         insertCalls: [1, 4],
 | |
|         removeCalls: [0, 2],
 | |
|       },
 | |
|     ],
 | |
|     [
 | |
|       "o",
 | |
|       {
 | |
|         rectCount: 492,
 | |
|         insertCalls: [1, 4],
 | |
|         removeCalls: [0, 2],
 | |
|       },
 | |
|     ],
 | |
|   ]);
 | |
|   let url = kFixtureBaseURL + "file_FinderSample.html";
 | |
|   await BrowserTestUtils.withNewTab(url, async function(browser) {
 | |
|     let findbar = await gBrowser.getFindBar();
 | |
| 
 | |
|     for (let [word, expectedResult] of tests) {
 | |
|       await promiseOpenFindbar(findbar);
 | |
|       Assert.ok(!findbar.hidden, "Findbar should be open now.");
 | |
| 
 | |
|       let timeout = kIteratorTimeout;
 | |
|       if (word.length == 1) {
 | |
|         timeout *= 4;
 | |
|       } else if (word.length == 2) {
 | |
|         timeout *= 2;
 | |
|       }
 | |
|       await new Promise(resolve => setTimeout(resolve, timeout));
 | |
|       let promise = promiseTestHighlighterOutput(
 | |
|         browser,
 | |
|         word,
 | |
|         expectedResult,
 | |
|         expectedResult.extraTest
 | |
|       );
 | |
|       await promiseEnterStringIntoFindField(findbar, word);
 | |
|       await promise;
 | |
| 
 | |
|       findbar.close(true);
 | |
|     }
 | |
|   });
 | |
| });
 | |
| 
 | |
| // Test if runtime switching of highlight modes between modal and non-modal works
 | |
| // as expected.
 | |
| add_task(async function testModalSwitching() {
 | |
|   let url = kFixtureBaseURL + "file_FinderSample.html";
 | |
|   await BrowserTestUtils.withNewTab(url, async function(browser) {
 | |
|     let findbar = await gBrowser.getFindBar();
 | |
| 
 | |
|     await promiseOpenFindbar(findbar);
 | |
|     Assert.ok(!findbar.hidden, "Findbar should be open now.");
 | |
| 
 | |
|     let word = "Roland";
 | |
|     let expectedResult = {
 | |
|       rectCount: 2,
 | |
|       insertCalls: [2, 4],
 | |
|       removeCalls: [0, 1],
 | |
|     };
 | |
|     let promise = promiseTestHighlighterOutput(browser, word, expectedResult);
 | |
|     await promiseEnterStringIntoFindField(findbar, word);
 | |
|     await promise;
 | |
| 
 | |
|     await SpecialPowers.pushPrefEnv({ set: [[kPrefModalHighlight, false]] });
 | |
| 
 | |
|     expectedResult = {
 | |
|       rectCount: 0,
 | |
|       insertCalls: [0, 0],
 | |
|       removeCalls: [0, 0],
 | |
|     };
 | |
|     promise = promiseTestHighlighterOutput(browser, word, expectedResult);
 | |
|     findbar.clear();
 | |
|     await promiseEnterStringIntoFindField(findbar, word);
 | |
|     await promise;
 | |
| 
 | |
|     findbar.close(true);
 | |
|   });
 | |
| 
 | |
|   await SpecialPowers.pushPrefEnv({ set: [[kPrefModalHighlight, true]] });
 | |
| });
 | |
| 
 | |
| // Test if highlighting a dark page is detected properly.
 | |
| add_task(async function testDarkPageDetection() {
 | |
|   let url = kFixtureBaseURL + "file_FinderSample.html";
 | |
|   await BrowserTestUtils.withNewTab(url, async function(browser) {
 | |
|     let findbar = await gBrowser.getFindBar();
 | |
| 
 | |
|     await promiseOpenFindbar(findbar);
 | |
| 
 | |
|     let word = "Roland";
 | |
|     let expectedResult = {
 | |
|       rectCount: 2,
 | |
|       insertCalls: [1, 3],
 | |
|       removeCalls: [0, 1],
 | |
|     };
 | |
|     let promise = promiseTestHighlighterOutput(
 | |
|       browser,
 | |
|       word,
 | |
|       expectedResult,
 | |
|       function(node) {
 | |
|         Assert.ok(
 | |
|           node.style.background.startsWith("rgba(0, 0, 0"),
 | |
|           "White HTML page should have a black background color set for the mask"
 | |
|         );
 | |
|       }
 | |
|     );
 | |
|     await promiseEnterStringIntoFindField(findbar, word);
 | |
|     await promise;
 | |
| 
 | |
|     findbar.close(true);
 | |
|   });
 | |
| 
 | |
|   await BrowserTestUtils.withNewTab(url, async function(browser) {
 | |
|     let findbar = await gBrowser.getFindBar();
 | |
| 
 | |
|     await promiseOpenFindbar(findbar);
 | |
| 
 | |
|     let word = "Roland";
 | |
|     let expectedResult = {
 | |
|       rectCount: 2,
 | |
|       insertCalls: [2, 4],
 | |
|       removeCalls: [0, 1],
 | |
|     };
 | |
| 
 | |
|     await SpecialPowers.spawn(browser, [], async function() {
 | |
|       let dwu = content.windowUtils;
 | |
|       let uri =
 | |
|         "data:text/css;charset=utf-8," +
 | |
|         encodeURIComponent(`
 | |
|         body {
 | |
|           background: maroon radial-gradient(circle, #a01010 0%, #800000 80%) center center / cover no-repeat;
 | |
|           color: white;
 | |
|         }`);
 | |
|       try {
 | |
|         dwu.loadSheetUsingURIString(uri, dwu.USER_SHEET);
 | |
|       } catch (e) {}
 | |
|     });
 | |
| 
 | |
|     let promise = promiseTestHighlighterOutput(
 | |
|       browser,
 | |
|       word,
 | |
|       expectedResult,
 | |
|       node => {
 | |
|         Assert.ok(
 | |
|           node.style.background.startsWith("rgba(255, 255, 255"),
 | |
|           "Dark HTML page should have a white background color set for the mask"
 | |
|         );
 | |
|       }
 | |
|     );
 | |
|     await promiseEnterStringIntoFindField(findbar, word);
 | |
|     await promise;
 | |
| 
 | |
|     findbar.close(true);
 | |
|   });
 | |
| });
 | |
| 
 | |
| add_task(async function testHighlightAllToggle() {
 | |
|   let url = kFixtureBaseURL + "file_FinderSample.html";
 | |
|   await BrowserTestUtils.withNewTab(url, async function(browser) {
 | |
|     let findbar = await gBrowser.getFindBar();
 | |
| 
 | |
|     await promiseOpenFindbar(findbar);
 | |
| 
 | |
|     let word = "Roland";
 | |
|     let expectedResult = {
 | |
|       rectCount: 2,
 | |
|       insertCalls: [2, 4],
 | |
|       removeCalls: [0, 1],
 | |
|     };
 | |
|     let promise = promiseTestHighlighterOutput(browser, word, expectedResult);
 | |
|     await promiseEnterStringIntoFindField(findbar, word);
 | |
|     await promise;
 | |
| 
 | |
|     // We now know we have multiple rectangles highlighted, so it's a good time
 | |
|     // to flip the pref.
 | |
|     expectedResult = {
 | |
|       rectCount: 0,
 | |
|       insertCalls: [0, 1],
 | |
|       removeCalls: [1, 2],
 | |
|     };
 | |
|     promise = promiseTestHighlighterOutput(browser, word, expectedResult);
 | |
|     await SpecialPowers.pushPrefEnv({ set: [[kPrefHighlightAll, false]] });
 | |
|     await promise;
 | |
| 
 | |
|     // For posterity, let's switch back.
 | |
|     expectedResult = {
 | |
|       rectCount: 2,
 | |
|       insertCalls: [1, 3],
 | |
|       removeCalls: [0, 1],
 | |
|     };
 | |
|     promise = promiseTestHighlighterOutput(browser, word, expectedResult);
 | |
|     await SpecialPowers.pushPrefEnv({ set: [[kPrefHighlightAll, true]] });
 | |
|     await promise;
 | |
|   });
 | |
| });
 | |
| 
 | |
| add_task(async function testXMLDocument() {
 | |
|   let url =
 | |
|     "data:text/xml;charset=utf-8," +
 | |
|     encodeURIComponent(`<?xml version="1.0"?>
 | |
| <result>
 | |
|   <Title>Example</Title>
 | |
|   <Error>Error</Error>
 | |
| </result>`);
 | |
|   await BrowserTestUtils.withNewTab(url, async function(browser) {
 | |
|     let findbar = await gBrowser.getFindBar();
 | |
| 
 | |
|     await promiseOpenFindbar(findbar);
 | |
| 
 | |
|     let word = "Example";
 | |
|     let expectedResult = {
 | |
|       rectCount: 0,
 | |
|       insertCalls: [1, 4],
 | |
|       removeCalls: [0, 1],
 | |
|     };
 | |
|     let promise = promiseTestHighlighterOutput(browser, word, expectedResult);
 | |
|     await promiseEnterStringIntoFindField(findbar, word);
 | |
|     await promise;
 | |
| 
 | |
|     findbar.close(true);
 | |
|   });
 | |
| });
 | |
| 
 | |
| add_task(async function testHideOnLocationChange() {
 | |
|   let url = kFixtureBaseURL + "file_FinderSample.html";
 | |
|   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, url);
 | |
|   let browser = tab.linkedBrowser;
 | |
|   let findbar = await gBrowser.getFindBar();
 | |
| 
 | |
|   await promiseOpenFindbar(findbar);
 | |
| 
 | |
|   let word = "Roland";
 | |
|   let expectedResult = {
 | |
|     rectCount: 2,
 | |
|     insertCalls: [2, 4],
 | |
|     removeCalls: [0, 1],
 | |
|   };
 | |
|   let promise = promiseTestHighlighterOutput(browser, word, expectedResult);
 | |
|   await promiseEnterStringIntoFindField(findbar, word);
 | |
|   await promise;
 | |
| 
 | |
|   // Now we try to navigate away! (Using the same page)
 | |
|   promise = promiseTestHighlighterOutput(browser, word, {
 | |
|     rectCount: 0,
 | |
|     insertCalls: [0, 0],
 | |
|     removeCalls: [1, 2],
 | |
|   });
 | |
|   BrowserTestUtils.loadURI(browser, url);
 | |
|   await promise;
 | |
| 
 | |
|   BrowserTestUtils.removeTab(tab);
 | |
| });
 | |
| 
 | |
| add_task(async function testHideOnClear() {
 | |
|   let url = kFixtureBaseURL + "file_FinderSample.html";
 | |
|   await BrowserTestUtils.withNewTab(url, async function(browser) {
 | |
|     let findbar = await gBrowser.getFindBar();
 | |
|     await promiseOpenFindbar(findbar);
 | |
| 
 | |
|     let word = "Roland";
 | |
|     let expectedResult = {
 | |
|       rectCount: 2,
 | |
|       insertCalls: [2, 4],
 | |
|       removeCalls: [0, 2],
 | |
|     };
 | |
|     let promise = promiseTestHighlighterOutput(browser, word, expectedResult);
 | |
|     await promiseEnterStringIntoFindField(findbar, word);
 | |
|     await promise;
 | |
| 
 | |
|     await new Promise(resolve => setTimeout(resolve, kIteratorTimeout));
 | |
|     promise = promiseTestHighlighterOutput(browser, "", {
 | |
|       rectCount: 0,
 | |
|       insertCalls: [0, 0],
 | |
|       removeCalls: [1, 2],
 | |
|     });
 | |
|     findbar.clear();
 | |
|     await promise;
 | |
| 
 | |
|     findbar.close(true);
 | |
|   });
 | |
| });
 | |
| 
 | |
| add_task(async function testRectsAndTexts() {
 | |
|   let url =
 | |
|     "data:text/html;charset=utf-8," +
 | |
|     encodeURIComponent(
 | |
|       '<div style="width: 150px; border: 1px solid black">' +
 | |
|         "Here are a lot of words Please use find to highlight some words that wrap" +
 | |
|         " across a line boundary and see what happens.</div>"
 | |
|     );
 | |
|   await BrowserTestUtils.withNewTab(url, async function(browser) {
 | |
|     let findbar = await gBrowser.getFindBar();
 | |
|     await promiseOpenFindbar(findbar);
 | |
| 
 | |
|     let word = "words please use find to";
 | |
|     let expectedResult = {
 | |
|       rectCount: 2,
 | |
|       insertCalls: [2, 4],
 | |
|       removeCalls: [0, 2],
 | |
|     };
 | |
|     let promise = promiseTestHighlighterOutput(
 | |
|       browser,
 | |
|       word,
 | |
|       expectedResult,
 | |
|       (maskNode, outlineNode) => {
 | |
|         let boxes = outlineNode.getElementsByTagName("span");
 | |
|         Assert.equal(
 | |
|           boxes.length,
 | |
|           2,
 | |
|           "There should be two outline boxes containing text"
 | |
|         );
 | |
|         Assert.equal(
 | |
|           boxes[0].textContent.trim(),
 | |
|           "words",
 | |
|           "First text should match"
 | |
|         );
 | |
|         Assert.equal(
 | |
|           boxes[1].textContent.trim(),
 | |
|           "Please use find to",
 | |
|           "Second word should match"
 | |
|         );
 | |
|       }
 | |
|     );
 | |
|     await promiseEnterStringIntoFindField(findbar, word);
 | |
|     await promise;
 | |
|   });
 | |
| });
 | |
| 
 | |
| add_task(async function testTooLargeToggle() {
 | |
|   let url = kFixtureBaseURL + "file_FinderSample.html";
 | |
|   await BrowserTestUtils.withNewTab(url, async function(browser) {
 | |
|     let findbar = await gBrowser.getFindBar();
 | |
|     await promiseOpenFindbar(findbar);
 | |
| 
 | |
|     await SpecialPowers.spawn(browser, [], async function() {
 | |
|       let dwu = content.windowUtils;
 | |
|       let uri =
 | |
|         "data:text/css;charset=utf-8," +
 | |
|         encodeURIComponent(`
 | |
|         body {
 | |
|           min-height: 1234567px;
 | |
|         }`);
 | |
|       try {
 | |
|         dwu.loadSheetUsingURIString(uri, dwu.USER_SHEET);
 | |
|       } catch (e) {}
 | |
|     });
 | |
| 
 | |
|     let word = "Roland";
 | |
|     let expectedResult = {
 | |
|       rectCount: 2,
 | |
|       insertCalls: [2, 4],
 | |
|       removeCalls: [0, 2],
 | |
|       // No animations should be triggered when the page is too large.
 | |
|       animationCalls: [0, 0],
 | |
|     };
 | |
|     let promise = promiseTestHighlighterOutput(browser, word, expectedResult);
 | |
|     await promiseEnterStringIntoFindField(findbar, word);
 | |
|     await promise;
 | |
|   });
 | |
| });
 |