public async initialize()

in src/injected/main-window-initializer.ts [101:407]


    public async initialize(): Promise<void> {
        const asyncInitializationSteps: Promise<void>[] = [];
        asyncInitializationSteps.push(super.initialize());

        this.visualizationStoreProxy = new StoreProxy<VisualizationStoreData>(
            StoreNames[StoreNames.VisualizationStore],
            this.browserAdapter,
        );
        this.scopingStoreProxy = new StoreProxy<ScopingStoreData>(
            StoreNames[StoreNames.ScopingPanelStateStore],
            this.browserAdapter,
        );
        this.featureFlagStoreProxy = new StoreProxy<FeatureFlagStoreData>(
            StoreNames[StoreNames.FeatureFlagStore],
            this.browserAdapter,
        );
        this.userConfigStoreProxy = new StoreProxy<UserConfigurationStoreData>(
            StoreNames[StoreNames.UserConfigurationStore],
            this.browserAdapter,
        );
        this.visualizationScanResultStoreProxy = new StoreProxy<VisualizationScanResultData>(
            StoreNames[StoreNames.VisualizationScanResultStore],
            this.browserAdapter,
        );
        this.assessmentStoreProxy = new StoreProxy<AssessmentStoreData>(
            StoreNames[StoreNames.AssessmentStore],
            this.browserAdapter,
        );
        this.tabStoreProxy = new StoreProxy<TabStoreData>(
            StoreNames[StoreNames.TabStore],
            this.browserAdapter,
        );
        this.devToolStoreProxy = new StoreProxy<DevToolStoreData>(
            StoreNames[StoreNames.DevToolsStore],
            this.browserAdapter,
        );
        this.inspectStoreProxy = new StoreProxy<InspectStoreData>(
            StoreNames[StoreNames.InspectStore],
            this.browserAdapter,
        );
        this.pathSnippetStoreProxy = new StoreProxy<PathSnippetStoreData>(
            StoreNames[StoreNames.PathSnippetStore],
            this.browserAdapter,
        );
        this.unifiedScanResultStoreProxy = new StoreProxy<UnifiedScanResultStoreData>(
            StoreNames[StoreNames.UnifiedScanResultStore],
            this.browserAdapter,
        );
        this.cardSelectionStoreProxy = new StoreProxy<CardSelectionStoreData>(
            StoreNames[StoreNames.CardSelectionStore],
            this.browserAdapter,
        );
        this.needsReviewScanResultStoreProxy = new StoreProxy<NeedsReviewScanResultStoreData>(
            StoreNames[StoreNames.NeedsReviewScanResultStore],
            this.browserAdapter,
        );
        this.needsReviewCardSelectionStoreProxy = new StoreProxy<NeedsReviewCardSelectionStoreData>(
            StoreNames[StoreNames.NeedsReviewCardSelectionStore],
            this.browserAdapter,
        );
        this.permissionsStateStoreProxy = new StoreProxy<PermissionsStateStoreData>(
            StoreNames[StoreNames.PermissionsStateStore],
            this.browserAdapter,
        );

        const logger = createDefaultLogger();

        const actionMessageDispatcher = new RemoteActionMessageDispatcher(
            this.browserAdapter.sendMessageToFrames,
            null,
            logger,
        );

        const storeActionMessageCreatorFactory = new StoreActionMessageCreatorFactory(
            actionMessageDispatcher,
        );

        const storeActionMessageCreator = storeActionMessageCreatorFactory.fromStores([
            this.visualizationStoreProxy,
            this.scopingStoreProxy,
            this.featureFlagStoreProxy,
            this.userConfigStoreProxy,
            this.visualizationScanResultStoreProxy,
            this.assessmentStoreProxy,
            this.tabStoreProxy,
            this.devToolStoreProxy,
            this.inspectStoreProxy,
            this.pathSnippetStoreProxy,
            this.unifiedScanResultStoreProxy,
            this.cardSelectionStoreProxy,
            this.needsReviewScanResultStoreProxy,
            this.needsReviewCardSelectionStoreProxy,
            this.permissionsStateStoreProxy,
        ]);
        storeActionMessageCreator.getAllStates();

        const telemetryDataFactory = new TelemetryDataFactory();
        const devToolActionMessageCreator = new DevToolActionMessageCreator(
            telemetryDataFactory,
            actionMessageDispatcher,
        );

        const targetPageActionMessageCreator = new TargetPageActionMessageCreator(
            telemetryDataFactory,
            actionMessageDispatcher,
        );
        const issueFilingActionMessageCreator = new IssueFilingActionMessageCreator(
            actionMessageDispatcher,
            telemetryDataFactory,
            TelemetryEventSource.TargetPage,
        );
        const tabStopRequirementActionMessageCreator = new TabStopRequirementActionMessageCreator(
            telemetryDataFactory,
            actionMessageDispatcher,
        );

        const userConfigMessageCreator = new UserConfigMessageCreator(actionMessageDispatcher);

        const browserSpec = new NavigatorUtils(window.navigator, logger).getBrowserSpec();

        const toolData = createToolData(
            'axe-core',
            AxeInfo.Default.version,
            toolName,
            this.appDataAdapter.getVersion(),
            browserSpec,
        );

        MainWindowContext.initialize(
            this.devToolStoreProxy,
            this.userConfigStoreProxy,
            devToolActionMessageCreator,
            targetPageActionMessageCreator,
            issueFilingActionMessageCreator,
            userConfigMessageCreator,
            toolData,
            IssueFilingServiceProviderImpl,
        );

        const drawingInitiator = new DrawingInitiator(this.drawingController);
        const elementBasedViewModelCreator = new ElementBasedViewModelCreator(
            getDecoratedAxeNode,
            getCardSelectionViewData,
            isResultHighlightUnavailableWeb,
        );
        const selectorMapHelper = new SelectorMapHelper(
            Assessments,
            elementBasedViewModelCreator.getElementBasedViewModel,
        );

        const storeHub = new BaseClientStoresHub<TargetPageStoreData>([
            this.visualizationStoreProxy,
            this.tabStoreProxy,
            this.visualizationScanResultStoreProxy,
            this.featureFlagStoreProxy,
            this.assessmentStoreProxy,
            this.userConfigStoreProxy,
            this.unifiedScanResultStoreProxy,
            this.cardSelectionStoreProxy,
            this.needsReviewScanResultStoreProxy,
            this.needsReviewCardSelectionStoreProxy,
            this.permissionsStateStoreProxy,
        ]);

        const clientStoreListener = new ClientStoreListener(storeHub);

        const focusChangeHandler = new FocusChangeHandler(
            targetPageActionMessageCreator,
            this.scrollingController,
        );

        const targetPageVisualizationUpdater = new TargetPageVisualizationUpdater(
            this.visualizationConfigurationFactory,
            selectorMapHelper,
            drawingInitiator,
            isVisualizationEnabled,
            visualizationNeedsUpdate,
        );

        const visualizationStateChangeHandler = new VisualizationStateChangeHandler(
            EnumHelper.getNumericValues(VisualizationType),
            targetPageVisualizationUpdater.updateVisualization,
            Assessments,
        );

        clientStoreListener.registerOnReadyToExecuteVisualizationCallback(
            focusChangeHandler.handleFocusChangeWithStoreData,
        );
        clientStoreListener.registerOnReadyToExecuteVisualizationCallback(
            visualizationStateChangeHandler.updateVisualizationsWithStoreData,
        );

        const frameUrlController = new FrameUrlController(
            this.devToolStoreProxy,
            devToolActionMessageCreator,
            this.frameUrlFinder,
        );

        frameUrlController.listenToStore();

        const iframeDetector = new IframeDetector(document);
        const scanIncompleteWarningDetector = new ScanIncompleteWarningDetector(
            iframeDetector,
            this.permissionsStateStoreProxy,
        );

        const convertScanResultsToUnifiedResults = new ConvertScanResultsToUnifiedResults(
            generateUID,
            getFixResolution,
            getCheckResolution,
        );

        const notificationTextCreator = new NotificationTextCreator(scanIncompleteWarningDetector);

        const unifiedResultSender = new UnifiedResultSender(
            this.browserAdapter.sendMessageToFrames,
            convertScanResultsToUnifiedRules,
            toolData,
            convertScanResultsToUnifiedResults,
            scanIncompleteWarningDetector,
            notificationTextCreator,
            filterNeedsReviewResults,
        );

        const tabStopsDoneAnalyzingTracker = new TabStopsDoneAnalyzingTracker(
            tabStopRequirementActionMessageCreator,
        );

        const analyzerProvider = new AnalyzerProvider(
            this.manualTabStopListener,
            this.tabStopRequirementRunner,
            tabStopRequirementActionMessageCreator,
            tabStopsDoneAnalyzingTracker,
            this.featureFlagStoreProxy,
            this.scopingStoreProxy,
            this.browserAdapter.sendMessageToFrames,
            new ScannerUtils(scan, logger, generateUID),
            telemetryDataFactory,
            DateProvider.getCurrentDate,
            filterResultsByRules,
            unifiedResultSender.sendAutomatedChecksResults,
            unifiedResultSender.sendNeedsReviewResults,
            scanIncompleteWarningDetector,
            logger,
        );

        const analyzerStateUpdateHandler = new AnalyzerStateUpdateHandler(
            this.visualizationConfigurationFactory,
        );
        this.analyzerController = new AnalyzerController(
            this.visualizationStoreProxy,
            this.visualizationScanResultStoreProxy,
            this.featureFlagStoreProxy,
            this.scopingStoreProxy,
            this.visualizationConfigurationFactory,
            analyzerProvider,
            analyzerStateUpdateHandler,
            Assessments,
            tabStopRequirementActionMessageCreator,
        );

        this.analyzerController.listenToStore();

        const htmlElementUtils = new HTMLElementUtils();
        const shadowUtils = new ShadowUtils(htmlElementUtils);
        const scopingListener = new ScopingListener(
            this.elementFinderByPosition,
            this.windowUtils,
            shadowUtils,
            document,
        );
        const inspectActionMessageCreator = new InspectActionMessageCreator(
            telemetryDataFactory,
            TelemetryEventSource.TargetPage,
            actionMessageDispatcher,
        );

        const scopingActionMessageCreator = new ScopingActionMessageCreator(
            telemetryDataFactory,
            TelemetryEventSource.TargetPage,
            actionMessageDispatcher,
        );

        const pathSnippetActionMessageCreator = new PathSnippetActionMessageCreator(
            actionMessageDispatcher,
        );

        this.inspectController = new InspectController(
            this.inspectStoreProxy,
            scopingListener,
            inspectActionMessageCreator.changeInspectMode,
            new InspectConfigurationFactory(scopingActionMessageCreator),
            targetPageActionMessageCreator.setHoveredOverSelector,
        );

        this.inspectController.listenToStore();

        this.pathSnippetController = new PathSnippetController(
            this.pathSnippetStoreProxy,
            this.elementFinderByPath,
            pathSnippetActionMessageCreator.addCorrespondingSnippet,
        );

        this.pathSnippetController.listenToStore();

        await Promise.all(asyncInitializationSteps);
    }