From 0913f0cad1ff81c37a671bc726d219e2eb17d225 Mon Sep 17 00:00:00 2001 From: labkey-tchad Date: Mon, 10 Aug 2026 11:49:57 -0700 Subject: [PATCH 1/2] Fix fieldKey encoding for CustomizeView column picker --- .../labkey/test/components/CustomizeView.java | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/org/labkey/test/components/CustomizeView.java b/src/org/labkey/test/components/CustomizeView.java index acde972e66..e83afe2be2 100644 --- a/src/org/labkey/test/components/CustomizeView.java +++ b/src/org/labkey/test/components/CustomizeView.java @@ -31,7 +31,6 @@ import org.labkey.test.params.FieldKey; import org.labkey.test.selenium.RefindingWebElement; import org.labkey.test.util.DataRegionTable; -import org.labkey.test.util.EscapeUtil; import org.labkey.test.util.Ext4Helper; import org.labkey.test.util.LogMethod; import org.labkey.test.util.LoggedParam; @@ -45,9 +44,14 @@ import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.support.ui.ExpectedConditions; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static org.labkey.test.components.ext4.Checkbox.Ext4Checkbox; import static org.labkey.test.components.ext4.RadioButton.RadioButton; @@ -336,18 +340,16 @@ public enum ViewItemType Sort } - private String encodeFieldKeyPart(String fieldKeyPart) + // match Ext.htmlEncode (https://cdn.sencha.com/ext/gpl/4.2.1/docs/#!/api/Ext-method-htmlEncode) + private static final Map extHtmlEncode = Stream.of("&", "<", ">", "'", "\"") + .collect(Collectors.toMap(c -> c, c -> URLEncoder.encode(c, StandardCharsets.UTF_8))); + private static String extHtmlEncode(String fieldKeyPart) { - String _fieldKeyPart = EscapeUtil.encodeUriPath(fieldKeyPart); - if (_fieldKeyPart != null) + for (Map.Entry entry : extHtmlEncode.entrySet()) { - // Jetty encodes # ? ; ' but we want to preserve these characters in paths - _fieldKeyPart = _fieldKeyPart.replaceAll("%23", "#"); - _fieldKeyPart = _fieldKeyPart.replaceAll("%3F", "?"); - _fieldKeyPart = _fieldKeyPart.replaceAll("%3B", ";"); - _fieldKeyPart = _fieldKeyPart.replaceAll("%27", "'"); + fieldKeyPart = fieldKeyPart.replace(entry.getKey(), entry.getValue()); } - return _fieldKeyPart; + return fieldKeyPart; } /** @@ -358,7 +360,7 @@ private WebElement expandPivots(CharSequence fieldKey) { Iterator fieldKeyIterator = Objects.requireNonNull(FieldKey.fromFieldKey(fieldKey), "Invalid fieldKey: " + fieldKey).getIterator(); FieldKey currentFieldKey = fieldKeyIterator.next(); - String dataRecordId = encodeFieldKeyPart(currentFieldKey.toString().toUpperCase()); + String dataRecordId = extHtmlEncode(currentFieldKey.toString().toUpperCase()); while (fieldKeyIterator.hasNext()) { @@ -375,7 +377,7 @@ private WebElement expandPivots(CharSequence fieldKey) WebDriverWrapper.waitFor(() -> Locator.css("tr[data-recordid] + tr:not(.x4-grid-row)").findElements(getComponentElement()).isEmpty(), 2000); // Spacer row appears during expansion animation currentFieldKey = fieldKeyIterator.next(); - dataRecordId = encodeFieldKeyPart(currentFieldKey.toString().toUpperCase()); + dataRecordId = extHtmlEncode(currentFieldKey.toString().toUpperCase()); } return Locator.tag("tr").withClass("x4-grid-data-row").withAttribute("data-recordid", dataRecordId).findElement(getComponentElement()); From e01e1f665e55ca7a529c9ac6f49c1c3a2d5aa51f Mon Sep 17 00:00:00 2001 From: labkey-tchad Date: Mon, 10 Aug 2026 17:16:39 -0700 Subject: [PATCH 2/2] Match product encoding. --- .../labkey/test/components/CustomizeView.java | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/org/labkey/test/components/CustomizeView.java b/src/org/labkey/test/components/CustomizeView.java index e83afe2be2..cbf0caafa0 100644 --- a/src/org/labkey/test/components/CustomizeView.java +++ b/src/org/labkey/test/components/CustomizeView.java @@ -44,14 +44,9 @@ import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.support.ui.ExpectedConditions; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; import java.util.Iterator; import java.util.List; -import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; -import java.util.stream.Stream; import static org.labkey.test.components.ext4.Checkbox.Ext4Checkbox; import static org.labkey.test.components.ext4.RadioButton.RadioButton; @@ -340,16 +335,9 @@ public enum ViewItemType Sort } - // match Ext.htmlEncode (https://cdn.sencha.com/ext/gpl/4.2.1/docs/#!/api/Ext-method-htmlEncode) - private static final Map extHtmlEncode = Stream.of("&", "<", ">", "'", "\"") - .collect(Collectors.toMap(c -> c, c -> URLEncoder.encode(c, StandardCharsets.UTF_8))); - private static String extHtmlEncode(String fieldKeyPart) + private String extHtmlEncode(String fieldKeyPart) { - for (Map.Entry entry : extHtmlEncode.entrySet()) - { - fieldKeyPart = fieldKeyPart.replace(entry.getKey(), entry.getValue()); - } - return fieldKeyPart; + return getWrapper().executeScript("return encodeURI(arguments[0]);", String.class, fieldKeyPart); } /**