From 555c5c91c48a0367708ec8b1bfc01ebe5c5e6121 Mon Sep 17 00:00:00 2001 From: Josiah Hoskins Date: Tue, 15 Aug 2023 12:14:19 -0500 Subject: [PATCH 1/7] small changes --- .../src/ts/options/OptionsApp.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/accessibility-checker-extension/src/ts/options/OptionsApp.tsx b/accessibility-checker-extension/src/ts/options/OptionsApp.tsx index 292eb0b9a..eb47446ee 100644 --- a/accessibility-checker-extension/src/ts/options/OptionsApp.tsx +++ b/accessibility-checker-extension/src/ts/options/OptionsApp.tsx @@ -20,8 +20,8 @@ import React from "react"; import { IArchiveDefinition, IPolicyDefinition, ISettings } from "../interfaces/interfaces"; import { getBGController } from "../background/backgroundController"; +// import { getDevtoolsController } from "../devtools/devtoolsController"; import { DocPage } from "../docs/components/DocPage"; -// import { BrowserDetection } from "../util/browserDetection"; import { Button, @@ -81,6 +81,8 @@ export class OptionsApp extends React.Component<{}, OptionsAppState> { async componentDidMount() { let self = this; let settings = await bgController.getSettings(); + // let numStoredReports:number = (await getDevtoolsController().getStoredReportsMeta()).length; + // console.log("numStoredReports = ", numStoredReports); // console.log("***", settings); let archives = await bgController.getArchives(); let selected_archive: IArchiveDefinition | null = null; @@ -351,6 +353,8 @@ export class OptionsApp extends React.Component<{}, OptionsAppState> { {!this.state.selected_archive && } + {/* JCH - Need to check if there are scans, storedReportsCount > 0 */} + {/* {console.log("scanCount = ", scanCount)} */} {this.state.selected_archive && <> Date: Tue, 15 Aug 2023 12:53:17 -0500 Subject: [PATCH 2/7] Add function for global scan counts and clearing scans --- .../src/ts/background/backgroundController.ts | 63 ++++++++++++++++++- .../src/ts/devtools/devtoolsController.ts | 7 ++- .../src/ts/interfaces/interfaces.ts | 6 ++ .../src/ts/options/OptionsApp.tsx | 21 +++++++ 4 files changed, 95 insertions(+), 2 deletions(-) diff --git a/accessibility-checker-extension/src/ts/background/backgroundController.ts b/accessibility-checker-extension/src/ts/background/backgroundController.ts index e55eafc31..00dad3bb2 100644 --- a/accessibility-checker-extension/src/ts/background/backgroundController.ts +++ b/accessibility-checker-extension/src/ts/background/backgroundController.ts @@ -15,7 +15,7 @@ *****************************************************************************/ import { getDevtoolsController } from "../devtools/devtoolsController"; -import { IArchiveDefinition, IMessage, IReport, IRuleset, ISettings } from "../interfaces/interfaces"; +import { IArchiveDefinition, IMessage, IReport, IRuleset, ISessionState, ISettings } from "../interfaces/interfaces"; import { CommonMessaging } from "../messaging/commonMessaging"; import { Controller, eControllerType, ListenerType } from "../messaging/controller"; import Config from "../util/config"; @@ -141,6 +141,57 @@ class BackgroundController extends Controller { } ///// Settings related functions ///////////////////////////////////////// + /** + * Global state for the extension + */ + public async getSessionState() : Promise { + let retVal = (await this.hook("getSessionState", null, async () => { + let retVal = await new Promise((resolve, _reject) => { + (chrome.storage as any).session.get("SESSION_STATE", async function (result: { SESSION_STATE?: ISessionState}) { + result.SESSION_STATE = result.SESSION_STATE || { + tabStoredCount: {} + } + result.SESSION_STATE.tabStoredCount = result.SESSION_STATE.tabStoredCount || {}; + resolve(result.SESSION_STATE as ISessionState); + }); + }) + return retVal; + }))!; + return retVal; + } + + /** + * Set settings for the extension + */ + public async setSessionState(sessionState: ISessionState) : Promise { + return this.hook("setSessionState", sessionState, async () => { + await new Promise((resolve, _reject) => { + (chrome.storage as any).session.set({ "SESSION_STATE": sessionState }, async function () { + resolve(sessionState!); + }); + }); + this.notifyEventListeners("BG_onSessionState", -1, sessionState); + return sessionState; + }); + } + + + /** + * Set stored scan count + */ + public async setStoredScanCount(info: { tabId: number, count: number }) : Promise { + return this.hook("setStoredScanCount", info, async () => { + console.log("Setting stored count", info); + let { tabId, count }: {tabId: number, count: number } = info; + let sessionState = await this.getSessionState(); + if (count === 0) { + delete sessionState.tabStoredCount[tabId]; + } else { + sessionState.tabStoredCount[tabId] = count; + } + return await this.setSessionState(sessionState); + }); + } /** * Get settings for the extension @@ -178,6 +229,9 @@ class BackgroundController extends Controller { this.addEventListener(listener, `BG_onSettings`); } + public async addSessionStateListener(listener: ListenerType) { + this.addEventListener(listener, `BG_onSessionState`); + } /** * Get the archive definitions */ @@ -337,6 +391,13 @@ class BackgroundController extends Controller { const listenMsgs : { [ msgId: string ] : (msgBody: IMessage, senderTabId?: number) => Promise }= { + "BG_getSessionState": async () => self.getSessionState(), + "BG_setSessionState": async (msgBody) => { + return self.setSessionState(msgBody.content); + }, + "BG_setStoredScanCount": async (msgBody) => { + return self.setStoredScanCount(msgBody.content); + }, "BG_getSettings": async () => self.getSettings(), "BG_getArchives": async () => self.getArchives(), "BG_getTabId": async (_a, senderTabId) => self.getTabId(senderTabId), diff --git a/accessibility-checker-extension/src/ts/devtools/devtoolsController.ts b/accessibility-checker-extension/src/ts/devtools/devtoolsController.ts index 05050a74c..0c3b7a19d 100644 --- a/accessibility-checker-extension/src/ts/devtools/devtoolsController.ts +++ b/accessibility-checker-extension/src/ts/devtools/devtoolsController.ts @@ -87,6 +87,7 @@ export class DevtoolsController extends Controller { return await this.hook("setStoredReportsMeta", updateMetaArr, async () => { if (updateMetaArr.length === 0) { devtoolsState!.storedReports = []; + getBGController().setStoredScanCount({ tabId: this.ctrlDest.tabId, count: 0}); this.notifyEventListeners("DT_onStoredReportsMeta", this.ctrlDest.tabId, await this.getStoredReportsMeta()); } else { let misMatch = false; @@ -113,6 +114,7 @@ export class DevtoolsController extends Controller { if (!misMatch) { devtoolsState!.storedReports = newReports; let data = await this.getStoredReportsMeta(); + getBGController().setStoredScanCount({ tabId: this.ctrlDest.tabId, count: data.length}); this.notifyEventListeners("DT_onStoredReportsMeta", this.ctrlDest.tabId, data); } } @@ -139,6 +141,7 @@ export class DevtoolsController extends Controller { public async clearStoredReports() : Promise { return this.hook("clearStoredReports", null, async () => { devtoolsState!.storedReports = []; + getBGController().setStoredScanCount({ tabId: this.ctrlDest.tabId, count: 0}); this.notifyEventListeners("DT_onStoredReportsMeta", this.ctrlDest.tabId, await this.getStoredReportsMeta()); }); } @@ -213,7 +216,9 @@ export class DevtoolsController extends Controller { return new Promise((resolve, _reject) => { setTimeout(async () => { this.notifyEventListeners("DT_onReport", this.ctrlDest.tabId, report); - this.notifyEventListeners("DT_onStoredReportsMeta", this.ctrlDest.tabId, await this.getStoredReportsMeta()); + let storedReportsMeta = await this.getStoredReportsMeta(); + getBGController().setStoredScanCount({ tabId: this.ctrlDest.tabId, count: storedReportsMeta.length}); + this.notifyEventListeners("DT_onStoredReportsMeta", this.ctrlDest.tabId, storedReportsMeta); resolve(); }, 0) }); diff --git a/accessibility-checker-extension/src/ts/interfaces/interfaces.ts b/accessibility-checker-extension/src/ts/interfaces/interfaces.ts index d0b9bef2c..489846686 100644 --- a/accessibility-checker-extension/src/ts/interfaces/interfaces.ts +++ b/accessibility-checker-extension/src/ts/interfaces/interfaces.ts @@ -46,6 +46,12 @@ export interface ISettings { tabStopFirstTime: boolean } +export interface ISessionState { + tabStoredCount: { + [tabId: number]: number + } +} + export type MsgDestType = { type: "contentScript" tabId: number diff --git a/accessibility-checker-extension/src/ts/options/OptionsApp.tsx b/accessibility-checker-extension/src/ts/options/OptionsApp.tsx index eb47446ee..9e11f05c7 100644 --- a/accessibility-checker-extension/src/ts/options/OptionsApp.tsx +++ b/accessibility-checker-extension/src/ts/options/OptionsApp.tsx @@ -43,6 +43,7 @@ import { } from "@carbon/react/icons"; import "./option.scss"; +import { getDevtoolsController } from "../devtools/devtoolsController"; interface OptionsAppState { lastSettings?: ISettings @@ -143,6 +144,26 @@ export class OptionsApp extends React.Component<{}, OptionsAppState> { }); } + async existStoredScans() { + let tabStoredScans = (await getBGController().getSessionState()).tabStoredCount; + let existScans = false; + for (const tabId in tabStoredScans) { + if (tabStoredScans[tabId] > 0) { + existScans = true; + } + } + return existScans; + } + + async clearStoredScans() { + let tabStoredScans = (await getBGController().getSessionState()).tabStoredCount; + for (const tabId in tabStoredScans) { + if (tabStoredScans[tabId] > 0) { + getDevtoolsController(false, "remote", parseInt(tabId)).clearStoredReports(); + } + } + } + /** * Return the archive definition corresponding to the 'latest' id * @param archives From 3c8d8e5b70ec86ce7e5d618260fcea53b0465477 Mon Sep 17 00:00:00 2001 From: Josiah Hoskins Date: Wed, 16 Aug 2023 18:32:31 -0500 Subject: [PATCH 3/7] first take done --- .../src/ts/options/OptionsApp.tsx | 82 +++++++++++++++++-- 1 file changed, 75 insertions(+), 7 deletions(-) diff --git a/accessibility-checker-extension/src/ts/options/OptionsApp.tsx b/accessibility-checker-extension/src/ts/options/OptionsApp.tsx index 9e11f05c7..70f90e918 100644 --- a/accessibility-checker-extension/src/ts/options/OptionsApp.tsx +++ b/accessibility-checker-extension/src/ts/options/OptionsApp.tsx @@ -58,6 +58,10 @@ interface OptionsAppState { tabStopOutlines: boolean; tabStopAlerts: boolean; tabStopFirstTime: boolean; + // Change Ruleset while there are stored scans + storedScansExist: boolean; + modalDeploymentWithScans: boolean; + modalGuidelinesWithScans: boolean; savePending: number; } @@ -76,15 +80,16 @@ export class OptionsApp extends React.Component<{}, OptionsAppState> { tabStopOutlines: false, tabStopAlerts: true, tabStopFirstTime: true, + // Change Ruleset while there are stored scans + storedScansExist: false, + modalDeploymentWithScans: false, + modalGuidelinesWithScans: false, savePending: 0 }; async componentDidMount() { let self = this; let settings = await bgController.getSettings(); - // let numStoredReports:number = (await getDevtoolsController().getStoredReportsMeta()).length; - // console.log("numStoredReports = ", numStoredReports); - // console.log("***", settings); let archives = await bgController.getArchives(); let selected_archive: IArchiveDefinition | null = null; let rulesets: IPolicyDefinition[] | null = null; @@ -95,6 +100,7 @@ export class OptionsApp extends React.Component<{}, OptionsAppState> { let tabStopAlerts: boolean = true; let tabStopFirstTime: boolean = true; + let storedScansExist = await this.existStoredScans(); selected_archive = settings.selected_archive; rulesets = selected_archive.rulesets.default; @@ -129,7 +135,11 @@ export class OptionsApp extends React.Component<{}, OptionsAppState> { selected_ruleset: this.getGuideline(selected_archive, selectedRulesetId!), tabStopLines: tabStopLines, tabStopOutlines: tabStopOutlines, tabStopAlerts: tabStopAlerts, tabStopFirstTime: tabStopFirstTime, + storedScansExist: storedScansExist, }); + + + bgController.addSettingsListener(async (newSettings) => { let newState : any = { lastSettings: newSettings @@ -144,6 +154,14 @@ export class OptionsApp extends React.Component<{}, OptionsAppState> { }); } + setModalDeploymentWithScans() { + this.setState({modalDeploymentWithScans: true}); + } + + setModalGuidelinesWithScans() { + this.setState({modalGuidelinesWithScans: true}); + } + async existStoredScans() { let tabStoredScans = (await getBGController().getSessionState()).tabStoredCount; let existScans = false; @@ -162,6 +180,7 @@ export class OptionsApp extends React.Component<{}, OptionsAppState> { getDevtoolsController(false, "remote", parseInt(tabId)).clearStoredReports(); } } + this.setState({storedScansExist: false}); } /** @@ -373,9 +392,13 @@ export class OptionsApp extends React.Component<{}, OptionsAppState> { + {/* JCH - Need to check if there are scans, storedReportsCount > 0 + but we need to make a state and set it in componentDidMount + */} + {console.log("storedScansExist = ", this.state.storedScansExist)} + {!this.state.selected_archive && } - {/* JCH - Need to check if there are scans, storedReportsCount > 0 */} - {/* {console.log("scanCount = ", scanCount)} */} + {this.state.selected_archive && <> { titleText="" type="default" selectedItem={selected_archive} - onChange={this.onSelectArchive.bind(this)} + onChange={async (evt: any) => { + await this.onSelectArchive(evt); + if (this.state.storedScansExist) { + this.setModalDeploymentWithScans(); + } + }} /> } @@ -409,6 +437,24 @@ export class OptionsApp extends React.Component<{}, OptionsAppState> {

