Skip to content

Commit 152edd9

Browse files
[JENKINS-73973] Improve CSP compatibility
* extract inline event handlers from ScriptlerBuilder/config.jelly to scriptler.js * extract inline script block from ScriptlerBuilder/config.jelly to scriptler.js Co-authored-by: Basil Crow <me@basilcrow.com>
1 parent 26f3fa5 commit 152edd9

File tree

3 files changed

+50
-28
lines changed

3 files changed

+50
-28
lines changed

src/main/resources/org/jenkinsci/plugins/scriptler/ScriptlerManagement/confirm-remove.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ document.addEventListener("DOMContentLoaded", () => {
22
const removeScriptButtons = document.querySelectorAll(".scriptler-remove-script-form");
33
removeScriptButtons.forEach((button) =>
44
button.addEventListener("click", (e) => {
5-
const name = e.currentTarget.getAttribute("data-name");
5+
const name = e.currentTarget.dataset.name;
66
if (!confirm("Sure you want to delete [" + name + "]?")) {
77
e.preventDefault();
88
}

src/main/resources/org/jenkinsci/plugins/scriptler/builder/ScriptlerBuilder/config.jelly

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33

44
<st:adjunct includes="org.kohsuke.stapler.bind"/>
55
<st:once>
6-
<script type="text/javascript" src="${resURL}/plugin/scriptler/lib/scriptler.js" />
6+
<script id="scriptler-builder-behaviour"
7+
type="text/javascript"
8+
data-root-url="${rootURL}"
9+
data-has-permission="${h.hasPermission(it.build,descriptor.requiredPermission)}"
10+
src="${resURL}/plugin/scriptler/lib/scriptler.js" />
711
</st:once>
812
<j:choose>
913
<j:when test="${empty(descriptor.scripts)}">
@@ -20,7 +24,7 @@
2024
<f:entry title="${%Script}" field="buildStepContent">
2125
<input type="hidden" name="backupJobName" />
2226
<input type="hidden" name="builderId" value="${instance.builderId}" />
23-
<select name="scriptlerScriptId" data-item-url="${it.url}" onChange="scriptler_initDetailLink('${rootURL}', this);scriptler_showParams(this, this.value);" >
27+
<select name="scriptlerScriptId" data-item-url="${it.url}">
2428
<option value="">(Default)</option>
2529
<j:forEach var="inst" items="${descriptor.scripts}" varStatus="loop">
2630
<j:choose>
@@ -33,7 +37,7 @@
3337
</j:choose>
3438
</j:forEach>
3539
</select>
36-
<a target="_blank" name="showScriptlerDetailLink" href="" style="display:none;" onclick="window.open(this.href,'window','width=900,height=640,resizable,scrollbars,toolbar,menubar') ;return false;"> ${%ViewScript}</a>
40+
<a target="_blank" name="showScriptlerDetailLink" href="" style="display:none;"> ${%ViewScript}</a>
3741
<div id="scriptlerDescription">${%RequiredParameters} <div name="scriptlerParameters" /></div>
3842
<f:block>
3943
<f:entry title="${%PropagateParams}" field="propagateParams" help="/plugin/scriptler/help-propagateParams.html">
@@ -62,25 +66,4 @@
6266
</j:otherwise>
6367
</j:choose>
6468
<st:bind var="scriptlerBuilderDesc" value="${descriptor}"/>
65-
<st:once>
66-
<script type="text/javascript">
67-
window.addEventListener('load', function() {
68-
var all = new Array();
69-
all = document.getElementsByName('scriptlerScriptId');
70-
for(var i = 0; i &lt; all.length; i++) {
71-
all.item(i).disabled=${!h.hasPermission(it.build,descriptor.requiredPermission)};
72-
scriptler_initDetailLink('${rootURL}', all.item(i));
73-
scriptler_showParams(all.item(i), all.item(i).value);
74-
}
75-
76-
// remember the job name to send it along with the form
77-
var jobName = document.getElementsByName('name').item(0).value;
78-
var allBackupJobNames = document.getElementsByName('backupJobName');
79-
for(var i = 0; i &lt; allBackupJobNames.length; i++) {
80-
allBackupJobNames.item(i).value = jobName;
81-
}
82-
83-
});
84-
</script>
85-
</st:once>
8669
</j:jelly>

src/main/webapp/lib/scriptler.js

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
function scriptler_initDetailLink(rootURL, referenceTag) {
2-
var itemURL = referenceTag.getAttribute("data-item-url");
1+
function scriptler_initDetailLink(rootUrl, referenceTag) {
2+
var itemUrl = referenceTag.dataset.itemUrl;
33
var selId = referenceTag.value;
44
var all = new Array();
55
all = document.getElementsByName("scriptlerScriptId");
66
for (var i = 0; i < all.length; i++) {
77
if (referenceTag == all.item(i)) {
88
var detailsLinkTag = document.getElementsByName("showScriptlerDetailLink").item(i);
99
if (selId.length != 0) {
10-
detailsLinkTag.href = rootURL + "/" + itemURL + "scriptler/showScript?id=".concat(selId);
10+
detailsLinkTag.href = rootUrl + "/" + itemUrl + "scriptler/showScript?id=".concat(selId);
1111
detailsLinkTag.style.display = "block";
1212
} else {
1313
detailsLinkTag.style.display = "none";
@@ -39,3 +39,42 @@ function scriptler_showParams(referenceTag, scriptId) {
3939
}
4040
});
4141
}
42+
43+
Behaviour.specify("select[name='scriptlerScriptId']", "ScriptlerBuilderSelect", 0, function (element) {
44+
const script = document.querySelector("#scriptler-builder-behaviour");
45+
const rootUrl = script.dataset.rootUrl;
46+
element.addEventListener("change", function (event) {
47+
const target = event.target;
48+
scriptler_initDetailLink(rootUrl, target);
49+
scriptler_showParams(target, target.value);
50+
});
51+
});
52+
53+
Behaviour.specify("a[name='showScriptlerDetailLink']", "ScriptlerBuilderDetailLink", 0, function (element) {
54+
element.addEventListener("click", function (event) {
55+
event.preventDefault();
56+
const target = event.target;
57+
window.open(target.href, "window", "width=900,height=640,resizable,scrollbars,toolbar,menubar");
58+
});
59+
});
60+
61+
document.addEventListener("DOMContentLoaded", function () {
62+
const script = document.querySelector("#scriptler-builder-behaviour");
63+
const rootUrl = script.dataset.rootUrl;
64+
const hasPermission = script.dataset.hasPermission;
65+
66+
var all = new Array();
67+
all = document.getElementsByName("scriptlerScriptId");
68+
for (var i = 0; i < all.length; i++) {
69+
all.item(i).disabled = !hasPermission;
70+
scriptler_initDetailLink(rootUrl, all.item(i));
71+
scriptler_showParams(all.item(i), all.item(i).value);
72+
}
73+
74+
// remember the job name to send it along with the form
75+
var jobName = document.getElementsByName("name").item(0).value;
76+
var allBackupJobNames = document.getElementsByName("backupJobName");
77+
for (var i = 0; i < allBackupJobNames.length; i++) {
78+
allBackupJobNames.item(i).value = jobName;
79+
}
80+
});

0 commit comments

Comments
 (0)