From 2967c3f00731ddc0c73a873c154425cfa8f468be Mon Sep 17 00:00:00 2001 From: Dan Bjorge Date: Fri, 16 Dec 2022 19:20:45 -0500 Subject: [PATCH] chore(null): strict null checks for injected drawing-controller (#6272) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### Details This PR adds the injected DrawingController + a few related/dependent files to the strict null check list. The most interesting of the changes was updating the `DrawerInitData` type to not be generic. Previously, it was genericized over the data type an individual drawer expected (in particular, svg-drawer expects to only be used with something special). But the generic type usage meant that in practice, the individual drawers were written looking like they could safely assume what type of input they were given with the relevant `any` conversions happening in the drawer controller/initiator, which wasn't really accurate - if a type assumption was wrong, it'd be the individual drawer that would have to be aware of the mistake. This change moves the type assertions in question to the drawer. Overall, these changes enabled autoadding several more assessment folders and brought us from 78% to 80% null checked: ``` ❯ yarn null:progress yarn run v1.22.19 $ node ./tools/strict-null-checks/progress.js ## Web strict-null progress **80%** complete (**1244**/1562 non-test files) *Contribute at [#2869](https://github.com/microsoft/accessibility-insights-web/issues/2869). Last update: Fri Dec 16 2022* ``` ##### Motivation #2869 ##### Context n/a #### Pull request checklist - [x] Addresses an existing issue: #2869 - [x] Ran `yarn null:autoadd` - [x] Ran `yarn fastpass` - [x] Added/updated relevant unit test(s) (and ran `yarn test`) - [x] Verified code coverage for the changes made. Check coverage report at: `/test-results/unit/coverage` - [x] PR title *AND* final merge commit title both start with a semantic tag (`fix:`, `chore:`, `feat(feature-name):`, `refactor:`). See `CONTRIBUTING.md`. - [n/a] (UI changes only) Added screenshots/GIFs to description above - [n/a] (UI changes only) Verified usability with NVDA/JAWS --- .../components/base-visual-helper-toggle.tsx | 2 +- src/injected/drawing-controller.ts | 20 +++---- src/injected/drawing-initiator.ts | 1 + src/injected/visualization/base-drawer.ts | 2 +- src/injected/visualization/drawer.ts | 7 +-- .../visualization/highlight-box-drawer.ts | 4 +- src/injected/visualization/null-drawer.ts | 2 +- .../visualization/single-target-drawer.ts | 4 +- src/injected/visualization/svg-drawer.ts | 14 +++-- src/injected/window-initializer.ts | 10 +++- .../tests/injected/drawing-controller.test.ts | 10 ++-- .../tests/injected/drawing-initiator.test.ts | 1 + .../injected/visualization/drawer.test.ts | 10 ++-- .../single-target-drawer.test.ts | 26 ++++----- .../injected/visualization/svg-drawer.test.ts | 11 ++-- tsconfig.strictNullChecks.json | 54 ++++++++----------- 16 files changed, 91 insertions(+), 87 deletions(-) diff --git a/src/DetailsView/components/base-visual-helper-toggle.tsx b/src/DetailsView/components/base-visual-helper-toggle.tsx index db0580e2fb2..150ae3a4db5 100644 --- a/src/DetailsView/components/base-visual-helper-toggle.tsx +++ b/src/DetailsView/components/base-visual-helper-toggle.tsx @@ -64,7 +64,7 @@ export abstract class BaseVisualHelperToggle extends React.Component diff --git a/src/injected/drawing-controller.ts b/src/injected/drawing-controller.ts index 6cb22fb3dae..69087e7f97c 100644 --- a/src/injected/drawing-controller.ts +++ b/src/injected/drawing-controller.ts @@ -19,8 +19,8 @@ export interface VisualizationWindowMessage { visualizationType?: VisualizationType; isEnabled: boolean; configId: string; - elementResults?: AssessmentVisualizationInstance[]; - featureFlagStoreData?: FeatureFlagStoreData; + elementResults: AssessmentVisualizationInstance[] | null; + featureFlagStoreData: FeatureFlagStoreData; } export class DrawingController { @@ -69,7 +69,7 @@ export class DrawingController { }; private async enableVisualization( - elementResults: AssessmentVisualizationInstance[] | undefined, + elementResults: AssessmentVisualizationInstance[] | null, configId: string, ): Promise { if (elementResults) { @@ -96,7 +96,7 @@ export class DrawingController { const childFrameResults = elementResultsByFrame.filter(results => results.frame != null); await this.allFramesMessenger.sendCommandToMultipleFrames( DrawingController.triggerVisualizationCommand, - childFrameResults.map(results => results.frame), + childFrameResults.map(results => results.frame!), (_frame, index) => this.createEnableVisualizationPayload( configId, @@ -110,12 +110,12 @@ export class DrawingController { await this.allFramesMessenger.sendCommandToAllFrames( DrawingController.triggerVisualizationCommand, - this.createEnableVisualizationPayload(configId), + this.createEnableVisualizationPayload(configId, null), ); } private enableVisualizationInCurrentFrame = async ( - currentFrameResults: AssessmentVisualizationInstance[], + currentFrameResults: AssessmentVisualizationInstance[] | null, configId: string, ): Promise => { const drawer = this.getDrawer(configId); @@ -128,10 +128,10 @@ export class DrawingController { private createEnableVisualizationPayload( configId: string, - frameResults?: AssessmentVisualizationInstance[], + frameResults: AssessmentVisualizationInstance[] | null, ): VisualizationWindowMessage { return { - elementResults: frameResults ?? null, + elementResults: frameResults, isEnabled: true, featureFlagStoreData: this.featureFlagStoreData, configId: configId, @@ -164,8 +164,8 @@ export class DrawingController { } private getInitialElements( - currentFrameResults: AssessmentVisualizationInstance[], - ): AssessmentVisualizationInstance[] { + currentFrameResults: AssessmentVisualizationInstance[] | null, + ): AssessmentVisualizationInstance[] | null { if (currentFrameResults == null) { return null; } diff --git a/src/injected/drawing-initiator.ts b/src/injected/drawing-initiator.ts index 53ca1c06d8e..7a9d9bc9565 100644 --- a/src/injected/drawing-initiator.ts +++ b/src/injected/drawing-initiator.ts @@ -76,6 +76,7 @@ export class DrawingInitiator { isEnabled: false, featureFlagStoreData: featureFlagStoreData, configId: configId, + elementResults: null, }; await this.drawingController.processRequest(visualizationMessage); diff --git a/src/injected/visualization/base-drawer.ts b/src/injected/visualization/base-drawer.ts index da6cfcc19e0..69001233c9c 100644 --- a/src/injected/visualization/base-drawer.ts +++ b/src/injected/visualization/base-drawer.ts @@ -39,7 +39,7 @@ export abstract class BaseDrawer implements Drawer { this.drawerUtils = drawerUtils; } - public abstract initialize(config: DrawerInitData): void; + public abstract initialize(config: DrawerInitData): void; public drawLayout = async (): Promise => { this.addListeners(); diff --git a/src/injected/visualization/drawer.ts b/src/injected/visualization/drawer.ts index e398f1a234f..9e825e5ee16 100644 --- a/src/injected/visualization/drawer.ts +++ b/src/injected/visualization/drawer.ts @@ -1,15 +1,16 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +import { AssessmentVisualizationInstance } from 'injected/frameCommunicators/html-element-axe-results-helper'; import { FeatureFlagStoreData } from '../../common/types/store-data/feature-flag-store-data'; export interface Drawer { - initialize(config: DrawerInitData): void; + initialize(config: DrawerInitData): void; isOverlayEnabled: boolean; drawLayout(): Promise; eraseLayout(): void; } -export interface DrawerInitData { - data: T[]; +export interface DrawerInitData { + data: AssessmentVisualizationInstance[] | null; featureFlagStoreData: FeatureFlagStoreData; } diff --git a/src/injected/visualization/highlight-box-drawer.ts b/src/injected/visualization/highlight-box-drawer.ts index 4ebee18aaa7..8b7e1f629b3 100644 --- a/src/injected/visualization/highlight-box-drawer.ts +++ b/src/injected/visualization/highlight-box-drawer.ts @@ -36,8 +36,8 @@ export class HighlightBoxDrawer extends BaseDrawer { this.dialogRenderer = this.formatter?.getDialogRenderer(); } - public initialize(config: DrawerInitData): void { - this.elementResults = config.data; + public initialize(config: DrawerInitData): void { + this.elementResults = config.data ?? []; this.eraseLayout(); } diff --git a/src/injected/visualization/null-drawer.ts b/src/injected/visualization/null-drawer.ts index d9370aba074..1040ff011c1 100644 --- a/src/injected/visualization/null-drawer.ts +++ b/src/injected/visualization/null-drawer.ts @@ -3,7 +3,7 @@ import { Drawer, DrawerInitData } from './drawer'; export class NullDrawer implements Drawer { - public initialize(drawerData: DrawerInitData): void {} + public initialize(drawerData: DrawerInitData): void {} public isOverlayEnabled: boolean = false; public drawLayout = async (): Promise => {}; public eraseLayout(): void {} diff --git a/src/injected/visualization/single-target-drawer.ts b/src/injected/visualization/single-target-drawer.ts index 213b03bb415..1f4c1ce9a54 100644 --- a/src/injected/visualization/single-target-drawer.ts +++ b/src/injected/visualization/single-target-drawer.ts @@ -17,9 +17,9 @@ export class SingleTargetDrawer implements Drawer { this.formatter = formatter; } - public initialize(drawerInfo: DrawerInitData): void { + public initialize(drawerInfo: DrawerInitData): void { this.eraseLayout(); - const elementResults = drawerInfo.data; + const elementResults = drawerInfo.data ?? []; const myDocument = this.drawerUtils.getDocumentElement(); this.target = this.getFirstElementTarget(myDocument, elementResults); } diff --git a/src/injected/visualization/svg-drawer.ts b/src/injected/visualization/svg-drawer.ts index bdb76609350..d2cacff17ef 100644 --- a/src/injected/visualization/svg-drawer.ts +++ b/src/injected/visualization/svg-drawer.ts @@ -42,20 +42,18 @@ export class SVGDrawer extends BaseDrawer { this.failureItems = []; } - public initialize( - drawerInfo: DrawerInitData, - ): void { - const visualizationInstances: TabStopVisualizationInstance[] = drawerInfo.data.map( - (element: TabStopVisualizationInstance) => { + public initialize(drawerInfo: DrawerInitData): void { + const originalVisualizationInstances = drawerInfo.data ?? []; + const annotatedVisualizationInstances: TabStopVisualizationInstance[] = + originalVisualizationInstances.map((element: TabStopVisualizationInstance) => { return { propertyBag: { tabOrder: this.getTabOrder(element), }, ...element, }; - }, - ); - this.updateTabbedElements(visualizationInstances); + }); + this.updateTabbedElements(annotatedVisualizationInstances); this.tabOrderedItems = this.allVisualizedItems.filter(item => item.tabOrder != null); this.failureItems = this.allVisualizedItems.filter(item => item.isFailure); } diff --git a/src/injected/window-initializer.ts b/src/injected/window-initializer.ts index b73081ee117..e405a0ed515 100644 --- a/src/injected/window-initializer.ts +++ b/src/injected/window-initializer.ts @@ -92,13 +92,21 @@ export class WindowInitializer { const htmlElementUtils = new HTMLElementUtils(); this.clientUtils = new ClientUtils(window); + const extensionId = browserAdapter.getExtensionId(); + if (extensionId == null) { + logger.error( + 'Aborting Accessibility Insights initialization - extension instance is unloaded', + ); + return; + } + this.actionMessageDispatcher = new RemoteActionMessageDispatcher( this.browserAdapter.sendMessageToFrames, null, logger, ); - const telemetrySanitizer = new ExceptionTelemetrySanitizer(browserAdapter.getExtensionId()); + const telemetrySanitizer = new ExceptionTelemetrySanitizer(extensionId); const exceptionTelemetryListener = new ExceptionTelemetryListener( TelemetryEventSource.TargetPage, this.actionMessageDispatcher.sendTelemetry, diff --git a/src/tests/unit/tests/injected/drawing-controller.test.ts b/src/tests/unit/tests/injected/drawing-controller.test.ts index 87b40bf39a4..3e08b14e7a0 100644 --- a/src/tests/unit/tests/injected/drawing-controller.test.ts +++ b/src/tests/unit/tests/injected/drawing-controller.test.ts @@ -1,6 +1,5 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -import { HtmlElementAxeResults } from 'common/types/store-data/visualization-scan-result-data'; import { AllFramesMessenger } from 'injected/frameCommunicators/all-frames-messenger'; import { CommandMessage, @@ -23,12 +22,13 @@ import { HighlightBoxDrawer } from '../../../../injected/visualization/highlight class VisualizationWindowMessageStubBuilder { private isEnabled: boolean; private configId: string; - private elementResults?: AssessmentVisualizationInstance[]; + private elementResults: AssessmentVisualizationInstance[] | null; private featureFlagStoreData?: FeatureFlagStoreData; public constructor(configId: string) { this.configId = configId; this.featureFlagStoreData = getDefaultFeatureFlagsWeb(); + this.elementResults = null; } public setVisualizationEnabled(): VisualizationWindowMessageStubBuilder { @@ -42,7 +42,7 @@ class VisualizationWindowMessageStubBuilder { } public setElementResults( - results: AssessmentVisualizationInstance[], + results: AssessmentVisualizationInstance[] | null, ): VisualizationWindowMessageStubBuilder { this.elementResults = results; return this; @@ -158,7 +158,7 @@ describe('DrawingControllerTest', () => { const iframeResults = ['iframeContent']; const iframeElement = 'iframeElement'; const targetFrame = iframeElement as any; - const visibleResultStub = {} as HtmlElementAxeResults; + const visibleResultStub = {} as AssessmentVisualizationInstance; const disabledResultStub = { isVisualizationEnabled: false, } as AssessmentVisualizationInstance; @@ -207,7 +207,7 @@ describe('DrawingControllerTest', () => { }) .verifiable(Times.once()); - const expected: DrawerInitData = { + const expected: DrawerInitData = { data: [visibleResultStub], featureFlagStoreData, }; diff --git a/src/tests/unit/tests/injected/drawing-initiator.test.ts b/src/tests/unit/tests/injected/drawing-initiator.test.ts index dd7ad3f03d9..d3e07f1bdee 100644 --- a/src/tests/unit/tests/injected/drawing-initiator.test.ts +++ b/src/tests/unit/tests/injected/drawing-initiator.test.ts @@ -51,6 +51,7 @@ describe('DrawingInitiatorTest', () => { isEnabled: false, featureFlagStoreData: getDefaultFeatureFlagsWeb(), configId: configId, + elementResults: null, }; drawingControllerMock diff --git a/src/tests/unit/tests/injected/visualization/drawer.test.ts b/src/tests/unit/tests/injected/visualization/drawer.test.ts index 96261b34cc0..1ed95308449 100644 --- a/src/tests/unit/tests/injected/visualization/drawer.test.ts +++ b/src/tests/unit/tests/injected/visualization/drawer.test.ts @@ -1,11 +1,11 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. import { getDefaultFeatureFlagsWeb } from 'common/feature-flags'; -import { HtmlElementAxeResults } from 'common/types/store-data/visualization-scan-result-data'; import { WindowUtils } from 'common/window-utils'; import { BoundingRect } from 'injected/bounding-rect'; import { ClientUtils } from 'injected/client-utils'; import { DialogRenderer } from 'injected/dialog-renderer'; +import { AssessmentVisualizationInstance } from 'injected/frameCommunicators/html-element-axe-results-helper'; import { ShadowUtils } from 'injected/shadow-utils'; import { DrawerInitData } from 'injected/visualization/drawer'; import { DrawerUtils } from 'injected/visualization/drawer-utils'; @@ -1195,20 +1195,22 @@ describe('Drawer', () => { verifyOverlayStyle(overlays[2], element4Config); }); - function createDrawerInfo(elementResults: T[]): DrawerInitData { + function createDrawerInfo( + elementResults: AssessmentVisualizationInstance[] | null, + ): DrawerInitData { return { data: elementResults, featureFlagStoreData: getDefaultFeatureFlagsWeb(), }; } - function createElementResults(ids: string[]): HtmlElementAxeResults[] { + function createElementResults(ids: string[]): AssessmentVisualizationInstance[] { return ids.map(id => { return { ruleResults: {}, target: [id], targetIndex: 0, - }; + } as AssessmentVisualizationInstance; }); } diff --git a/src/tests/unit/tests/injected/visualization/single-target-drawer.test.ts b/src/tests/unit/tests/injected/visualization/single-target-drawer.test.ts index f08ad43f66b..0798aa4f59a 100644 --- a/src/tests/unit/tests/injected/visualization/single-target-drawer.test.ts +++ b/src/tests/unit/tests/injected/visualization/single-target-drawer.test.ts @@ -1,6 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -import { HtmlElementAxeResults } from 'common/types/store-data/visualization-scan-result-data'; +import { AssessmentVisualizationInstance } from 'injected/frameCommunicators/html-element-axe-results-helper'; import { IMock, Mock, Times } from 'typemoq'; import { getDefaultFeatureFlagsWeb } from '../../../../../common/feature-flags'; @@ -29,12 +29,12 @@ describe('SingleTargetDrawer Tests', () => { const testSubject = new SingleTargetDrawer(drawerUtilsMock.object, formatterMock.object); - const drawerInfo: DrawerInitData = { + const drawerInfo: DrawerInitData = { data: [ { target: ['body'], - }, - ] as HtmlElementAxeResults[], + } as AssessmentVisualizationInstance, + ], featureFlagStoreData: getDefaultFeatureFlagsWeb(), }; @@ -53,12 +53,12 @@ describe('SingleTargetDrawer Tests', () => { const testSubject = new SingleTargetDrawer(drawerUtilsMock.object, formatterMock.object); - const drawerInfo: DrawerInitData = { + const drawerInfo: DrawerInitData = { data: [ { target: ['body'], - }, - ] as HtmlElementAxeResults[], + } as AssessmentVisualizationInstance, + ], featureFlagStoreData: getDefaultFeatureFlagsWeb(), }; @@ -84,12 +84,12 @@ describe('SingleTargetDrawer Tests', () => { const testSubject = new SingleTargetDrawer(drawerUtilsMock.object, formatterMock.object); - const drawerInfo: DrawerInitData = { + const drawerInfo: DrawerInitData = { data: [ { target: ['body'], - }, - ] as HtmlElementAxeResults[], + } as AssessmentVisualizationInstance, + ], featureFlagStoreData: getDefaultFeatureFlagsWeb(), }; @@ -115,12 +115,12 @@ describe('SingleTargetDrawer Tests', () => { const testSubject = new SingleTargetDrawer(drawerUtilsMock.object, formatterMock.object); - const drawerInfo: DrawerInitData = { + const drawerInfo: DrawerInitData = { data: [ { target: ['body'], - }, - ] as HtmlElementAxeResults[], + } as AssessmentVisualizationInstance, + ], featureFlagStoreData: getDefaultFeatureFlagsWeb(), }; diff --git a/src/tests/unit/tests/injected/visualization/svg-drawer.test.ts b/src/tests/unit/tests/injected/visualization/svg-drawer.test.ts index e84f02cf668..ba160b18729 100644 --- a/src/tests/unit/tests/injected/visualization/svg-drawer.test.ts +++ b/src/tests/unit/tests/injected/visualization/svg-drawer.test.ts @@ -1,7 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. import { TabbedElementData } from 'common/types/store-data/visualization-scan-result-data'; -import { TabStopVisualizationInstance } from 'injected/frameCommunicators/html-element-axe-results-helper'; +import { + AssessmentVisualizationInstance, + TabStopVisualizationInstance, +} from 'injected/frameCommunicators/html-element-axe-results-helper'; import { IMock, It, Mock, Times } from 'typemoq'; import { getDefaultFeatureFlagsWeb } from '../../../../../common/feature-flags'; @@ -47,7 +50,9 @@ describe('SVGDrawer', () => { shadowUtilsMock.setup(x => x.getShadowContainer()).returns(() => shadowContainer); }); - function createDrawerInfo(elementResults: T[]): DrawerInitData { + function createDrawerInfo( + elementResults: AssessmentVisualizationInstance[] | null, + ): DrawerInitData { return { data: elementResults, featureFlagStoreData: getDefaultFeatureFlagsWeb(), @@ -176,7 +181,7 @@ describe('SVGDrawer', () => { null, ); - testSubject.initialize(createDrawerInfo(tabbedElements)); + testSubject.initialize(createDrawerInfo(tabbedElements as any)); expect((testSubject as any).allVisualizedItems).toEqual(expectedAllVisualizedItems); drawerUtilsMock.verifyAll(); }); diff --git a/tsconfig.strictNullChecks.json b/tsconfig.strictNullChecks.json index 0a5baab57d6..557241fbe5f 100644 --- a/tsconfig.strictNullChecks.json +++ b/tsconfig.strictNullChecks.json @@ -8,8 +8,10 @@ "./src/DetailsView/components/action-and-cancel-buttons-component.tsx", "./src/DetailsView/components/assessment-instance-details-column.tsx", "./src/DetailsView/components/assessment-instance-selected-button.tsx", + "./src/DetailsView/components/assessment-visualization-enabled-toggle.tsx", "./src/DetailsView/components/auto-detected-failures-dialog.tsx", "./src/DetailsView/components/base-left-nav.tsx", + "./src/DetailsView/components/base-visual-helper-toggle.tsx", "./src/DetailsView/components/change-assessment-dialog.tsx", "./src/DetailsView/components/choice-group-pass-fail.tsx", "./src/DetailsView/components/failure-instance-panel-details.tsx", @@ -38,6 +40,7 @@ "./src/DetailsView/components/report-export-button.tsx", "./src/DetailsView/components/requirement-instructions.tsx", "./src/DetailsView/components/requirement-view-title.tsx", + "./src/DetailsView/components/restart-scan-visual-helper-toggle.tsx", "./src/DetailsView/components/save-assessment-button-factory.tsx", "./src/DetailsView/components/save-assessment-button.tsx", "./src/DetailsView/components/scan-incomplete-warning.tsx", @@ -67,58 +70,32 @@ "./src/DetailsView/tab-stops-failed-counter.ts", "./src/DetailsView/tab-stops-requirement-instances-collapsible-content.tsx", "./src/DetailsView/tab-stops-requirement-result.ts", - "./src/assessments/adaptable-content/test-steps/high-contrast-mode.tsx", - "./src/assessments/adaptable-content/test-steps/hover-focus-content.tsx", - "./src/assessments/adaptable-content/test-steps/orientation.tsx", - "./src/assessments/adaptable-content/test-steps/reflow.tsx", - "./src/assessments/adaptable-content/test-steps/resize-text.tsx", - "./src/assessments/adaptable-content/test-steps/test-step.ts", "./src/assessments/assessment-default-message-generator.tsx", "./src/assessments/auto-pass-if-no-results.ts", - "./src/assessments/color/test-steps/auditory-cues.tsx", - "./src/assessments/color/test-steps/flashing.tsx", - "./src/assessments/color/test-steps/sensory-characteristics.tsx", - "./src/assessments/color/test-steps/test-steps.tsx", - "./src/assessments/contrast/test-steps/test-steps.ts", + "./src/assessments/automated-checks/automated-checks-visualization-enabled-toggle.tsx", + "./src/assessments/automated-checks/build-test-steps-from-rules.tsx", "./src/assessments/custom-widgets/custom-widgets-column-renderer-factory.tsx", "./src/assessments/custom-widgets/custom-widgets-column-renderer.tsx", "./src/assessments/custom-widgets/design-pattern.ts", "./src/assessments/custom-widgets/test-steps/test-steps.ts", + "./src/assessments/headings/test-steps/no-missing-headings.tsx", "./src/assessments/headings/test-steps/test-steps.ts", - "./src/assessments/images/test-steps/captchas.tsx", - "./src/assessments/images/test-steps/test-steps.ts", - "./src/assessments/keyboard-interaction/test-steps/character-key-shortcuts.tsx", - "./src/assessments/keyboard-interaction/test-steps/no-keyboard-traps.tsx", - "./src/assessments/keyboard-interaction/test-steps/no-keystroke-timings.tsx", - "./src/assessments/keyboard-interaction/test-steps/on-focus.tsx", - "./src/assessments/keyboard-interaction/test-steps/on-input.tsx", - "./src/assessments/keyboard-interaction/test-steps/test-steps.ts", "./src/assessments/landmarks/does-result-have-main-role.ts", + "./src/assessments/landmarks/test-steps/no-repeating-content.tsx", + "./src/assessments/landmarks/test-steps/primary-content.tsx", "./src/assessments/landmarks/test-steps/test-steps.ts", + "./src/assessments/links/test-steps/link-function.tsx", + "./src/assessments/links/test-steps/link-purpose.tsx", "./src/assessments/links/test-steps/test-steps.ts", "./src/assessments/markup.tsx", "./src/assessments/medium-pass-requirements.ts", - "./src/assessments/native-widgets/test-steps/test-steps.ts", "./src/assessments/page/pagetitle-instance-details-column-renderer.tsx", "./src/assessments/page/test-steps/general-navigation.tsx", "./src/assessments/page/test-steps/page-title.tsx", "./src/assessments/page/test-steps/test-steps.ts", - "./src/assessments/semantics/test-steps/emphasis.tsx", - "./src/assessments/semantics/test-steps/letter-spacing.tsx", - "./src/assessments/semantics/test-steps/lists.tsx", - "./src/assessments/semantics/test-steps/quotes.tsx", - "./src/assessments/semantics/test-steps/table-semantics.tsx", - "./src/assessments/semantics/test-steps/test-steps.ts", - "./src/assessments/sequence/test-steps/columns.tsx", - "./src/assessments/sequence/test-steps/layout-tables.tsx", - "./src/assessments/sequence/test-steps/test-steps.ts", "./src/assessments/types/instance-table-data.ts", "./src/assessments/types/report-instance-field.ts", "./src/assessments/types/requirement.ts", - "./src/assessments/visible-focus-order/test-steps/closing-content.tsx", - "./src/assessments/visible-focus-order/test-steps/modal-dialogs.tsx", - "./src/assessments/visible-focus-order/test-steps/revealing-content.tsx", - "./src/assessments/visible-focus-order/test-steps/test-steps.ts", "./src/background/IndexedDBDataKeys.ts", "./src/background/actions/action-hub.ts", "./src/background/actions/action-payloads.ts", @@ -391,6 +368,8 @@ "./src/injected/details-dialog-handler.ts", "./src/injected/dialog-renderer-impl.tsx", "./src/injected/dialog-renderer.ts", + "./src/injected/drawing-controller.ts", + "./src/injected/drawing-initiator.ts", "./src/injected/element-based-view-model-creator.ts", "./src/injected/element-finder-by-path.ts", "./src/injected/element-finder-by-position.ts", @@ -574,17 +553,26 @@ "src/Devtools/**/*", "src/ad-hoc-visualizations/**/*", "src/ad-hoc-visualizations/calculated-tab-stops/**/*", + "src/assessments/adaptable-content/test-steps/**/*", "src/assessments/audio-video-only/test-steps/**/*", + "src/assessments/color/test-steps/**/*", "src/assessments/common/**/*", + "src/assessments/contrast/test-steps/**/*", "src/assessments/errors/test-steps/**/*", + "src/assessments/images/test-steps/**/*", + "src/assessments/keyboard-interaction/test-steps/**/*", "src/assessments/language/common/**/*", "src/assessments/language/test-steps/**/*", "src/assessments/live-multimedia/test-steps/**/*", + "src/assessments/native-widgets/test-steps/**/*", "src/assessments/parsing/test-steps/**/*", "src/assessments/pointer-motion/test-steps/**/*", "src/assessments/prerecorded-multimedia/test-steps/**/*", "src/assessments/repetitive-content/test-steps/**/*", + "src/assessments/semantics/test-steps/**/*", + "src/assessments/sequence/test-steps/**/*", "src/assessments/timed-events/test-steps/**/*", + "src/assessments/visible-focus-order/test-steps/**/*", "src/background/global-action-creators/registrar/**/*", "src/background/injector/**/*", "src/common/action/**/*",