For details on rule set changes between deployments, see Release notes

+ + { + this.setState({ modalDeploymentWithScans: false }); + }).bind(this)} + onRequestSubmit={(() => { + this.clearStoredScans(); + this.setState({ modalDeploymentWithScans: false }); + }).bind(this) + } + > +

Changing the rule set deployment dates will delete any currently stored scans.

+
+ {/**** Select ruleset / policy */}
@@ -442,7 +488,12 @@ export class OptionsApp extends React.Component<{}, OptionsAppState> { titleText="" type="default" selectedItem={selected_ruleset} - onChange={this.onSelectGuideline.bind(this)} + onChange={async (evt: any) => { + await this.onSelectGuideline(evt); + if (this.state.storedScansExist) { + this.setModalGuidelinesWithScans(); + } + }} /> } @@ -461,6 +512,23 @@ export class OptionsApp extends React.Component<{}, OptionsAppState> {
+ { + this.setState({ modalGuidelinesWithScans: false }); + }).bind(this)} + onRequestSubmit={(() => { + this.clearStoredScans(); + this.setState({ modalGuidelinesWithScans: false }); + }).bind(this) + } + > +

Changing the rule set deployment dates will delete any currently stored scans.

+
+

Keyboard checker mode

From 165d6d48cc427de0130b98d12424e97a1464820f Mon Sep 17 00:00:00 2001 From: Josiah Hoskins Date: Thu, 17 Aug 2023 10:41:24 -0500 Subject: [PATCH 4/7] remove move logs --- .../src/ts/background/backgroundController.ts | 2 -- accessibility-checker-extension/src/ts/options/OptionsApp.tsx | 4 ---- 2 files changed, 6 deletions(-) diff --git a/accessibility-checker-extension/src/ts/background/backgroundController.ts b/accessibility-checker-extension/src/ts/background/backgroundController.ts index 00dad3bb2..337ca051e 100644 --- a/accessibility-checker-extension/src/ts/background/backgroundController.ts +++ b/accessibility-checker-extension/src/ts/background/backgroundController.ts @@ -181,7 +181,6 @@ class BackgroundController extends Controller { */ public async setStoredScanCount(info: { tabId: number, count: number }) : Promise { return this.hook("setStoredScanCount", info, async () => { - console.log("Setting stored count", info); let { tabId, count }: {tabId: number, count: number } = info; let sessionState = await this.getSessionState(); if (count === 0) { @@ -271,7 +270,6 @@ class BackgroundController extends Controller { (async () => { let settings = await this.getSettings(); getDevtoolsController(false, "remote", senderTabId).setScanningState("running"); - console.info(`[INFO]: Scanning using archive ${settings.selected_archive.id} and guideline ${settings.selected_ruleset.id}`); let report : IReport = await myExecuteScript2(senderTabId, (settings: ISettings) => { let checker = new (window).aceIBMa.Checker(); if (Object.keys(checker.engine.nlsMap).length === 0) { diff --git a/accessibility-checker-extension/src/ts/options/OptionsApp.tsx b/accessibility-checker-extension/src/ts/options/OptionsApp.tsx index 70f90e918..119117ba8 100644 --- a/accessibility-checker-extension/src/ts/options/OptionsApp.tsx +++ b/accessibility-checker-extension/src/ts/options/OptionsApp.tsx @@ -395,10 +395,8 @@ export class OptionsApp extends React.Component<{}, OptionsAppState> { {/* JCH - Need to check if there are scans, storedReportsCount > 0 but we need to make a state and set it in componentDidMount */} - {console.log("storedScansExist = ", this.state.storedScansExist)} {!this.state.selected_archive && } - {this.state.selected_archive && <> { checked={this.state.tabStopLines} //@ts-ignore onChange={(value: any, id: any) => { - // console.log("lines checkbox id.checked = ",id.checked); this.setState({ tabStopLines: id.checked }); }} @@ -552,7 +549,6 @@ export class OptionsApp extends React.Component<{}, OptionsAppState> { checked={this.state.tabStopOutlines} //@ts-ignore onChange={(value: any, id: any) => { - // console.log("lines checkbox id.checked = ",id.checked); this.setState({ tabStopOutlines: id.checked }); }} /> From f2d81f218c1bcb70ec8db4d8f5ed812d5c45e2fe Mon Sep 17 00:00:00 2001 From: Tom Brunet Date: Fri, 18 Aug 2023 23:12:54 -0500 Subject: [PATCH 5/7] Update accessibility-checker-extension/src/ts/options/OptionsApp.tsx --- accessibility-checker-extension/src/ts/options/OptionsApp.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/accessibility-checker-extension/src/ts/options/OptionsApp.tsx b/accessibility-checker-extension/src/ts/options/OptionsApp.tsx index 119117ba8..30fe8fd6a 100644 --- a/accessibility-checker-extension/src/ts/options/OptionsApp.tsx +++ b/accessibility-checker-extension/src/ts/options/OptionsApp.tsx @@ -20,7 +20,6 @@ import React from "react"; import { IArchiveDefinition, IPolicyDefinition, ISettings } from "../interfaces/interfaces"; import { getBGController } from "../background/backgroundController"; -// import { getDevtoolsController } from "../devtools/devtoolsController"; import { DocPage } from "../docs/components/DocPage"; import { From e3d9ebe916bdac828c7d1e83073de25c0422b5f6 Mon Sep 17 00:00:00 2001 From: Josiah Hoskins Date: Wed, 23 Aug 2023 13:36:04 -0500 Subject: [PATCH 6/7] Fix Formatting in Options modals --- .../src/ts/options/OptionsApp.tsx | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/accessibility-checker-extension/src/ts/options/OptionsApp.tsx b/accessibility-checker-extension/src/ts/options/OptionsApp.tsx index 30fe8fd6a..96494b257 100644 --- a/accessibility-checker-extension/src/ts/options/OptionsApp.tsx +++ b/accessibility-checker-extension/src/ts/options/OptionsApp.tsx @@ -17,7 +17,7 @@ limitations under the License. *****************************************************************************/ import React from "react"; - +import ReactDOM from 'react-dom'; import { IArchiveDefinition, IPolicyDefinition, ISettings } from "../interfaces/interfaces"; import { getBGController } from "../background/backgroundController"; import { DocPage } from "../docs/components/DocPage"; @@ -418,7 +418,7 @@ export class OptionsApp extends React.Component<{}, OptionsAppState> { /> } - {

Preview rules: Try an experimental preview of possible future rule set

For details on rule set changes between deployments, see Release notes

-
+ , document.body)} - { } >

Changing the rule set deployment dates will delete any currently stored scans.

-
+ , document.body)}
{/**** Select ruleset / policy */} @@ -494,7 +495,7 @@ export class OptionsApp extends React.Component<{}, OptionsAppState> { /> } - {

IBM Accessibility: Rules for WCAG 2.1 AA plus additional IBM requirements

WCAG 2.1 (A, AA): This is the current W3C recommendation. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0

WCAG 2.0 (A, AA): Referenced by US Section 508, but not the latest W3C recommendation

-
+ , document.body)} - { } >

Changing the rule set deployment dates will delete any currently stored scans.

-
+ , document.body)}

Keyboard checker mode

From 93355a39656263ec080a2023151c0c00a405e635 Mon Sep 17 00:00:00 2001 From: Josiah Hoskins Date: Mon, 28 Aug 2023 13:33:52 -0500 Subject: [PATCH 7/7] If cancel return deployment date or guideline to previous --- accessibility-checker-extension/src/ts/options/OptionsApp.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/accessibility-checker-extension/src/ts/options/OptionsApp.tsx b/accessibility-checker-extension/src/ts/options/OptionsApp.tsx index 96494b257..16ad6f0be 100644 --- a/accessibility-checker-extension/src/ts/options/OptionsApp.tsx +++ b/accessibility-checker-extension/src/ts/options/OptionsApp.tsx @@ -443,6 +443,7 @@ export class OptionsApp extends React.Component<{}, OptionsAppState> { open={this.state.modalDeploymentWithScans} onRequestClose={(() => { this.setState({ modalDeploymentWithScans: false }); + this.setState({ selected_archive: this.state.lastSettings?.selected_archive! }); }).bind(this)} onRequestSubmit={(() => { this.clearStoredScans(); @@ -517,6 +518,7 @@ export class OptionsApp extends React.Component<{}, OptionsAppState> { open={this.state.modalGuidelinesWithScans} onRequestClose={(() => { this.setState({ modalGuidelinesWithScans: false }); + this.setState({ selected_ruleset: this.getGuideline(this.state.lastSettings?.selected_archive!, this.state.lastSettings?.selected_ruleset.id!) }); }).bind(this)} onRequestSubmit={(() => { this.clearStoredScans();