| Index: third_party/WebKit/LayoutTests/editing/spelling/spellcheck_test.js
|
| diff --git a/third_party/WebKit/LayoutTests/editing/spelling/spellcheck_test.js b/third_party/WebKit/LayoutTests/editing/spelling/spellcheck_test.js
|
| index 67bb9c670145c080b9f113a3f0459ce422f7d6dd..6ce39b2419fd36677645facc4b6ab1e7610cada6 100644
|
| --- a/third_party/WebKit/LayoutTests/editing/spelling/spellcheck_test.js
|
| +++ b/third_party/WebKit/LayoutTests/editing/spelling/spellcheck_test.js
|
| @@ -275,6 +275,15 @@ class MarkerSerializer {
|
| }
|
| }
|
|
|
| +/**
|
| + * @param {!Document} document
|
| + * @return {boolean}
|
| + */
|
| +function hasPendingSpellCheckRequest(document) {
|
| + return internals.lastSpellCheckRequestSequence(document) !==
|
| + internals.lastSpellCheckProcessedSequence(document);
|
| +}
|
| +
|
| /** @type {string} */
|
| const kTitle = 'title';
|
| /** @type {string} */
|
| @@ -282,46 +291,6 @@ const kCallback = 'callback';
|
| /** @type {string} */
|
| const kIsSpellcheckTest = 'isSpellcheckTest';
|
|
|
| -/**
|
| - * @param {!Test} testObject
|
| - * @param {!Sample} sample
|
| - * @param {string} expectedText
|
| - * @param {number} remainingRetry
|
| - * @param {number} retryInterval
|
| - */
|
| -function verifyMarkers(
|
| - testObject, sample, expectedText, remainingRetry, retryInterval) {
|
| - assert_not_equals(
|
| - window.internals, undefined,
|
| - 'window.internals is required for running automated spellcheck tests.');
|
| -
|
| - /** @type {!MarkerSerializer} */
|
| - const serializer = new MarkerSerializer({
|
| - spelling: '#',
|
| - grammar: '~'});
|
| -
|
| - try {
|
| - assert_equals(serializer.serialize(sample.document), expectedText);
|
| - testObject.done();
|
| - } catch (error) {
|
| - if (remainingRetry <= 0)
|
| - throw error;
|
| -
|
| - // Force invoking idle time spellchecker in case it has not been run yet.
|
| - if (window.testRunner)
|
| - window.testRunner.runIdleTasks(() => {});
|
| -
|
| - // TODO(xiaochengh): We should make SpellCheckRequester::didCheck trigger
|
| - // something in JavaScript (e.g., a |Promise|), so that we can actively
|
| - // know the completion of spellchecking instead of passively waiting for
|
| - // markers to appear or disappear.
|
| - testObject.step_timeout(
|
| - () => verifyMarkers(testObject, sample, expectedText,
|
| - remainingRetry - 1, retryInterval),
|
| - retryInterval);
|
| - }
|
| -}
|
| -
|
| // Spellchecker gets triggered not only by text and selection change, but also
|
| // by focus change. For example, misspelling markers in <INPUT> disappear when
|
| // the window loses focus, even though the selection does not change.
|
| @@ -335,6 +304,9 @@ var spellcheckTestRunning = false;
|
| /** @type {!Array<!Object>} */
|
| const testQueue = [];
|
|
|
| +/** @type {?Function} */
|
| +let verificationForCurrentTest = null;
|
| +
|
| /**
|
| * @param {!Test} testObject
|
| * @param {!Sample|string} input
|
| @@ -359,19 +331,40 @@ function invokeSpellcheckTest(testObject, input, tester, expectedText) {
|
| assert_unreached(`Invalid tester: ${tester}`);
|
| }
|
|
|
| - /** @type {number} */
|
| - const kMaxRetry = 10;
|
| - /** @type {number} */
|
| - const kRetryInterval = 50;
|
| -
|
| - // TODO(xiaochengh): We should make SpellCheckRequester::didCheck trigger
|
| - // something in JavaScript (e.g., a |Promise|), so that we can actively know
|
| - // the completion of spellchecking instead of passively waiting for markers
|
| - // to appear or disappear.
|
| - testObject.step_timeout(
|
| - () => verifyMarkers(testObject, sample, expectedText,
|
| - kMaxRetry, kRetryInterval),
|
| - kRetryInterval);
|
| + assert_not_equals(
|
| + window.testRunner, undefined,
|
| + 'window.testRunner is required for automated spellcheck tests.');
|
| + assert_not_equals(
|
| + window.internals, undefined,
|
| + 'window.internals is required for automated spellcheck tests.');
|
| +
|
| + assert_equals(
|
| + verificationForCurrentTest, null,
|
| + 'Internal error: previous test not verified yet');
|
| +
|
| + verificationForCurrentTest = () => {
|
| + if (hasPendingSpellCheckRequest(sample.document))
|
| + return;
|
| +
|
| + testObject.step(() => {
|
| + /** @type {!MarkerSerializer} */
|
| + const serializer = new MarkerSerializer({
|
| + spelling: '#',
|
| + grammar: '~'});
|
| +
|
| + assert_equals(serializer.serialize(sample.document), expectedText);
|
| + testObject.done();
|
| + });
|
| + };
|
| +
|
| + if (internals.idleTimeSpellCheckerState !== undefined &&
|
| + internals.idleTimeSpellCheckerState(sample.document) === 'HotModeRequested') {
|
| + internals.runIdleTimeSpellChecker(sample.document);
|
| + }
|
| +
|
| + // For a test that does not create new spell check request, a synchronous
|
| + // verification finishes everything.
|
| + verificationForCurrentTest();
|
| });
|
| }
|
|
|
| @@ -379,6 +372,8 @@ add_result_callback(testObj => {
|
| if (!testObj.properties[kIsSpellcheckTest])
|
| return;
|
|
|
| + verificationForCurrentTest = null;
|
| +
|
| /** @type {boolean} */
|
| var shouldRemoveSample = false;
|
| if (testObj.status === testObj.PASS) {
|
| @@ -432,9 +427,6 @@ function getTestArguments(passedArgs) {
|
| * @param {Object=} opt_args
|
| */
|
| function spellcheckTest(input, tester, expectedText, opt_args) {
|
| - if (window.testRunner)
|
| - window.testRunner.setMockSpellCheckerEnabled(true);
|
| -
|
| /** @type {!Object} */
|
| const args = getTestArguments(opt_args);
|
| /** @type {!Test} */
|
| @@ -450,6 +442,14 @@ function spellcheckTest(input, tester, expectedText, opt_args) {
|
| invokeSpellcheckTest(testObject, input, tester, expectedText);
|
| }
|
|
|
| +if (window.testRunner) {
|
| + window.testRunner.setMockSpellCheckerEnabled(true);
|
| + window.testRunner.setSpellCheckResolvedCallback(() => {
|
| + if (verificationForCurrentTest)
|
| + verificationForCurrentTest();
|
| + });
|
| +}
|
| +
|
| // Export symbols
|
| window.spellcheck_test = spellcheckTest;
|
| })();
|
|
|