From 0fa6913fbbe95e26a21483d2c46beea39ab54553 Mon Sep 17 00:00:00 2001 From: Luis Serna Date: Thu, 29 May 2025 02:04:57 +0000 Subject: [PATCH 1/3] Caching lenght in loops for support package --- java/src/org/openqa/selenium/support/FindAll.java | 5 +++-- java/src/org/openqa/selenium/support/FindBys.java | 5 +++-- .../openqa/selenium/support/events/EventFiringDecorator.java | 5 +++-- .../org/openqa/selenium/support/pagefactory/ByChained.java | 5 +++-- java/src/org/openqa/selenium/support/ui/Quotes.java | 5 +++-- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/java/src/org/openqa/selenium/support/FindAll.java b/java/src/org/openqa/selenium/support/FindAll.java index fb49995e53625..4942c726faa5c 100644 --- a/java/src/org/openqa/selenium/support/FindAll.java +++ b/java/src/org/openqa/selenium/support/FindAll.java @@ -52,8 +52,9 @@ public By buildIt(Object annotation, Field field) { assertValidFindAll(findBys); FindBy[] findByArray = findBys.value(); - By[] byArray = new By[findByArray.length]; - for (int i = 0; i < findByArray.length; i++) { + int findByArrayLength = findByArray.length; + By[] byArray = new By[findByArrayLength]; + for (int i = 0; i < findByArrayLength; i++) { byArray[i] = buildByFromFindBy(findByArray[i]); } diff --git a/java/src/org/openqa/selenium/support/FindBys.java b/java/src/org/openqa/selenium/support/FindBys.java index 67b54328aee7f..737fcc71476bd 100644 --- a/java/src/org/openqa/selenium/support/FindBys.java +++ b/java/src/org/openqa/selenium/support/FindBys.java @@ -51,8 +51,9 @@ public By buildIt(Object annotation, Field field) { assertValidFindBys(findBys); FindBy[] findByArray = findBys.value(); - By[] byArray = new By[findByArray.length]; - for (int i = 0; i < findByArray.length; i++) { + int findByArrayLength = findByArray.length; + By[] byArray = new By[findByArrayLength]; + for (int i = 0; i < findByArrayLength; i++) { byArray[i] = buildByFromFindBy(findByArray[i]); } diff --git a/java/src/org/openqa/selenium/support/events/EventFiringDecorator.java b/java/src/org/openqa/selenium/support/events/EventFiringDecorator.java index 25b195b1b5068..4871be58ff23d 100644 --- a/java/src/org/openqa/selenium/support/events/EventFiringDecorator.java +++ b/java/src/org/openqa/selenium/support/events/EventFiringDecorator.java @@ -317,10 +317,11 @@ private Method findMatchingMethod(WebDriverListener listener, String methodName, private boolean parametersMatch(Method m, Object[] args) { Class[] params = m.getParameterTypes(); - if (params.length != args.length) { + int parameterCount = params.length; + if (parameterCount != args.length) { return false; } - for (int i = 0; i < params.length; i++) { + for (int i = 0; i < parameterCount; i++) { Class param = params[i]; if (param.isPrimitive()) { if (boolean.class.equals(param)) { diff --git a/java/src/org/openqa/selenium/support/pagefactory/ByChained.java b/java/src/org/openqa/selenium/support/pagefactory/ByChained.java index 2beb51681c1b5..b137a9215ca79 100644 --- a/java/src/org/openqa/selenium/support/pagefactory/ByChained.java +++ b/java/src/org/openqa/selenium/support/pagefactory/ByChained.java @@ -58,12 +58,13 @@ public WebElement findElement(SearchContext context) { @Override public List findElements(SearchContext context) { - if (bys.length == 0) { + int numberOfLocators = bys.length; + if (numberOfLocators == 0) { return new ArrayList<>(); } List elems = bys[0].findElements(context); - for (int i = 1; i < bys.length; i++) { + for (int i = 1; i < numberOfLocators; i++) { if (elems.isEmpty()) { break; // if any one of the bys finds no elements, then return no elements } diff --git a/java/src/org/openqa/selenium/support/ui/Quotes.java b/java/src/org/openqa/selenium/support/ui/Quotes.java index d4ced7e170b10..ef27a617009ce 100644 --- a/java/src/org/openqa/selenium/support/ui/Quotes.java +++ b/java/src/org/openqa/selenium/support/ui/Quotes.java @@ -40,10 +40,11 @@ public static String escape(String toEscape) { String[] substringsWithoutQuotes = toEscape.split("\""); StringBuilder quoted = new StringBuilder("concat("); - for (int i = 0; i < substringsWithoutQuotes.length; i++) { + int substringCount = substringsWithoutQuotes.length; + for (int i = 0; i < substringCount; i++) { quoted.append("\"").append(substringsWithoutQuotes[i]).append("\""); quoted.append( - ((i == substringsWithoutQuotes.length - 1) + ((i == substringCount - 1) ? (quoteIsLast ? ", '\"')" : ")") : ", '\"', ")); } From e5d0816224062dd51075deab8fb001c0df2c885d Mon Sep 17 00:00:00 2001 From: Luis Serna Date: Mon, 2 Jun 2025 21:44:27 +0000 Subject: [PATCH 2/3] Caching size in loops for grid package --- .../org/openqa/selenium/grid/node/docker/DockerOptions.java | 5 +++-- .../org/openqa/selenium/grid/node/relay/RelayOptions.java | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/java/src/org/openqa/selenium/grid/node/docker/DockerOptions.java b/java/src/org/openqa/selenium/grid/node/docker/DockerOptions.java index c714373eeb7af..7082c518342d9 100644 --- a/java/src/org/openqa/selenium/grid/node/docker/DockerOptions.java +++ b/java/src/org/openqa/selenium/grid/node/docker/DockerOptions.java @@ -140,10 +140,11 @@ public Map> getDockerSessionFactories( config.getAll(DOCKER_SECTION, "host-config-keys").orElseGet(Collections::emptyList); Multimap kinds = HashMultimap.create(); - for (int i = 0; i < allConfigs.size(); i++) { + int configsCount = allConfigs.size(); + for (int i = 0; i < configsCount; i++) { String imageName = allConfigs.get(i); i++; - if (i == allConfigs.size()) { + if (i == configsCount) { throw new DockerException("Unable to find JSON config"); } Capabilities stereotype = diff --git a/java/src/org/openqa/selenium/grid/node/relay/RelayOptions.java b/java/src/org/openqa/selenium/grid/node/relay/RelayOptions.java index cc98f23489fea..0f36f1a30c706 100644 --- a/java/src/org/openqa/selenium/grid/node/relay/RelayOptions.java +++ b/java/src/org/openqa/selenium/grid/node/relay/RelayOptions.java @@ -153,7 +153,8 @@ public Map> getSessionFactories( () -> new ConfigException("Unable to find configs for " + getServiceUri())); Multimap parsedConfigs = HashMultimap.create(); - for (int i = 0; i < allConfigs.size(); i++) { + int configsCount = allConfigs.size(); + for (int i = 0; i < configsCount; i++) { int maxSessions; try { maxSessions = Integer.parseInt(extractConfiguredValue(allConfigs.get(i))); @@ -161,7 +162,7 @@ public Map> getSessionFactories( throw new ConfigException("Unable parse value as number. " + allConfigs.get(i)); } i++; - if (i == allConfigs.size()) { + if (i == configsCount) { throw new ConfigException("Unable to find stereotype config. " + allConfigs); } Capabilities stereotype = From 88f9ac162345ddcbfb6ab6689be8fe86d86d5b84 Mon Sep 17 00:00:00 2001 From: Luis Serna Date: Tue, 3 Jun 2025 03:12:21 +0000 Subject: [PATCH 3/3] Caching size in loops for json, remote and tools packages --- java/src/dev/selenium/tools/javadoc/JavadocJarMaker.java | 3 ++- java/src/dev/selenium/tools/modules/ModuleGenerator.java | 3 ++- java/src/org/openqa/selenium/json/JsonInput.java | 3 ++- .../openqa/selenium/remote/WebElementToJsonConverter.java | 5 +++-- .../selenium/remote/codec/AbstractHttpCommandCodec.java | 8 +++++--- java/src/org/openqa/selenium/remote/http/Route.java | 5 +++-- java/src/org/openqa/selenium/remote/http/UrlTemplate.java | 5 +++-- 7 files changed, 20 insertions(+), 12 deletions(-) diff --git a/java/src/dev/selenium/tools/javadoc/JavadocJarMaker.java b/java/src/dev/selenium/tools/javadoc/JavadocJarMaker.java index acd54bd148534..91f9f834ddd89 100644 --- a/java/src/dev/selenium/tools/javadoc/JavadocJarMaker.java +++ b/java/src/dev/selenium/tools/javadoc/JavadocJarMaker.java @@ -55,7 +55,8 @@ public static void main(String[] args) throws IOException { Path out = null; Set classpath = new HashSet<>(); - for (int i = 0; i < args.length; i++) { + int argCount = args.length; + for (int i = 0; i < argCount; i++) { String flag = args[i]; String next = args[++i]; diff --git a/java/src/dev/selenium/tools/modules/ModuleGenerator.java b/java/src/dev/selenium/tools/modules/ModuleGenerator.java index 409d233eb2e9e..4fb1091482f7b 100644 --- a/java/src/dev/selenium/tools/modules/ModuleGenerator.java +++ b/java/src/dev/selenium/tools/modules/ModuleGenerator.java @@ -108,7 +108,8 @@ public static void main(String[] args) throws IOException { Set openTo = new TreeSet<>(); boolean isOpen = false; - for (int i = 0; i < args.length; i++) { + int argCount = args.length; + for (int i = 0; i < argCount; i++) { String flag = args[i]; String next = args[++i]; switch (flag) { diff --git a/java/src/org/openqa/selenium/json/JsonInput.java b/java/src/org/openqa/selenium/json/JsonInput.java index c116a24b3d9c6..73c75a6368b30 100644 --- a/java/src/org/openqa/selenium/json/JsonInput.java +++ b/java/src/org/openqa/selenium/json/JsonInput.java @@ -507,7 +507,8 @@ private void expect(JsonType type) { private X read(String toCompare, Function mapper) { skipWhitespace(input); - for (int i = 0; i < toCompare.length(); i++) { + int toCompareLength = toCompare.length(); + for (int i = 0; i < toCompareLength; i++) { char read = input.read(); if (read != toCompare.charAt(i)) { throw new JsonException( diff --git a/java/src/org/openqa/selenium/remote/WebElementToJsonConverter.java b/java/src/org/openqa/selenium/remote/WebElementToJsonConverter.java index edb4c9a28d9cb..990da0f3c10ed 100644 --- a/java/src/org/openqa/selenium/remote/WebElementToJsonConverter.java +++ b/java/src/org/openqa/selenium/remote/WebElementToJsonConverter.java @@ -84,8 +84,9 @@ public Object apply(Object arg) { } private static List arrayToList(Object array) { - List list = new ArrayList<>(); - for (int i = 0; i < Array.getLength(array); i++) { + int arrayLength = Array.getLength(array); + List list = new ArrayList<>(arrayLength); + for (int i = 0; i < arrayLength; i++) { list.add(Array.get(array, i)); } return list; diff --git a/java/src/org/openqa/selenium/remote/codec/AbstractHttpCommandCodec.java b/java/src/org/openqa/selenium/remote/codec/AbstractHttpCommandCodec.java index df6318a11ed14..c7f12bd347d7e 100644 --- a/java/src/org/openqa/selenium/remote/codec/AbstractHttpCommandCodec.java +++ b/java/src/org/openqa/selenium/remote/codec/AbstractHttpCommandCodec.java @@ -387,11 +387,12 @@ boolean isFor(HttpMethod method, List parts) { return false; } - if (parts.size() != this.pathSegments.size()) { + int pathSegmentCount = parts.size(); + if (pathSegmentCount != this.pathSegments.size()) { return false; } - for (int i = 0; i < parts.size(); ++i) { + for (int i = 0; i < pathSegmentCount; ++i) { String reqPart = parts.get(i); String specPart = pathSegments.get(i); if (!(specPart.startsWith(":") || specPart.equals(reqPart))) { @@ -403,7 +404,8 @@ boolean isFor(HttpMethod method, List parts) { } void parsePathParameters(List parts, Map parameters) { - for (int i = 0; i < parts.size(); ++i) { + int pathSegmentCount = parts.size(); + for (int i = 0; i < pathSegmentCount; ++i) { if (pathSegments.get(i).startsWith(":")) { parameters.put(pathSegments.get(i).substring(1), parts.get(i)); } diff --git a/java/src/org/openqa/selenium/remote/http/Route.java b/java/src/org/openqa/selenium/remote/http/Route.java index 047ed4247e7f8..d65f175ef8027 100644 --- a/java/src/org/openqa/selenium/remote/http/Route.java +++ b/java/src/org/openqa/selenium/remote/http/Route.java @@ -254,10 +254,11 @@ public boolean matches(HttpRequest request) { private boolean hasPrefix(HttpRequest request) { String[] parts = request.getUri().split("/"); - if (parts.length < prefixPaths.length) { + int prefixPathCount = prefixPaths.length; + if (parts.length < prefixPathCount) { return false; } - for (int i = 0; i < prefixPaths.length; i++) { + for (int i = 0; i < prefixPathCount; i++) { if (!prefixPaths[i].equals(parts[i])) { return false; } diff --git a/java/src/org/openqa/selenium/remote/http/UrlTemplate.java b/java/src/org/openqa/selenium/remote/http/UrlTemplate.java index c0d6d583cf7c5..add8f4b6b2e54 100644 --- a/java/src/org/openqa/selenium/remote/http/UrlTemplate.java +++ b/java/src/org/openqa/selenium/remote/http/UrlTemplate.java @@ -69,7 +69,8 @@ public UrlTemplate(String template) { List allGroups = List.copyOf(groups); // do we hit a fast path? - switch (allGroups.size()) { + int groupCount = allGroups.size(); + switch (groupCount) { case 0: // no groups, just .equals this.compiled = (matchAgainst) -> { @@ -119,7 +120,7 @@ public UrlTemplate(String template) { } Map params = new LinkedHashMap<>(); - for (int i = 0; i < allGroups.size(); i++) { + for (int i = 0; i < groupCount; i++) { params.put(allGroups.get(i), matcher.group(i + 1)); }