Skip to content

Commit 2b1ec08

Browse files
basilolamy
andauthored
[JENKINS-74011] Extract JavaScript block in PageStatePreloadDecorator/header.jelly (#2588)
Co-authored-by: Olivier Lamy <[email protected]>
1 parent dc84be9 commit 2b1ec08

File tree

4 files changed

+53
-53
lines changed

4 files changed

+53
-53
lines changed

blueocean-pipeline-api-impl/src/test/java/io/jenkins/blueocean/preload/FavoriteListStatePreloaderTest.java

+7-12
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,12 @@
1616
import org.junit.Before;
1717
import org.junit.Rule;
1818
import org.junit.Test;
19+
import net.sf.json.JSONArray;
20+
import net.sf.json.JSONObject;
1921

20-
import java.util.Arrays;
2122
import java.util.Map;
22-
import java.util.Optional;
23-
import java.util.regex.Matcher;
24-
import java.util.regex.Pattern;
2523

2624
import static org.junit.Assert.assertEquals;
27-
import static org.junit.Assert.fail;
2825

2926
public class FavoriteListStatePreloaderTest extends PipelineBaseTest {
3027

@@ -66,15 +63,13 @@ public void simpleTest() throws Exception {
6663
.asString();
6764

6865
Document doc = Jsoup.parse(response.getBody());
69-
String script = doc.select("head script").toString();
70-
Optional<String> preloadLine = Arrays.stream(script.split("\n")).filter(s -> s.trim().startsWith("setState('favoritesList'")).findFirst();
71-
if (!preloadLine.isPresent()) fail("preloadLine missing in page");
66+
String script = doc.select("head script#blueocean-page-state-preload-decorator-data").html().toString();
67+
JSONObject json = JSONObject.fromObject(script);
7268

73-
Pattern pa = Pattern.compile("^\\s*setState\\('favoritesList',\\s*(.*)\\);$");
74-
final Matcher matcher = pa.matcher(preloadLine.get());
75-
if (!matcher.find()) fail("invalid preload line: " + preloadLine.get());
69+
Assert.assertTrue(json.containsKey("favoritesList"));
70+
JSONArray favoritesList = json.getJSONArray("favoritesList");
7671

77-
final String data = matcher.group(1);
72+
final String data = favoritesList.toString();
7873
Assert.assertTrue("master branch not include or not primary", data.contains("{\"name\":\"p-master/master\",\"primary\":true}"));
7974
Assert.assertTrue("feature2 branch not include or primary", data.contains("{\"name\":\"p-master/feature2\",\"primary\":false}"));
8075
Assert.assertTrue("feature4 branch not include or primary", data.contains("{\"name\":\"p-master/feature4\",\"primary\":false}"));

blueocean-pipeline-api-impl/src/test/java/io/jenkins/blueocean/preload/StatePreloaderTest.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.junit.Assert;
3333
import org.junit.Test;
3434
import org.xml.sax.SAXException;
35+
import net.sf.json.JSONObject;
3536

3637
import java.io.IOException;
3738
import java.util.concurrent.ExecutionException;
@@ -55,10 +56,11 @@ public void test() throws IOException, ExecutionException, InterruptedException,
5556
BlueOceanUrlMapper mapper = BlueOceanUrlMapper.all().get(0);
5657
String projectBlueUrl = j.jenkins.getRootUrl() + mapper.getUrl(freestyleProject);
5758
Document doc = Jsoup.connect(projectBlueUrl + "/activity/").get();
58-
String script = doc.select("head script").toString();
59+
String script = doc.select("head script#blueocean-page-state-preload-decorator-data").html().toString();
60+
JSONObject json = JSONObject.fromObject(script);
5961

60-
Assert.assertTrue(script.contains(String.format("setState('prefetchdata.%s',", PipelineStatePreloader.class.getSimpleName())));
61-
Assert.assertTrue(script.contains(String.format("setState('prefetchdata.%s',", PipelineActivityStatePreloader.class.getSimpleName())));
62+
Assert.assertTrue(json.containsKey(String.format("prefetchdata.%s", PipelineStatePreloader.class.getSimpleName())));
63+
Assert.assertTrue(json.containsKey(String.format("prefetchdata.%s", PipelineActivityStatePreloader.class.getSimpleName())));
6264
Assert.assertTrue(script.contains("\"restUrl\":\"/blue/rest/organizations/jenkins/pipelines/freestyle/runs/?start=0&limit=26\""));
6365
}
6466
}
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,13 @@
11
<?jelly escape-by-default='false'?>
22
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler">
3-
<script>//&lt;![CDATA[
4-
// construct the state object parent path inside window.$blueocean.
5-
var stateRoot = window.$blueocean = (window.$blueocean || {});
6-
(function () {
7-
function setState(statePropertyPath, state) {
8-
var pathTokens = statePropertyPath.split('.');
9-
var contextObj = stateRoot;
10-
11-
// Basically an Array shift
12-
function nextToken() {
13-
var nextToken = pathTokens[0];
14-
pathTokens = pathTokens.slice(1);
15-
return nextToken;
16-
}
17-
18-
var pathToken = nextToken();
19-
20-
// Construct up to, but not including, the last point in the graph.
21-
while (pathTokens.length !== 0) {
22-
if (!contextObj[pathToken]) {
23-
contextObj[pathToken] = {};
24-
}
25-
contextObj = contextObj[pathToken];
26-
pathToken = nextToken();
27-
}
28-
// And set the state on the last object on the graph.
29-
contextObj[pathToken] = state;
30-
}
31-
32-
<j:forEach var="preloader" items="${it.pageStatePreloaders}">
33-
// State Preloader: ${preloader.class.name}
34-
<j:set var="stateJson" value="${preloader.stateJson}"/>
35-
<j:if test="${stateJson != null}">
36-
setState('${preloader.statePropertyPath}', ${stateJson});
37-
</j:if>
38-
</j:forEach>
39-
})();
40-
//]]&gt;
3+
<script id="blueocean-page-state-preload-decorator-data" type="application/json">
4+
{<j:forEach var="preloader" items="${it.pageStatePreloaders}" varStatus="st">
5+
<!-- State Preloader: ${preloader.class.name} -->
6+
<j:set var="stateJson" value="${preloader.stateJson}"/>
7+
<j:if test="${stateJson != null}">
8+
"${preloader.statePropertyPath}": ${stateJson}<j:if test="${!st.last}">,</j:if>
9+
</j:if>
10+
</j:forEach>}
4111
</script>
12+
<st:adjunct includes="io.jenkins.blueocean.PageStatePreloadDecorator.preloader"/>
4213
</j:jelly>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// construct the state object parent path inside window.$blueocean.
2+
var stateRoot = window.$blueocean = (window.$blueocean || {});
3+
(function () {
4+
function setState(statePropertyPath, state) {
5+
var pathTokens = statePropertyPath.split('.');
6+
var contextObj = stateRoot;
7+
8+
// Basically an Array shift
9+
function nextToken() {
10+
var nextToken = pathTokens[0];
11+
pathTokens = pathTokens.slice(1);
12+
return nextToken;
13+
}
14+
15+
var pathToken = nextToken();
16+
17+
// Construct up to, but not including, the last point in the graph.
18+
while (pathTokens.length !== 0) {
19+
if (!contextObj[pathToken]) {
20+
contextObj[pathToken] = {};
21+
}
22+
contextObj = contextObj[pathToken];
23+
pathToken = nextToken();
24+
}
25+
// And set the state on the last object on the graph.
26+
contextObj[pathToken] = state;
27+
}
28+
const data = JSON.parse(document.getElementById('blueocean-page-state-preload-decorator-data').textContent);
29+
for (const [key, value] of Object.entries(data)) {
30+
setState(key, value);
31+
}
32+
})();

0 commit comments

Comments
 (0)