Skip to content

Commit 018f118

Browse files
committed
fix: make modal more CSP-friendly
Setting up `mouseover` and `mouseout` event listeners using the `onmouseover` and `onmouseout` attributes prevents turning off `unsafe-inline` in the page's content security policy. This commit changes the event listeners to use `addEventListener` instead.
1 parent 24feee2 commit 018f118

File tree

1 file changed

+26
-26
lines changed

1 file changed

+26
-26
lines changed

packages/devkit/src/modal.js

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,11 @@ export default class ModalDialog {
121121
this.closeDiv.setAttribute("role", "button");
122122
this.closeDiv.setAttribute("tabindex", 3);
123123
// Apply styles and events after the creation as createElement doesn't process them correctly
124-
let generalStyle = `background-size: 10px; background-image: url(data:image/svg+xml;base64,${window.btoa(closeIcon)})`;
125-
let hoverStyle = `background-size: 10px; background-image: url(data:image/svg+xml;base64,${window.btoa(closeHoverIcon)})`;
126-
this.closeDiv.setAttribute("style", generalStyle);
127-
this.closeDiv.setAttribute("onmouseover", `this.style = "${hoverStyle}";`);
128-
this.closeDiv.setAttribute("onmouseout", `this.style = "${generalStyle}";`);
124+
const generalStyleClose = `background-size: 10px; background-image: url(data:image/svg+xml;base64,${window.btoa(closeIcon)})`;
125+
const hoverStyleClose = `background-size: 10px; background-image: url(data:image/svg+xml;base64,${window.btoa(closeHoverIcon)})`;
126+
this.closeDiv.setAttribute("style", generalStyleClose);
127+
this.closeDiv.addEventListener("mouseover", (e) => (e.target.style = hoverStyleClose));
128+
this.closeDiv.addEventListener("mouseout", (e) => (e.target.style = generalStyleClose));
129129
// To identifiy the element in automated testing
130130
this.closeDiv.setAttribute("data-testid", "mtcteditor-close-button");
131131

@@ -136,11 +136,11 @@ export default class ModalDialog {
136136
this.stackDiv = Util.createElement("a", attributes);
137137
this.stackDiv.setAttribute("role", "button");
138138
this.stackDiv.setAttribute("tabindex", 2);
139-
generalStyle = `background-size: 10px; background-image: url(data:image/svg+xml;base64,${window.btoa(minsIcon)})`;
140-
hoverStyle = `background-size: 10px; background-image: url(data:image/svg+xml;base64,${window.btoa(minsHoverIcon)})`;
141-
this.stackDiv.setAttribute("style", generalStyle);
142-
this.stackDiv.setAttribute("onmouseover", `this.style = "${hoverStyle}";`);
143-
this.stackDiv.setAttribute("onmouseout", `this.style = "${generalStyle}";`);
139+
const generalStyleStack = `background-size: 10px; background-image: url(data:image/svg+xml;base64,${window.btoa(minsIcon)})`;
140+
const hoverStyleStack = `background-size: 10px; background-image: url(data:image/svg+xml;base64,${window.btoa(minsHoverIcon)})`;
141+
this.stackDiv.setAttribute("style", generalStyleStack);
142+
this.stackDiv.addEventListener("mouseover", (e) => (e.target.style = hoverStyleStack));
143+
this.stackDiv.addEventListener("mouseout", (e) => (e.target.style = generalStyleStack));
144144
// To identifiy the element in automated testing
145145
this.stackDiv.setAttribute("data-testid", "mtcteditor-fullscreen-disable-button");
146146

@@ -151,11 +151,11 @@ export default class ModalDialog {
151151
this.maximizeDiv = Util.createElement("a", attributes);
152152
this.maximizeDiv.setAttribute("role", "button");
153153
this.maximizeDiv.setAttribute("tabindex", 2);
154-
generalStyle = `background-size: 10px; background-repeat: no-repeat; background-image: url(data:image/svg+xml;base64,${window.btoa(fullsIcon)})`;
155-
hoverStyle = `background-size: 10px; background-repeat: no-repeat; background-image: url(data:image/svg+xml;base64,${window.btoa(fullsHoverIcon)})`;
156-
this.maximizeDiv.setAttribute("style", generalStyle);
157-
this.maximizeDiv.setAttribute("onmouseover", `this.style = "${hoverStyle}";`);
158-
this.maximizeDiv.setAttribute("onmouseout", `this.style = "${generalStyle}";`);
154+
const generalStyleMaximize = `background-size: 10px; background-repeat: no-repeat; background-image: url(data:image/svg+xml;base64,${window.btoa(fullsIcon)})`;
155+
const hoverStyleMaximize = `background-size: 10px; background-repeat: no-repeat; background-image: url(data:image/svg+xml;base64,${window.btoa(fullsHoverIcon)})`;
156+
this.maximizeDiv.setAttribute("style", generalStyleMaximize);
157+
this.maximizeDiv.addEventListener("mouseover", (e) => (e.target.style = hoverStyleMaximize));
158+
this.maximizeDiv.addEventListener("mouseout", (e) => (e.target.style = generalStyleMaximize));
159159
// To identifiy the element in automated testing
160160
this.maximizeDiv.setAttribute("data-testid", "mtcteditor-fullscreen-enable-button");
161161

@@ -166,11 +166,11 @@ export default class ModalDialog {
166166
this.minimizeDiv = Util.createElement("a", attributes);
167167
this.minimizeDiv.setAttribute("role", "button");
168168
this.minimizeDiv.setAttribute("tabindex", 1);
169-
generalStyle = `background-size: 10px; background-repeat: no-repeat; background-image: url(data:image/svg+xml;base64,${window.btoa(minIcon)})`;
170-
hoverStyle = `background-size: 10px; background-repeat: no-repeat; background-image: url(data:image/svg+xml;base64,${window.btoa(minHoverIcon)})`;
171-
this.minimizeDiv.setAttribute("style", generalStyle);
172-
this.minimizeDiv.setAttribute("onmouseover", `this.style = "${hoverStyle}";`);
173-
this.minimizeDiv.setAttribute("onmouseout", `this.style = "${generalStyle}";`);
169+
const generalStyleMinimize = `background-size: 10px; background-repeat: no-repeat; background-image: url(data:image/svg+xml;base64,${window.btoa(minIcon)})`;
170+
const hoverStyleMinimize = `background-size: 10px; background-repeat: no-repeat; background-image: url(data:image/svg+xml;base64,${window.btoa(minHoverIcon)})`;
171+
this.minimizeDiv.setAttribute("style", generalStyleMinimize);
172+
this.minimizeDiv.addEventListener("mouseover", (e) => (e.target.style = hoverStyleMinimize));
173+
this.minimizeDiv.addEventListener("mouseout", (e) => (e.target.style = generalStyleMinimize));
174174
// To identify the element in automated testing
175175
this.minimizeDiv.setAttribute("data-testid", "mtcteditor-minimize-button");
176176

@@ -797,8 +797,8 @@ export default class ModalDialog {
797797
const generalStyle = `background-size: 10px; background-repeat: no-repeat; background-image: url(data:image/svg+xml;base64,${window.btoa(minIcon)})`;
798798
const hoverStyle = `background-size: 10px; background-repeat: no-repeat; background-image: url(data:image/svg+xml;base64,${window.btoa(minHoverIcon)})`;
799799
this.minimizeDiv.setAttribute("style", generalStyle);
800-
this.minimizeDiv.setAttribute("onmouseover", `this.style = "${hoverStyle}";`);
801-
this.minimizeDiv.setAttribute("onmouseout", `this.style = "${generalStyle}";`);
800+
this.minimizeDiv.addEventListener("mouseover", (e) => (e.target.style = hoverStyle));
801+
this.minimizeDiv.addEventListener("mouseout", (e) => (e.target.style = generalStyle));
802802

803803
this.restoreModalProperties();
804804

@@ -848,8 +848,8 @@ export default class ModalDialog {
848848
const generalStyle = `background-size: 10px; background-repeat: no-repeat; background-image: url(data:image/svg+xml;base64,${window.btoa(maxIcon)})`;
849849
const hoverStyle = `background-size: 10px; background-repeat: no-repeat; background-image: url(data:image/svg+xml;base64,${window.btoa(maxHoverIcon)})`;
850850
this.minimizeDiv.setAttribute("style", generalStyle);
851-
this.minimizeDiv.setAttribute("onmouseover", `this.style = "${hoverStyle}";`);
852-
this.minimizeDiv.setAttribute("onmouseout", `this.style = "${generalStyle}";`);
851+
this.minimizeDiv.addEventListener("mouseover", (e) => (e.target.style = hoverStyle));
852+
this.minimizeDiv.addEventListener("mouseout", (e) => (e.target.style = generalStyle));
853853
}
854854
}
855855

@@ -881,8 +881,8 @@ export default class ModalDialog {
881881
const generalStyle = `background-size: 10px; background-repeat: no-repeat; background-image: url(data:image/svg+xml;base64,${window.btoa(minIcon)})`;
882882
const hoverStyle = `background-size: 10px; background-repeat: no-repeat; background-image: url(data:image/svg+xml;base64,${window.btoa(minHoverIcon)})`;
883883
this.minimizeDiv.setAttribute("style", generalStyle);
884-
this.minimizeDiv.setAttribute("onmouseover", `this.style = "${hoverStyle}";`);
885-
this.minimizeDiv.setAttribute("onmouseout", `this.style = "${generalStyle}";`);
884+
this.minimizeDiv.addEventListener("mouseover", (e) => (e.target.style = hoverStyle));
885+
this.minimizeDiv.addEventListener("mouseout", (e) => (e.target.style = generalStyle));
886886

887887
// Set size to 80% screen with a max size.
888888
this.setSize(parseInt(window.innerHeight * 0.8, 10), parseInt(window.innerWidth * 0.8, 10));

0 commit comments

Comments
 (0)