-
-
Notifications
You must be signed in to change notification settings - Fork 1.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Remove inline styles that break plots in strict CSP setups #7109
Conversation
Support strict Content Security Policies that don't allow unsafe inline styles by: * Removing add/deleteRelatedStyleRule from modebar and use event listeners to emulate the on hover behavior by setting style properties directly on the element, which is allowed in strict CSP environments. * Output the main/library-wide CSS rules that are inlined when the library loads into a static CSS file so that users can include it within their applications in an acceptable manner. This allows `addRelatedStyleRule` calls to fail without affecting functionality. * Provide a way to prevent `addRelatedStyleRule` from running when the static CSS file is already included in the app to prevent superfluous errors in console output. * Replace inline styles from "newplotlylogo" with attribute to set the fill color directly on the elements. Note: The `dist/plotly.css` file will need to be added to the release files. Fixes plotly#2355 Plotly uses inline CSS
@martian111 , are you able to rebase this? I'm interested in knowing how the maplibre-gl.css fares in your CSP setup. The mapbox gl css issues you resolve here will if not earlier likely be resolve at the time of v3 with the removal of the deprecated mapbox traces. |
@martian111 Please fetch |
Yes, I'll try to rebase or merge from master when I get some time after work (possibly in the weekend). |
Fixed unit tests by updating the expectations as appropriate to match the changed logic in Pull Request plotly#7109. This revealed a bug where background color changes applied using `Plotly.relayout()` were missed. This bug was also fixed in this change in order to get all unit tests, as updated, to pass.
@birkskyum, @archmoj, sorry for the delay getting back to this. Per your request, I've merged @birkskyum , I haven't used Plotly enough to understand the impact of mapbox vs maplibre. I did retest everything after the merge and fixes using my simple scatter chart example in the CodeSandbox referenced above. Also, as an aside, I did find another feature of Plotly that does not work with strict CSP: Using Thanks! |
Thanks for the updates. |
I think npm run strict instead of npm start Thank you! |
Yes, maplibre appears to be alright, it's only the mapbox traces that are affected by this PR. |
Thanks @birkskyum for testing. This PR is looking good in my eyes. |
Thanks @archmoj and @birkskyum ! I am a bit confused on what you mean by "only the mapbox traces that are affected by this PR". Based on what I understand, the bulk of the changes impact the Modebar, which seems to be applicable to all (or most) Plotly trace types and not only the map trace types listed in Migrate to Maplibre in JavaScript. For example, I've been testing with the basic "scatter" trace type in the linked CodeSandbox. Can you please clarify? I'm trying to understand this library more to see if I even need to look into the |
I meant, when considering just mapbox and maplibre traces, it's only mapbox ones - but as you point out there are some generic changes too. |
I see, thanks! |
Support strict Content Security Policies that don't allow unsafe inline styles by:
addRelatedStyleRule
calls to fail without affecting functionality.addRelatedStyleRule
from running when the static CSS file is already included in the app to prevent superfluous errors in console output.Note: The
dist/plotly.css
file will need to be added to the release files.Possibly fixes #2355 Plotly uses inline CSS
This pull request is the result of reviewing and testing Pull Request #6239, which did not work properly when I tested it against the v2.34.0 release tag (the most recent release at the time of testing and over 2 years since that pull request was created). It also incorporate the comments within that pull request to improve on this one.
Expected Results
plotly.css
into the application in a way allowed by their CSP. A separate build is not required to get this fix.plotly.css
.addRelatedStyleRule
will also output a warning message: "Cannot addRelatedStyleRule, probably due to strict CSP..."<div id="plotly.js-style-global" class="no-inline-styles"></div>
This will cause the
addRelatedStyleRule
function to not attempt to add the inline styles.Testing
Testing this is a bit tricky to setup, but I do have an basic sandbox created that seems to demonstrate:
plotly-basic.js
file from the v2.34.0 release.plotly-basic.js
patched with this pull request.CSB has some special quirks, so the CSP was relaxed to allow things to work due to CSB specifics. However, it was not set up to permit unsafe inline styles nor does it contain the sha256 hash of styles inlined by Plotly.
See comments in the
ScatterChart.tsx
andindex.html
files.https://kl75h2.csb.app/
https://codesandbox.io/s/kl75h2
Followup Questions
deleteRelatedStyleRule
is no longer used anywhere else in the code. It was used by only inmodebar.js
before this change. Should that function be deleted?addStyleRule
is used in two places, both of which are accounted for in this pull request (insrc/registry.js
andbuild/plotcss.js
). How should we warn developers in the future who comes across this function? Add comments and/or rename it to something likeaddStyleRuleUnsafelyInline
?Limitations
I don't much experience with Plotly.js and have been using it only for a simple scatter chart (like the one in the CSB above). I don't have enough experience to understand if more changes are needed beyond my simple test case and the work done in Pull Request #6239. Hopefully this is still helpful to bring this library closer to supporting strict CSP's.