Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Fix CSP problems due to cypress-axe #10843

Merged
merged 4 commits into from
May 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions .github/workflows/cypress.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -135,10 +135,6 @@ jobs:
persist-credentials: false
path: matrix-react-sdk

# This is necessary as Cypress relies on eval for passing functions between processes
- name: Allow CSP script-src unsafe-eval
run: sed -i "s/script-src /script-src 'unsafe-eval' /" webapp/index.html

- name: Run Cypress tests
uses: cypress-io/github-action@59c3b9b4a1a6e623c29806797d849845443487d1
with:
Expand Down
32 changes: 32 additions & 0 deletions cypress/support/axe.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,3 +67,35 @@ Cypress.Commands.overwrite(
);
},
);

// Load axe-core into the window under test.
//
// The injectAxe in cypress-axe attempts to load axe via an `eval`. That conflicts with our CSP
// which disallows "unsafe-eval". So, replace it with an implementation that loads it via an
// injected <script> element.
Cypress.Commands.overwrite("injectAxe", (originalFn: Chainable["injectAxe"]): void => {
Cypress.log({ name: "injectAxe" });

// load the minified axe source, and create an intercept to serve it up
cy.readFile("node_modules/axe-core/axe.min.js", { log: false }).then((source) => {
cy.intercept("/_axe", source);
});

// inject a script tag to load it
cy.get("head", { log: false }).then(
(head) =>
new Promise((resolve, reject) => {
const script = document.createElement("script");
script.type = "text/javascript";
script.async = true;
script.onload = resolve;
script.onerror = (_e) => {
// Unfortunately there does not seem to be a way to get a reason for the error.
// The error event is useless.
reject(new Error("Unable to load axe"));
};
script.src = "/_axe";
head.get()[0].appendChild(script);
}),
);
});