diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml
index 3536fd3b400..727f68f0e25 100644
--- a/.github/workflows/scorecard.yml
+++ b/.github/workflows/scorecard.yml
@@ -37,7 +37,7 @@ jobs:
persist-credentials: false
- name: "Run analysis"
- uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1
+ uses: ossf/scorecard-action@05b42c624433fc40578a4040d5cf5e36ddca8cde # v2.4.2
with:
results_file: results.sarif
results_format: sarif
diff --git a/README.md b/README.md
index aa727ffb546..48d08ef152c 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# 
-Version 4.14.0 / July 30, 2025
+Version 4.15.0 / August 17, 2025
:heart: [Sponsor](https://github.com/sponsors/rbri)
@@ -61,7 +61,7 @@ Add to your `pom.xml`:
org.htmlunit
htmlunit
- 4.14.0
+ 4.15.0
```
@@ -70,7 +70,7 @@ Add to your `pom.xml`:
Add to your `build.gradle`:
```groovy
-implementation group: 'org.htmlunit', name: 'htmlunit', version: '4.14.0'
+implementation group: 'org.htmlunit', name: 'htmlunit', version: '4.15.0'
```
## Getting Started
diff --git a/pom.xml b/pom.xml
index 0f9ed14a8e9..1cbf8b0991e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
org.htmlunit
htmlunit
- 4.14.0
+ 4.15.0
jar
HtmlUnit
@@ -27,12 +27,12 @@
8
8
- 4.14.0
- 4.14.0
- 4.14.0
- 4.14.0
- 4.14.0
- 4.14.0
+ 4.15.0
+ 4.15.0
+ 4.15.0
+ 4.15.0
+ 4.15.0
+ 4.15.0
4.5.14
3.18.0
@@ -49,7 +49,7 @@
5.13.4
1.13.4
2.3.0
- 9.4.57.v20241219
+ 9.4.58.v20250814
4.0.66
2.25.1
2.0.17
@@ -74,6 +74,7 @@
3.6.1
2.12.1
3.4.2
+ 3.11.3
2.9.1
@@ -221,7 +222,7 @@
org.apache.maven.plugins
maven-javadoc-plugin
- 3.11.2
+ ${javadoc-plugin.version}
true
protected
@@ -757,7 +758,7 @@
org.apache.maven.plugins
maven-javadoc-plugin
- 3.11.2
+ ${javadoc-plugin.version}
true
protected
@@ -934,6 +935,7 @@
Barnaby Court
+ BarnabyCourt@users.sourceforge.net
Andreas Hangler
@@ -961,6 +963,7 @@
Mike Gallaher
+ gallaherm@pragmatics.com
Dierk Koenig
@@ -973,6 +976,7 @@
Chris Eldredge
+ chriseldredge@comcast.net
Hans Donner
@@ -982,6 +986,7 @@
George Murnock
+ george@murnock.com
Kent Tong
@@ -1015,6 +1020,7 @@
Mark van Leeuwen
+ https://sourceforge.net/users/marlee/
Brad Murray
@@ -1078,6 +1084,7 @@
Mike Dirolf
+ mike@10gen.com
Mirko Friedenhagen
@@ -1278,6 +1285,26 @@
Christoph Burgmer
+
+ Tom Anderson
+ tom.anderson@univ.oxon.org
+
+
+ Knut Johannes Dahle
+ knut.johannes.dahle@gmail.com
+
+
+ Alexei Goussev
+ gousseff@netscape.net
+
+
+ Nick Kralevich
+ nnk@google.com
+
+
+ Marcos Vinicius B. de Souza
+ marvin.java@gmail.com
+
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index b513b1bf097..c0bf4ec15fb 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -7,6 +7,61 @@
+
+
+ WebAssert messages reviewed and improved.
+
+
+ WebAssert got various improvements and more complete unit tests.
+
+
+ Improve WebAssert javadoc.
+
+
+ Improve WebClientOptions javadoc.
+
+
+ neko: improved features/properties documentation
+
+
+ neko: fix missing property/feature handling for HTMLScanner.setFeature() and HTMLScanner.setProperty().
+
+
+ core-js: Fix two more regressions from the Interpreter refactoring. Various combinations
+ of apply/bind/call now working again.
+
+
+ websocket-client: jetty updated to 9.4.58.v20250814.
+
+
+ core-js: Fix a regression regarding optional chaining operators.
+
+
+ neko: Always call detectEncoding() to skip bom in case we got an input stream with bom and an encoding.
+
+
+ neko: increase PlaybackInputStream buffer size
+
+
+ neko: NekoSAXParser Factory added
+
+
+ WebClient option pageRefreshLimit added. Refresh handling changed to support a clear limit.
+ The initial value is 72 to be backward compatible.
+
+
+ Dummy impl of PointerEvent#getPersistentDeviceId() returning always 0.
+
+
+ The parser for the refresh header has been rewritten.
+ Thanks to a series of additional tests, we are now much closer to real browsers.
+
+
+ core-js: TypedArray.from and TypedArray.of implemented.
+
+
+
+
New sister project 'jsoup-bridge' (https://github.com/HtmlUnit/htmlunit?tab=readme-ov-file#jsoup-bridge).
@@ -14,8 +69,12 @@
Switched to sonatype central-publishing for snapshots and release builds.
+
+ New method WebClinet.waitForBackgroundJavaScriptStartingBefore(final long delayMillis, final long timeoutMillis)
+ that combines a overall timeout with witing for js tasks starting before.
+
- Avoid ConcurrentModificationException if HtmlPage.deregisterFramesIfNeeded()
+ Avoid ConcurrentModificationException in HtmlPage.deregisterFramesIfNeeded()
Separate developer docu to help peoples to start working on this project
diff --git a/src/main/java/org/htmlunit/AlertHandler.java b/src/main/java/org/htmlunit/AlertHandler.java
index d8b768a0f6c..8433308f7ad 100644
--- a/src/main/java/org/htmlunit/AlertHandler.java
+++ b/src/main/java/org/htmlunit/AlertHandler.java
@@ -20,7 +20,7 @@
* A handler for JavaScript alerts. Alerts are triggered when the JavaScript method Window.alert()
* is called.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Ronald Brill
*/
@FunctionalInterface
diff --git a/src/main/java/org/htmlunit/BrowserVersion.java b/src/main/java/org/htmlunit/BrowserVersion.java
index d37b66c972b..cedc47bde48 100644
--- a/src/main/java/org/htmlunit/BrowserVersion.java
+++ b/src/main/java/org/htmlunit/BrowserVersion.java
@@ -53,7 +53,7 @@
* outside is changed. This is more or less the same you can do with real browsers installing
* plugins like UserAgentSwitcher.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Daniel Gredler
* @author Marc Guillemot
* @author Chris Erskine
@@ -65,7 +65,7 @@
public final class BrowserVersion implements Serializable {
/** Latest Firefox. */
- public static final BrowserVersion FIREFOX = new BrowserVersion(140, "FF");
+ public static final BrowserVersion FIREFOX = new BrowserVersion(141, "FF");
private static final int FIREFOX_ESR_NUMERIC = 128;
@@ -73,10 +73,10 @@ public final class BrowserVersion implements Serializable {
public static final BrowserVersion FIREFOX_ESR = new BrowserVersion(FIREFOX_ESR_NUMERIC, "FF-ESR");
/** Latest Edge. */
- public static final BrowserVersion EDGE = new BrowserVersion(138, "Edge");
+ public static final BrowserVersion EDGE = new BrowserVersion(139, "Edge");
/** Latest Chrome. */
- public static final BrowserVersion CHROME = new BrowserVersion(138, "Chrome");
+ public static final BrowserVersion CHROME = new BrowserVersion(139, "Chrome");
/**
* Array with all supported browsers.
@@ -224,9 +224,16 @@ public final class BrowserVersion implements Serializable {
+ CHROME.getBrowserVersionNumeric() + "\", \"Not/A)Brand\";v=\"24\"";
*/
// 138
+ /*
CHROME.secClientHintUserAgentHeader_ = "\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\""
+ CHROME.getBrowserVersionNumeric() + "\", \"Google Chrome\";v=\""
+ CHROME.getBrowserVersionNumeric() + "\"";
+ */
+
+ // 139
+ CHROME.secClientHintUserAgentHeader_ = "\"Not;A=Brand\";v=\"99\", \"Google Chrome\";v=\""
+ + CHROME.getBrowserVersionNumeric() + "\", \"Chromium\";v=\""
+ + CHROME.getBrowserVersionNumeric() + "\"";
CHROME.fontHeights_ = new int[] {
0, 1, 2, 4, 5, 5, 6, 8, 9, 10, 11, 12, 15, 16, 16, 17, 18, 20, 21, 22, 23, 25, 26, 26,
@@ -299,9 +306,15 @@ public final class BrowserVersion implements Serializable {
*/
// 138
+ /*
EDGE.secClientHintUserAgentHeader_ = "\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\""
+ EDGE.getBrowserVersionNumeric() + "\", \"Microsoft Edge\";v=\""
+ EDGE.getBrowserVersionNumeric() + "\"";
+ */
+ // 139
+ EDGE.secClientHintUserAgentHeader_ = "\"Not;A=Brand\";v=\"99\", \"Microsoft Edge\";v=\""
+ + EDGE.getBrowserVersionNumeric() + "\", \"Chromium\";v=\""
+ + EDGE.getBrowserVersionNumeric() + "\"";
EDGE.fontHeights_ = new int[] {
0, 1, 2, 4, 5, 5, 6, 8, 9, 10, 11, 12, 15, 16, 16, 17, 18, 20, 21, 22, 23, 25, 26, 26,
diff --git a/src/main/java/org/htmlunit/CollectingAlertHandler.java b/src/main/java/org/htmlunit/CollectingAlertHandler.java
index 76ca4d2aae2..d13553931c7 100644
--- a/src/main/java/org/htmlunit/CollectingAlertHandler.java
+++ b/src/main/java/org/htmlunit/CollectingAlertHandler.java
@@ -21,7 +21,7 @@
/**
* A simple alert handler that keeps track of alerts in a list.
*
- * @author Mike Bowler
+ * @author Mike Bowler
*/
public class CollectingAlertHandler implements AlertHandler, Serializable {
diff --git a/src/main/java/org/htmlunit/ConfirmHandler.java b/src/main/java/org/htmlunit/ConfirmHandler.java
index 1502869f3e2..640506d2483 100644
--- a/src/main/java/org/htmlunit/ConfirmHandler.java
+++ b/src/main/java/org/htmlunit/ConfirmHandler.java
@@ -20,7 +20,7 @@
* A handler for the JavaScript function window.confirm()
. Confirms
* are triggered when the JavaScript function window.confirm()
is invoked.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Ronald Brill
*/
@FunctionalInterface
diff --git a/src/main/java/org/htmlunit/DefaultPageCreator.java b/src/main/java/org/htmlunit/DefaultPageCreator.java
index 85aff6db4ca..ea3bcc5f3e2 100644
--- a/src/main/java/org/htmlunit/DefaultPageCreator.java
+++ b/src/main/java/org/htmlunit/DefaultPageCreator.java
@@ -69,9 +69,9 @@
*
*
*
- * @author Mike Bowler
- * @author Christian Sell
- * @author Brad Clarke
+ * @author Mike Bowler
+ * @author Christian Sell
+ * @author Brad Clarke
* @author Marc Guillemot
* @author Ahmed Ashour
* @author Daniel Gredler
diff --git a/src/main/java/org/htmlunit/ElementNotFoundException.java b/src/main/java/org/htmlunit/ElementNotFoundException.java
index 3f178ad5159..c59dfcec5fe 100644
--- a/src/main/java/org/htmlunit/ElementNotFoundException.java
+++ b/src/main/java/org/htmlunit/ElementNotFoundException.java
@@ -17,7 +17,7 @@
/**
* An exception that is thrown when a specified XML element cannot be found in the DOM model.
*
- * @author Mike Bowler
+ * @author Mike Bowler
*/
public class ElementNotFoundException extends RuntimeException {
diff --git a/src/main/java/org/htmlunit/FailingHttpStatusCodeException.java b/src/main/java/org/htmlunit/FailingHttpStatusCodeException.java
index 98b652d6803..a262ab37845 100644
--- a/src/main/java/org/htmlunit/FailingHttpStatusCodeException.java
+++ b/src/main/java/org/htmlunit/FailingHttpStatusCodeException.java
@@ -19,7 +19,7 @@
/**
* An exception that is thrown when the server returns a failing status code.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Marc Guillemot
*/
public class FailingHttpStatusCodeException extends RuntimeException {
diff --git a/src/main/java/org/htmlunit/HttpMethod.java b/src/main/java/org/htmlunit/HttpMethod.java
index 36002469782..9c11e71cb1a 100644
--- a/src/main/java/org/htmlunit/HttpMethod.java
+++ b/src/main/java/org/htmlunit/HttpMethod.java
@@ -20,7 +20,7 @@
* @see RFC2616
* @see RFC5789
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Ahmed Ashour
* @author Marc Guillemot
*/
diff --git a/src/main/java/org/htmlunit/HttpWebConnection.java b/src/main/java/org/htmlunit/HttpWebConnection.java
index a5304245782..f2b2420d723 100644
--- a/src/main/java/org/htmlunit/HttpWebConnection.java
+++ b/src/main/java/org/htmlunit/HttpWebConnection.java
@@ -117,7 +117,7 @@
/**
* Default implementation of {@link WebConnection}, using the HttpClient library to perform HTTP requests.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Noboru Sinohara
* @author David D. Kilzer
* @author Marc Guillemot
diff --git a/src/main/java/org/htmlunit/ImmediateRefreshHandler.java b/src/main/java/org/htmlunit/ImmediateRefreshHandler.java
index de10d5746cd..ecd307efa6d 100644
--- a/src/main/java/org/htmlunit/ImmediateRefreshHandler.java
+++ b/src/main/java/org/htmlunit/ImmediateRefreshHandler.java
@@ -25,7 +25,7 @@
* If you want a refresh handler that does not ignore the wait time,
* see {@link ThreadedRefreshHandler}.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Daniel Gredler
* @author Marc Guillemot
* @author Ahmed Ashour
diff --git a/src/main/java/org/htmlunit/MockWebConnection.java b/src/main/java/org/htmlunit/MockWebConnection.java
index 4e28befb684..ffec2ea38cd 100644
--- a/src/main/java/org/htmlunit/MockWebConnection.java
+++ b/src/main/java/org/htmlunit/MockWebConnection.java
@@ -33,7 +33,7 @@
/**
* A fake {@link WebConnection} designed to mock out the actual HTTP connections.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Noboru Sinohara
* @author Marc Guillemot
* @author Brad Clarke
diff --git a/src/main/java/org/htmlunit/ObjectInstantiationException.java b/src/main/java/org/htmlunit/ObjectInstantiationException.java
index 4645bcfeafb..321cfb4c18f 100644
--- a/src/main/java/org/htmlunit/ObjectInstantiationException.java
+++ b/src/main/java/org/htmlunit/ObjectInstantiationException.java
@@ -17,7 +17,7 @@
/**
* Thrown if an object could not be instantiated for some reason.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Ahmed Ashour
*/
public class ObjectInstantiationException extends RuntimeException {
diff --git a/src/main/java/org/htmlunit/Page.java b/src/main/java/org/htmlunit/Page.java
index e721620594d..9ada5d339bd 100644
--- a/src/main/java/org/htmlunit/Page.java
+++ b/src/main/java/org/htmlunit/Page.java
@@ -21,7 +21,7 @@
/**
* An abstract page that represents some content returned from a server.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
* @author Marc Guillemot
* @author Ronald Brill
diff --git a/src/main/java/org/htmlunit/PageCreator.java b/src/main/java/org/htmlunit/PageCreator.java
index d774a5fb750..15890b2b8a2 100644
--- a/src/main/java/org/htmlunit/PageCreator.java
+++ b/src/main/java/org/htmlunit/PageCreator.java
@@ -24,8 +24,8 @@
* and the page, usually by calling {@link WebWindow#setEnclosedPage(Page)}. This should
* be done as early as possible, e.g. to allow for re-loading of pages during page parsing.
*
- * @author Mike Bowler
- * @author Christian Sell
+ * @author Mike Bowler
+ * @author Christian Sell
*/
public interface PageCreator {
diff --git a/src/main/java/org/htmlunit/PromptHandler.java b/src/main/java/org/htmlunit/PromptHandler.java
index 484aa3cc45b..0511e013edb 100644
--- a/src/main/java/org/htmlunit/PromptHandler.java
+++ b/src/main/java/org/htmlunit/PromptHandler.java
@@ -20,7 +20,7 @@
* A handler for JavaScript window.prompt(). Prompts are triggered when the JavaScript
* method Window.prompt() is called.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Ahmed Ashour
* @author Ronald Brill
*/
diff --git a/src/main/java/org/htmlunit/RefreshHandler.java b/src/main/java/org/htmlunit/RefreshHandler.java
index aec83a4600b..2f97e986ef9 100644
--- a/src/main/java/org/htmlunit/RefreshHandler.java
+++ b/src/main/java/org/htmlunit/RefreshHandler.java
@@ -20,7 +20,7 @@
/**
* A handler for page refreshes. A refresh can be triggered by a response header or a meta tag.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Daniel Gredler
*/
public interface RefreshHandler {
diff --git a/src/main/java/org/htmlunit/Screen.java b/src/main/java/org/htmlunit/Screen.java
index 739c5131858..9dbb305680b 100644
--- a/src/main/java/org/htmlunit/Screen.java
+++ b/src/main/java/org/htmlunit/Screen.java
@@ -19,7 +19,7 @@
/**
* {@code Screen}.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Daniel Gredler
* @author Chris Erskine
* @author Ronald Brill
diff --git a/src/main/java/org/htmlunit/ScriptException.java b/src/main/java/org/htmlunit/ScriptException.java
index 275b3248f57..e81da8e51d4 100644
--- a/src/main/java/org/htmlunit/ScriptException.java
+++ b/src/main/java/org/htmlunit/ScriptException.java
@@ -34,7 +34,7 @@
* An exception that will be thrown if an error occurs during the processing of
* a script.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Marc Guillemot
* @author Frank Danek
* @author Ronald Brill
diff --git a/src/main/java/org/htmlunit/ScriptPreProcessor.java b/src/main/java/org/htmlunit/ScriptPreProcessor.java
index b5c0ede9770..de55fc77b67 100644
--- a/src/main/java/org/htmlunit/ScriptPreProcessor.java
+++ b/src/main/java/org/htmlunit/ScriptPreProcessor.java
@@ -21,7 +21,7 @@
* A script pre processor call back. This interface is called when ScriptEngine.execute()
* is called. It gives developers the opportunity to modify the script to be executed.
*
- * @author Ben Curren
+ * @author Ben Curren
*/
public interface ScriptPreProcessor {
diff --git a/src/main/java/org/htmlunit/ScriptResult.java b/src/main/java/org/htmlunit/ScriptResult.java
index c30b5630433..126b82a3550 100644
--- a/src/main/java/org/htmlunit/ScriptResult.java
+++ b/src/main/java/org/htmlunit/ScriptResult.java
@@ -19,7 +19,7 @@
/**
* This object contains the result of executing a chunk of script code.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Marc Guillemot
*/
public final class ScriptResult {
diff --git a/src/main/java/org/htmlunit/StatusHandler.java b/src/main/java/org/htmlunit/StatusHandler.java
index 2ea5ff8be5b..14106f6b1e9 100644
--- a/src/main/java/org/htmlunit/StatusHandler.java
+++ b/src/main/java/org/htmlunit/StatusHandler.java
@@ -19,7 +19,7 @@
/**
* A handler for changes to window.status
.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Ronald Brill
*/
public interface StatusHandler extends Serializable {
diff --git a/src/main/java/org/htmlunit/StringWebResponse.java b/src/main/java/org/htmlunit/StringWebResponse.java
index 0f1d0fbd791..5510c989932 100644
--- a/src/main/java/org/htmlunit/StringWebResponse.java
+++ b/src/main/java/org/htmlunit/StringWebResponse.java
@@ -28,7 +28,7 @@
/**
* A simple WebResponse created from a string. Content is assumed to be of type text/html
.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Marc Guillemot
* @author Brad Clarke
* @author Ahmed Ashour
diff --git a/src/main/java/org/htmlunit/TextPage.java b/src/main/java/org/htmlunit/TextPage.java
index 1c30e4c721d..9d2edf73725 100644
--- a/src/main/java/org/htmlunit/TextPage.java
+++ b/src/main/java/org/htmlunit/TextPage.java
@@ -24,7 +24,7 @@
* A generic page that will be returned for any text related content.
* Specifically any content types that start with {@code text/}
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
* @author Ronald Brill
* @author Ahmed Ashour
diff --git a/src/main/java/org/htmlunit/ThreadedRefreshHandler.java b/src/main/java/org/htmlunit/ThreadedRefreshHandler.java
index 756f11401e8..97d39b0c322 100644
--- a/src/main/java/org/htmlunit/ThreadedRefreshHandler.java
+++ b/src/main/java/org/htmlunit/ThreadedRefreshHandler.java
@@ -28,7 +28,7 @@
* If you want a refresh handler that ignores the wait time, see
* {@link ImmediateRefreshHandler}.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Daniel Gredler
*/
public class ThreadedRefreshHandler implements RefreshHandler {
diff --git a/src/main/java/org/htmlunit/TopLevelWindow.java b/src/main/java/org/htmlunit/TopLevelWindow.java
index 178006f2c30..e033aff1059 100644
--- a/src/main/java/org/htmlunit/TopLevelWindow.java
+++ b/src/main/java/org/htmlunit/TopLevelWindow.java
@@ -22,7 +22,7 @@
/**
* A window representing a top level browser window.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
* @author David D. Kilzer
* @author Ahmed Ashour
diff --git a/src/main/java/org/htmlunit/UnexpectedPage.java b/src/main/java/org/htmlunit/UnexpectedPage.java
index faa027e247d..e4aff8cdf7a 100644
--- a/src/main/java/org/htmlunit/UnexpectedPage.java
+++ b/src/main/java/org/htmlunit/UnexpectedPage.java
@@ -20,7 +20,7 @@
/**
* A generic page that is returned whenever an unexpected content type is returned by the server.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
* @author Ronald Brill
* @author Ahmed Ashour
diff --git a/src/main/java/org/htmlunit/Version.java b/src/main/java/org/htmlunit/Version.java
index dcb6d452021..cee0c4f8026 100644
--- a/src/main/java/org/htmlunit/Version.java
+++ b/src/main/java/org/htmlunit/Version.java
@@ -20,7 +20,7 @@
* Class to display version information about HtmlUnit. This is the class
* that will be executed if the JAR file is run.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Ahmed Ashour
* @author Ronald Brill
*/
diff --git a/src/main/java/org/htmlunit/WaitingRefreshHandler.java b/src/main/java/org/htmlunit/WaitingRefreshHandler.java
index 1d26563b47d..4b69de235c7 100644
--- a/src/main/java/org/htmlunit/WaitingRefreshHandler.java
+++ b/src/main/java/org/htmlunit/WaitingRefreshHandler.java
@@ -28,7 +28,7 @@
* If you want a refresh handler that ignores the wait time, see
* {@link ImmediateRefreshHandler}.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Daniel Gredler
* @author Sven Strickroth
*/
diff --git a/src/main/java/org/htmlunit/WebAssert.java b/src/main/java/org/htmlunit/WebAssert.java
index 612e444cc46..1a7f1bd5bc1 100644
--- a/src/main/java/org/htmlunit/WebAssert.java
+++ b/src/main/java/org/htmlunit/WebAssert.java
@@ -27,9 +27,22 @@
/**
* Utility class which contains standard assertions for HTML pages.
*
+ * This class provides a collection of static assertion methods for testing
+ * HTML page content, structure, and behavior. All assertion methods throw
+ * {@link AssertionError} when the expected condition is not met.
+ *
+ * Common use cases include:
+ *
+ * - Verifying page titles and content
+ * - Checking for presence/absence of elements
+ * - Validating form inputs and links
+ * - Ensuring accessibility attributes are properly set
+ *
+ *
* @author Daniel Gredler
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Ahmed Ashour
+ * @author Ronald Brill
*/
public final class WebAssert {
@@ -45,11 +58,13 @@ private WebAssert() {
*
* @param page the page to check
* @param title the expected title
+ * @throws AssertionError if the page title does not match the expected title
+ * @throws NullPointerException if page or title is null
*/
public static void assertTitleEquals(final HtmlPage page, final String title) {
final String s = page.getTitleText();
- if (!s.equals(title)) {
- final String msg = "Actual page title '" + s + "' does not match expected page title '" + title + "'.";
+ if (!title.equals(s)) {
+ final String msg = "Page title '" + s + "' does not match expected title '" + title + "'.";
throw new AssertionError(msg);
}
}
@@ -59,11 +74,13 @@ public static void assertTitleEquals(final HtmlPage page, final String title) {
*
* @param page the page to check
* @param titlePortion the substring which the page title is expected to contain
+ * @throws AssertionError if the page title does not contain the substring
+ * @throws NullPointerException if page or titlePortion is null
*/
public static void assertTitleContains(final HtmlPage page, final String titlePortion) {
final String s = page.getTitleText();
if (!s.contains(titlePortion)) {
- final String msg = "Page title '" + s + "' does not contain the substring '" + titlePortion + "'.";
+ final String msg = "Page title '" + s + "' does not contain the expected substring '" + titlePortion + "'.";
throw new AssertionError(msg);
}
}
@@ -73,11 +90,13 @@ public static void assertTitleContains(final HtmlPage page, final String titlePo
*
* @param page the page to check
* @param regex the regular expression that the page title is expected to match
+ * @throws AssertionError if the page title does not match the regular expression
+ * @throws NullPointerException if page or regex is null
*/
public static void assertTitleMatches(final HtmlPage page, final String regex) {
final String s = page.getTitleText();
if (!s.matches(regex)) {
- final String msg = "Page title '" + s + "' does not match the regular expression '" + regex + "'.";
+ final String msg = "Page title '" + s + "' does not match the expected regular expression '" + regex + "'.";
throw new AssertionError(msg);
}
}
@@ -86,14 +105,16 @@ public static void assertTitleMatches(final HtmlPage page, final String regex) {
* Verifies that the specified page contains an element with the specified ID.
*
* @param page the page to check
- * @param id the expected ID of an element in the page
+ * @param id the ID of an element expected in the page
+ * @throws AssertionError if no element with the specified ID is found
+ * @throws NullPointerException if page or id is null
*/
public static void assertElementPresent(final HtmlPage page, final String id) {
try {
page.getHtmlElementById(id);
}
catch (final ElementNotFoundException e) {
- final String msg = "The page does not contain an element with ID '" + id + "'.";
+ final String msg = "Expected element with ID '" + id + "' was not found on the page.";
throw new AssertionError(msg, e);
}
}
@@ -101,14 +122,21 @@ public static void assertElementPresent(final HtmlPage page, final String id) {
/**
* Verifies that the specified page contains an element matching the specified XPath expression.
*
+ * Example usage:
+ * {@code
+ * WebAssert.assertElementPresentByXPath(page, "//div[@class='error']");
+ * WebAssert.assertElementPresentByXPath(page, "//input[@type='submit' and @value='Login']");
+ * }
+ *
* @param page the page to check
* @param xpath the XPath expression which is expected to match an element in the page
+ * @throws AssertionError if no elements match the XPath expression
+ * @throws NullPointerException if page or xpath is null
*/
public static void assertElementPresentByXPath(final HtmlPage page, final String xpath) {
final List> elements = page.getByXPath(xpath);
if (elements.isEmpty()) {
- final String msg = "The page does not contain any elements matching the XPath expression '" + xpath
- + "'.";
+ final String msg = "No elements found matching the XPath expression '" + xpath + "'.";
throw new AssertionError(msg);
}
}
@@ -117,7 +145,9 @@ public static void assertElementPresentByXPath(final HtmlPage page, final String
* Verifies that the specified page does not contain an element with the specified ID.
*
* @param page the page to check
- * @param id the ID of an element which expected to not exist on the page
+ * @param id the ID of an element which is expected to not exist on the page
+ * @throws AssertionError if an element with the specified ID is found
+ * @throws NullPointerException if page or id is null
*/
public static void assertElementNotPresent(final HtmlPage page, final String id) {
try {
@@ -126,7 +156,7 @@ public static void assertElementNotPresent(final HtmlPage page, final String id)
catch (final ElementNotFoundException e) {
return;
}
- final String msg = "The page contains an element with ID '" + id + "'.";
+ final String msg = "Found unexpected element with ID '" + id + "' on the page.";
throw new AssertionError(msg);
}
@@ -135,13 +165,15 @@ public static void assertElementNotPresent(final HtmlPage page, final String id)
* expression.
*
* @param page the page to check
- * @param xpath the XPath expression which is expected to not match an element in the page
+ * @param xpath the XPath expression which is expected to not match any element in the page
+ * @throws AssertionError if any elements match the XPath expression
*/
public static void assertElementNotPresentByXPath(final HtmlPage page, final String xpath) {
final List> elements = page.getByXPath(xpath);
if (!elements.isEmpty()) {
- final String msg = "The page does not contain any elements matching the XPath expression '" + xpath
- + "'.";
+ final String msg = "Found " + elements.size()
+ + " unexpected element(s) matching the XPath expression '"
+ + xpath + "'.";
throw new AssertionError(msg);
}
}
@@ -151,10 +183,12 @@ public static void assertElementNotPresentByXPath(final HtmlPage page, final Str
*
* @param page the page to check
* @param text the text to check for
+ * @throws AssertionError if the page does not contain the specified text
+ * @throws NullPointerException if page or text is null
*/
public static void assertTextPresent(final HtmlPage page, final String text) {
if (!page.asNormalizedText().contains(text)) {
- final String msg = "The page does not contain the text '" + text + "'.";
+ final String msg = "Expected text '" + text + "' was not found on the page.";
throw new AssertionError(msg);
}
}
@@ -166,18 +200,20 @@ public static void assertTextPresent(final HtmlPage page, final String text) {
* @param page the page to check
* @param text the text to check for
* @param id the ID of the element which is expected to contain the specified text
+ * @throws AssertionError if the element does not contain the specified text
+ * @throws ElementNotFoundException if no element with the specified ID exists
+ * @throws NullPointerException if any parameter is null
*/
public static void assertTextPresentInElement(final HtmlPage page, final String text, final String id) {
try {
final HtmlElement element = page.getHtmlElementById(id);
if (!element.asNormalizedText().contains(text)) {
- final String msg = "The element with ID '" + id + "' does not contain the text '" + text + "'.";
+ final String msg = "Element with ID '" + id + "' does not contain the expected text '" + text + "'.";
throw new AssertionError(msg);
}
}
catch (final ElementNotFoundException e) {
- final String msg = "Unable to verify that the element with ID '" + id + "' contains the text '" + text
- + "' because the specified element does not exist.";
+ final String msg = "Cannot verify text content: element with ID '" + id + "' was not found on the page.";
throw new AssertionError(msg, e);
}
}
@@ -187,10 +223,12 @@ public static void assertTextPresentInElement(final HtmlPage page, final String
*
* @param page the page to check
* @param text the text to check for
+ * @throws AssertionError if the page contains the specified text
+ * @throws NullPointerException if page or text is null
*/
public static void assertTextNotPresent(final HtmlPage page, final String text) {
if (page.asNormalizedText().contains(text)) {
- final String msg = "The page contains the text '" + text + "'.";
+ final String msg = "Found unexpected text '" + text + "' on the page.";
throw new AssertionError(msg);
}
}
@@ -207,13 +245,12 @@ public static void assertTextNotPresentInElement(final HtmlPage page, final Stri
try {
final HtmlElement element = page.getHtmlElementById(id);
if (element.asNormalizedText().contains(text)) {
- final String msg = "The element with ID '" + id + "' contains the text '" + text + "'.";
+ final String msg = "Element with ID '" + id + "' contains unexpected text '" + text + "'.";
throw new AssertionError(msg);
}
}
catch (final ElementNotFoundException e) {
- final String msg = "Unable to verify that the element with ID '" + id + "' does not contain the text '"
- + text + "' because the specified element does not exist.";
+ final String msg = "Cannot verify text content: element with ID '" + id + "' was not found on the page.";
throw new AssertionError(msg);
}
}
@@ -223,13 +260,16 @@ public static void assertTextNotPresentInElement(final HtmlPage page, final Stri
*
* @param page the page to check
* @param id the ID of the link which the page is expected to contain
+ * @throws AssertionError if no link with the specified ID is found
+ * @see #assertLinkNotPresent(HtmlPage, String)
+ * @see #assertLinkPresentWithText(HtmlPage, String)
*/
public static void assertLinkPresent(final HtmlPage page, final String id) {
try {
page.getDocumentElement().getOneHtmlElementByAttribute("a", DomElement.ID_ATTRIBUTE, id);
}
catch (final ElementNotFoundException e) {
- final String msg = "The page does not contain a link with ID '" + id + "'.";
+ final String msg = "Expected link with ID '" + id + "' was not found on the page.";
throw new AssertionError(msg, e);
}
}
@@ -239,15 +279,18 @@ public static void assertLinkPresent(final HtmlPage page, final String id) {
*
* @param page the page to check
* @param id the ID of the link which the page is expected to not contain
+ * @throws AssertionError if a link with the specified ID is found
+ * @see #assertLinkPresent(HtmlPage, String)
+ * @see #assertLinkNotPresentWithText(HtmlPage, String)
*/
public static void assertLinkNotPresent(final HtmlPage page, final String id) {
try {
page.getDocumentElement().getOneHtmlElementByAttribute("a", DomElement.ID_ATTRIBUTE, id);
- // Not expected.
- final String msg = "The page contains a link with ID '" + id + "'.";
+ final String msg = "Found unexpected link with ID '" + id + "' on the page.";
throw new AssertionError(msg);
}
catch (final ElementNotFoundException expected) {
+ // Expected behavior - link should not be present
}
}
@@ -267,7 +310,7 @@ public static void assertLinkPresentWithText(final HtmlPage page, final String t
}
}
if (!found) {
- final String msg = "The page does not contain a link with text '" + text + "'.";
+ final String msg = "Expected link containing text '" + text + "' was not found on the page.";
throw new AssertionError(msg);
}
}
@@ -288,7 +331,7 @@ public static void assertLinkNotPresentWithText(final HtmlPage page, final Strin
}
}
if (found) {
- final String msg = "The page contains a link with text '" + text + "'.";
+ final String msg = "Found unexpected link containing text '" + text + "' on the page.";
throw new AssertionError(msg);
}
}
@@ -298,13 +341,15 @@ public static void assertLinkNotPresentWithText(final HtmlPage page, final Strin
*
* @param page the page to check
* @param name the expected name of a form on the page
+ * @throws AssertionError if no form with the specified name is found
+ * @see #assertFormNotPresent(HtmlPage, String)
*/
public static void assertFormPresent(final HtmlPage page, final String name) {
try {
page.getFormByName(name);
}
catch (final ElementNotFoundException e) {
- final String msg = "The page does not contain a form named '" + name + "'.";
+ final String msg = "Expected form with name '" + name + "' was not found on the page.";
throw new AssertionError(msg, e);
}
}
@@ -314,6 +359,8 @@ public static void assertFormPresent(final HtmlPage page, final String name) {
*
* @param page the page to check
* @param name the name of a form which should not exist on the page
+ * @throws AssertionError if a form with the specified name is found
+ * @see #assertFormPresent(HtmlPage, String)
*/
public static void assertFormNotPresent(final HtmlPage page, final String name) {
try {
@@ -322,7 +369,7 @@ public static void assertFormNotPresent(final HtmlPage page, final String name)
catch (final ElementNotFoundException e) {
return;
}
- final String msg = "The page contains a form named '" + name + "'.";
+ final String msg = "Found unexpected form with name '" + name + "' on the page.";
throw new AssertionError(msg);
}
@@ -331,12 +378,15 @@ public static void assertFormNotPresent(final HtmlPage page, final String name)
*
* @param page the page to check
* @param name the name of the input element to look for
+ * @throws AssertionError if no input element with the specified name is found
+ * @see #assertInputNotPresent(HtmlPage, String)
+ * @see #assertInputContainsValue(HtmlPage, String, String)
*/
public static void assertInputPresent(final HtmlPage page, final String name) {
final String xpath = "//input[@name='" + name + "']";
final List> list = page.getByXPath(xpath);
if (list.isEmpty()) {
- throw new AssertionError("Unable to find an input element named '" + name + "'.");
+ throw new AssertionError("Expected input element with name '" + name + "' was not found on the page.");
}
}
@@ -345,12 +395,14 @@ public static void assertInputPresent(final HtmlPage page, final String name) {
*
* @param page the page to check
* @param name the name of the input element to look for
+ * @throws AssertionError if an input element with the specified name is found
+ * @throws NullPointerException if page or name is null
*/
public static void assertInputNotPresent(final HtmlPage page, final String name) {
final String xpath = "//input[@name='" + name + "']";
final List> list = page.getByXPath(xpath);
if (!list.isEmpty()) {
- throw new AssertionError("Unable to find an input element named '" + name + "'.");
+ throw new AssertionError("Found unexpected input element with name '" + name + "' on the page.");
}
}
@@ -366,13 +418,13 @@ public static void assertInputContainsValue(final HtmlPage page, final String na
final String xpath = "//input[@name='" + name + "']";
final List> list = page.getByXPath(xpath);
if (list.isEmpty()) {
- throw new AssertionError("Unable to find an input element named '" + name + "'.");
+ throw new AssertionError("Expected input element with name '" + name + "' was not found on the page.");
}
final HtmlInput input = (HtmlInput) list.get(0);
final String s = input.getValue();
if (!s.equals(value)) {
- throw new AssertionError("The input element named '" + name + "' contains the value '" + s
- + "', not the expected value '" + value + "'.");
+ throw new AssertionError("Input element '" + name + "' has value '" + s
+ + "' but expected '" + value + "'.");
}
}
@@ -388,13 +440,12 @@ public static void assertInputDoesNotContainValue(final HtmlPage page, final Str
final String xpath = "//input[@name='" + name + "']";
final List> list = page.getByXPath(xpath);
if (list.isEmpty()) {
- throw new AssertionError("Unable to find an input element named '" + name + "'.");
+ throw new AssertionError("Expected input element with name '" + name + "' was not found on the page.");
}
final HtmlInput input = (HtmlInput) list.get(0);
final String s = input.getValue();
if (s.equals(value)) {
- throw new AssertionError("The input element named '" + name + "' contains the value '" + s
- + "', not the expected value '" + value + "'.");
+ throw new AssertionError("Input element '" + name + "' has unexpected value '" + s + "'.");
}
}
@@ -405,9 +456,13 @@ public static void assertInputDoesNotContainValue(final HtmlPage page, final Str
* all tabbable elements should have the tabindex
attribute set.
*
* This method verifies that all tabbable elements have a valid value set for
- * the tabindex
attribute.
+ * the tabindex
attribute. Valid values are positive integers,
+ * 0 (for default tab order), or -1 (to exclude from tab order).
+ *
+ * The following elements are checked: a, area, button, input, object, select, textarea
*
* @param page the page to check
+ * @throws AssertionError if any tabbable element has an invalid or missing tabindex attribute
*/
public static void assertAllTabIndexAttributesSet(final HtmlPage page) {
final List tags =
@@ -418,7 +473,7 @@ public static void assertAllTabIndexAttributesSet(final HtmlPage page) {
final Short tabIndex = element.getTabIndex();
if (tabIndex == null || HtmlElement.TAB_INDEX_OUT_OF_BOUNDS.equals(tabIndex)) {
final String s = element.getAttributeDirect("tabindex");
- throw new AssertionError("Illegal value for tab index: '" + s + "'.");
+ throw new AssertionError("Invalid tabindex value '" + s + "' found on element.");
}
}
}
@@ -429,7 +484,10 @@ public static void assertAllTabIndexAttributesSet(final HtmlPage page) {
* keyboard navigation. This method verifies that all the accesskey
attributes on the
* specified page are unique.
*
+ * Duplicate access keys can confuse users and make keyboard navigation unpredictable.
+ *
* @param page the page to check
+ * @throws AssertionError if any access key is used more than once on the page
*/
public static void assertAllAccessKeyAttributesUnique(final HtmlPage page) {
final List list = new ArrayList<>();
@@ -437,7 +495,7 @@ public static void assertAllAccessKeyAttributesUnique(final HtmlPage page) {
final String key = element.getAttributeDirect("accesskey");
if (key != null && !key.isEmpty()) {
if (list.contains(key)) {
- throw new AssertionError("The access key '" + key + "' is not unique.");
+ throw new AssertionError("Duplicate access key '" + key + "' found on the page.");
}
list.add(key);
}
@@ -448,6 +506,8 @@ public static void assertAllAccessKeyAttributesUnique(final HtmlPage page) {
* Verifies that all element IDs in the specified page are unique.
*
* @param page the page to check
+ * @throws AssertionError if any element ID is used more than once on the page
+ * @throws NullPointerException if page is null
*/
public static void assertAllIdAttributesUnique(final HtmlPage page) {
final List list = new ArrayList<>();
@@ -455,7 +515,7 @@ public static void assertAllIdAttributesUnique(final HtmlPage page) {
final String id = element.getId();
if (id != null && !id.isEmpty()) {
if (list.contains(id)) {
- throw new AssertionError("The element ID '" + id + "' is not unique.");
+ throw new AssertionError("Duplicate element ID '" + id + "' found on the page.");
}
list.add(id);
}
@@ -465,8 +525,10 @@ public static void assertAllIdAttributesUnique(final HtmlPage page) {
/**
* Assert that the specified parameter is not null. Throw a NullPointerException
* if a null is found.
+ *
* @param description the description to pass into the NullPointerException
* @param object the object to check for null
+ * @throws NullPointerException if the object is null
*/
public static void notNull(final String description, final Object object) {
if (object == null) {
diff --git a/src/main/java/org/htmlunit/WebClient.java b/src/main/java/org/htmlunit/WebClient.java
index 0baa51a91b9..321f22a3e78 100644
--- a/src/main/java/org/htmlunit/WebClient.java
+++ b/src/main/java/org/htmlunit/WebClient.java
@@ -122,14 +122,14 @@
*
* Note: a {@link WebClient} instance is not thread safe. It is intended to be used from a single thread.
*
- * @author Mike Bowler
- * @author Mike J. Bresnahan
+ * @author Mike Bowler
+ * @author Mike J. Bresnahan
* @author Dominique Broeglin
* @author Noboru Sinohara
- * @author Chen Jun
+ * @author Chen Jun
* @author David K. Taylor
- * @author Christian Sell
- * @author Ben Curren
+ * @author Christian Sell
+ * @author Ben Curren
* @author Marc Guillemot
* @author Chris Erskine
* @author Daniel Gredler
@@ -1677,7 +1677,7 @@ && getOptions().isRedirectEnabled()) {
}
if (allowedRedirects == 0) {
- throw new FailingHttpStatusCodeException("Too much redirect for "
+ throw new FailingHttpStatusCodeException("Too many redirects for "
+ webResponse.getWebRequest().getUrl(), webResponse);
}
diff --git a/src/main/java/org/htmlunit/WebClientOptions.java b/src/main/java/org/htmlunit/WebClientOptions.java
index 71d0df3aacf..7de2c8a8370 100644
--- a/src/main/java/org/htmlunit/WebClientOptions.java
+++ b/src/main/java/org/htmlunit/WebClientOptions.java
@@ -30,7 +30,17 @@
import org.apache.commons.io.FileUtils;
/**
- * Represents options of a {@link WebClient}.
+ * Configuration options for {@link WebClient} instances.
+ * This class provides fine-grained control over client behavior including:
+ *
+ * - JavaScript and CSS processing
+ * - SSL/TLS configuration and certificates
+ * - HTTP timeouts and proxy settings
+ * - Memory management and temporary file handling
+ * - WebSocket and geolocation support
+ *
+ *
+ * All options have sensible defaults and can be modified independently.
*
* @author Ahmed Ashour
* @author Marc Guillemot
@@ -52,6 +62,8 @@ public class WebClientOptions implements Serializable {
private boolean throwExceptionOnScriptError_ = true;
private boolean popupBlockerEnabled_;
private boolean isRedirectEnabled_ = true;
+ // strange value 72 used to be backward compatible with 4.14.0
+ private int pageRefreshLimit_ = 72;
private File tempFileDirectory_;
private transient KeyStore sslClientCertificateStore_;
@@ -140,6 +152,20 @@ public void setRedirectEnabled(final boolean enabled) {
isRedirectEnabled_ = enabled;
}
+ /**
+ * Sets the redirect limit for page refresh operations using HTTP refresh headers or meta tags.
+ * This prevents infinite refresh loops by limiting the number of consecutive refreshes allowed.
+ * Set to -1 to allow unlimited refreshes.
+ *
+ * Note: The {@link NiceRefreshHandler} and {@link ImmediateRefreshHandler}
+ * have additional loop protection that may trigger before this limit.
+ *
+ * @param pageRefreshLimit the maximum number of refresh loops, or -1 for unlimited
+ */
+ public void setPageRefreshLimit(final int pageRefreshLimit) {
+ pageRefreshLimit_ = pageRefreshLimit;
+ }
+
/**
* Returns the directory to be used for storing the response content in
* a temporary file see {@link #getMaxInMemory()}.
@@ -150,12 +176,13 @@ public File getTempFileDirectory() {
}
/**
- * Sets the directory to be used for storing the response content in
- * a temporary file see {@link #setMaxInMemory(int)}.
- * If the given directory does not exist, this creates it.
+ * Sets the directory to be used for storing response content in temporary files.
+ * See {@link #setMaxInMemory(int)} for when temporary files are created.
+ * If the directory doesn't exist, it will be created automatically.
*
- * @param tempFileDirectory the directory to be used or null to use the system default
- * @throws IOException in case of error
+ * @param tempFileDirectory the directory to use, or {@code null} for system default
+ * @throws IOException if directory creation fails
+ * @throws IllegalArgumentException if the path points to an existing file
*/
public void setTempFileDirectory(final File tempFileDirectory) throws IOException {
if (tempFileDirectory != null) {
@@ -180,6 +207,17 @@ public boolean isRedirectEnabled() {
return isRedirectEnabled_;
}
+ /**
+ * Returns the limit to be used when a page refreshes itself by using a
+ * http refresh header or meta tag. Negative values are interpreted as
+ * endless refresh support.
+ *
+ * @return pageRefreshLimit the number of refresh loops before throwing an exception
+ */
+ public int getPageRefreshLimit() {
+ return pageRefreshLimit_;
+ }
+
/**
* Sets the SSL client certificate {@link KeyStore} to use.
*
@@ -290,6 +328,8 @@ public String[] getSSLClientProtocols() {
* @param sslClientProtocols the protocol versions
* @see javax.net.ssl.SSLSocket#setEnabledProtocols(String[])
* @see #getSSLClientProtocols()
+ * @see #setSSLClientCipherSuites(String...)
+ * @see #setUseInsecureSSL(boolean)
*/
public void setSSLClientProtocols(final String... sslClientProtocols) {
sslClientProtocols_ = sslClientProtocols;
@@ -490,7 +530,8 @@ public void setProxyConfig(final ProxyConfig proxyConfig) {
* Gets the timeout value for the {@link WebConnection}.
* The default timeout is 90 seconds.
* @return the timeout value in milliseconds
- * @see WebClientOptions#setTimeout(int)
+ * @see #setTimeout(int)
+ * @see #setConnectionTimeToLive(long)
*/
public int getTimeout() {
return timeout_;
@@ -518,11 +559,11 @@ public long getConnectionTimeToLive() {
}
/**
- * Sets the connTimeToLive of the HttpClient connection pool.
- * Use this if you are working with web pages behind a DNS based load balancer.
- * Set to -1 (default) for disabling this timeout.
+ * Sets the connection time-to-live for the HttpClient connection pool.
+ * This is useful when working with web pages behind DNS-based load balancers
+ * where IP addresses may change frequently.
*
- * @param connectionTimeToLive the value of the timeout in milliseconds
+ * @param connectionTimeToLive the timeout in milliseconds, or -1 to disable (default)
*/
public void setConnectionTimeToLive(final long connectionTimeToLive) {
connectionTimeToLive_ = connectionTimeToLive;
@@ -592,9 +633,13 @@ private static KeyStore getKeyStore(final InputStream inputStream, final String
}
/**
- * Returns the maximum bytes to have in memory, after which the content is saved to a temporary file.
- * Default is 500 * 1024.
- * @return the maximum bytes in memory
+ * Returns the maximum bytes stored in memory before content is saved to temporary files.
+ * When response content exceeds this limit, it will be written to a temporary file
+ * in the directory specified by {@link #getTempFileDirectory()}.
+ *
+ * @return the maximum bytes in memory (default: 500 * 1024)
+ * @see #setMaxInMemory(int)
+ * @see #setTempFileDirectory(File)
*/
public int getMaxInMemory() {
return maxInMemory_;
@@ -665,12 +710,10 @@ public InetAddress getLocalAddress() {
}
/**
- * Sets the local address to be used for request execution.
- *
- * On machines with multiple network interfaces, this parameter can be used to select the network interface
- * from which the connection originates.
+ * Sets the local network interface address for outgoing HTTP requests.
+ * Useful on multi-homed machines to control which network interface is used.
*
- * @param localAddress the local address
+ * @param localAddress the local IP address to bind to, or {@code null} for automatic selection
*/
public void setLocalAddress(final InetAddress localAddress) {
localAddress_ = localAddress;
@@ -694,8 +737,9 @@ public boolean isDownloadImages() {
/**
* Sets the screen width.
+ * This value is used by JavaScript's screen.width property.
*
- * @param screenWidth the screen width
+ * @param screenWidth the screen width in pixels (must be positive)
*/
public void setScreenWidth(final int screenWidth) {
screenWidth_ = screenWidth;
@@ -729,16 +773,23 @@ public int getScreenHeight() {
}
/**
- * @return the Neko Html parser reader buffer size
+ * Returns the Neko HTML parser reader buffer size.
+ * This controls the internal buffer size used by the NekoHTML parser
+ * for reading HTML content. Larger buffers can improve performance
+ * for large documents but consume more memory.
+ *
+ * @return the buffer size in bytes, or -1 for parser default
*/
public int getNekoReaderBufferSize() {
return nekoReaderBufferSize_;
}
/**
- * Sets the Neko Html parser reader buffer size.
+ * Sets the Neko HTML parser reader buffer size.
+ * A larger buffer size can improve parsing performance for large HTML documents
+ * but will consume more memory. Set to -1 to use the parser's default buffer size.
*
- * @param nekoReaderBufferSize the new value
+ * @param nekoReaderBufferSize the buffer size in bytes, or -1 for default
*/
public void setNekoReaderBufferSize(final int nekoReaderBufferSize) {
nekoReaderBufferSize_ = nekoReaderBufferSize;
@@ -763,64 +814,82 @@ public boolean isWebSocketEnabled() {
}
/**
- * @return the WebSocket maxTextMessageSize
+ * Returns the maximum size in bytes for WebSocket text messages.
+ * Set to -1 to use the default.
+ *
+ * @return the maximum text message size in bytes, or -1 for default
*/
public int getWebSocketMaxTextMessageSize() {
return webSocketMaxTextMessageSize_;
}
/**
- * Sets the WebSocket maxTextMessageSize.
+ * Sets the maximum size in bytes for WebSocket text messages.
+ * This limit applies to individual text frames received by the WebSocket.
*
- * @param webSocketMaxTextMessageSize the new value
+ * @param webSocketMaxTextMessageSize the maximum size in bytes, or -1 for default
*/
public void setWebSocketMaxTextMessageSize(final int webSocketMaxTextMessageSize) {
webSocketMaxTextMessageSize_ = webSocketMaxTextMessageSize;
}
/**
- * @return the WebSocket maxTextMessageBufferSize
+ * Returns the maximum buffer size in bytes for assembling WebSocket text messages.
+ * Set to -1 to use the default.
+ *
+ * @return the maximum text message buffer size in bytes, or -1 for default
*/
public int getWebSocketMaxTextMessageBufferSize() {
return webSocketMaxTextMessageBufferSize_;
}
/**
- * Sets the WebSocket maxTextMessageBufferSize.
+ * Sets the maximum buffer size in bytes for assembling WebSocket text messages.
+ * This controls the memory used when reconstructing fragmented text messages.
+ * The buffer size should typically be larger than the maximum message size to
+ * accommodate message assembly overhead.
*
- * @param webSocketMaxTextMessageBufferSize the new value
+ * @param webSocketMaxTextMessageBufferSize the maximum buffer size in bytes, or -1 for default
*/
public void setWebSocketMaxTextMessageBufferSize(final int webSocketMaxTextMessageBufferSize) {
webSocketMaxTextMessageBufferSize_ = webSocketMaxTextMessageBufferSize;
}
/**
- * @return the WebSocket maxTextMessageSize
+ * Returns the maximum size in bytes for WebSocket binary messages.
+ * Set to -1 to use the default.
+ *
+ * @return the maximum binary message size in bytes, or -1 for default
*/
public int getWebSocketMaxBinaryMessageSize() {
return webSocketMaxBinaryMessageSize_;
}
/**
- * Sets the WebSocket maxBinaryMessageSize.
+ * Sets the maximum size in bytes for WebSocket binary messages.
+ * This limit applies to individual binary frames received by the WebSocket.
*
- * @param webSocketMaxBinaryMessageSize the new value
+ * @param webSocketMaxBinaryMessageSize the maximum size in bytes, or -1 for default
*/
public void setWebSocketMaxBinaryMessageSize(final int webSocketMaxBinaryMessageSize) {
webSocketMaxBinaryMessageSize_ = webSocketMaxBinaryMessageSize;
}
/**
- * @return the WebSocket maxBinaryMessageBufferSize
+ * Returns the maximum buffer size in bytes for assembling WebSocket binary messages.
+ * Set to -1 to use the container default.
+ *
+ * @return the maximum binary message buffer size in bytes, or -1 for default
*/
public int getWebSocketMaxBinaryMessageBufferSize() {
return webSocketMaxBinaryMessageBufferSize_;
}
/**
- * Sets the WebSocket maxBinaryMessageBufferSize.
+ * Sets the maximum buffer size in bytes for assembling WebSocket binary messages.
+ * This controls the memory used when reconstructing fragmented binary messages.
*
- * @param webSocketMaxBinaryMessageBufferSize the new value
+ * @param webSocketMaxBinaryMessageBufferSize the maximum buffer size in bytes, or -1 for default
*/
public void setWebSocketMaxBinaryMessageBufferSize(final int webSocketMaxBinaryMessageBufferSize) {
webSocketMaxBinaryMessageBufferSize_ = webSocketMaxBinaryMessageBufferSize;
@@ -887,13 +956,13 @@ public static class Geolocation implements Serializable {
/**
* Ctor.
*
- * @param accuracy the accuracy
- * @param latitude the latitude
- * @param longitude the longitude
- * @param altitude the altitude or null
- * @param altitudeAccuracy the altitudeAccuracy or null
- * @param heading the heading or null
- * @param speed the speed or null
+ * @param latitude the latitude coordinate in decimal degrees
+ * @param longitude the longitude coordinate in decimal degrees
+ * @param accuracy the accuracy of the position in meters
+ * @param altitude the altitude in meters above sea level, or null if unavailable
+ * @param altitudeAccuracy the accuracy of the altitude in meters, or null if unavailable
+ * @param heading the direction of travel in degrees (0-359), or null if unavailable
+ * @param speed the current speed in meters per second, or null if unavailable
*/
public Geolocation(
final double latitude,
@@ -966,7 +1035,11 @@ public Double getSpeed() {
* If set to {@code true}, the client will accept XMLHttpRequests to URL's
* using the 'file' protocol. Allowing this introduces security problems and is
* therefore not allowed by current browsers. But some browsers have special settings
- * to open this door; therefore we have this option.
+ * to open this door; therefore we have this option also.
+ *
+ *
Security Warning: Enabling this feature may expose local files
+ * to web content, which can be a serious security risk.
+ *
* @param fileProtocolForXMLHttpRequestsAllowed whether or not allow (local) file access
*/
public void setFileProtocolForXMLHttpRequestsAllowed(final boolean fileProtocolForXMLHttpRequestsAllowed) {
diff --git a/src/main/java/org/htmlunit/WebConnection.java b/src/main/java/org/htmlunit/WebConnection.java
index 956d3f41f93..74d128c51bd 100644
--- a/src/main/java/org/htmlunit/WebConnection.java
+++ b/src/main/java/org/htmlunit/WebConnection.java
@@ -19,7 +19,7 @@
/**
* An object which handles the actual communication portion of page retrieval/submission.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Daniel Gredler
* @author Marc Guillemot
* @author Ahmed Ashour
diff --git a/src/main/java/org/htmlunit/WebRequest.java b/src/main/java/org/htmlunit/WebRequest.java
index 137225f8c17..250d81edb81 100644
--- a/src/main/java/org/htmlunit/WebRequest.java
+++ b/src/main/java/org/htmlunit/WebRequest.java
@@ -678,8 +678,9 @@ public void addHint(final HttpHint hint) {
public String toString() {
final StringBuilder builder = new StringBuilder(100)
.append(getClass().getSimpleName())
- .append("[Mike Bowler
+ * @author Mike Bowler
* @author Brad Clarke
* @author Noboru Sinohara
* @author Marc Guillemot
diff --git a/src/main/java/org/htmlunit/WebResponseData.java b/src/main/java/org/htmlunit/WebResponseData.java
index 6f55e37a4ab..74196109ea6 100644
--- a/src/main/java/org/htmlunit/WebResponseData.java
+++ b/src/main/java/org/htmlunit/WebResponseData.java
@@ -29,7 +29,7 @@
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.input.BOMInputStream;
import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.Strings;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.brotli.dec.BrotliInputStream;
@@ -101,7 +101,7 @@ private InputStream getStream(final ByteOrderMark... bomHeaders) throws IOExcept
final List headers = getResponseHeaders();
final String encoding = getHeader(headers, "content-encoding");
if (encoding != null) {
- boolean isGzip = StringUtils.contains(encoding, "gzip") && !"no-gzip".equals(encoding);
+ boolean isGzip = Strings.CI.contains(encoding, "gzip") && !"no-gzip".equals(encoding);
if ("gzip-only-text/html".equals(encoding)) {
isGzip = MimeType.TEXT_HTML.equals(getHeader(headers, "content-type"));
}
@@ -148,7 +148,7 @@ private InputStream getStream(final ByteOrderMark... bomHeaders) throws IOExcept
return stream;
}
- if (StringUtils.contains(encoding, "deflate")) {
+ if (Strings.CI.contains(encoding, "deflate")) {
boolean zlibHeader = false;
if (stream.markSupported()) { // should be always the case as the content is in a byte[] or in a file
stream.mark(2);
diff --git a/src/main/java/org/htmlunit/WebWindow.java b/src/main/java/org/htmlunit/WebWindow.java
index 09612fd7ce4..fe06b592521 100644
--- a/src/main/java/org/htmlunit/WebWindow.java
+++ b/src/main/java/org/htmlunit/WebWindow.java
@@ -24,7 +24,7 @@
/**
* An interface that represents one window in a browser. It could be a top level window or a frame.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
* @author David D. Kilzer
*/
diff --git a/src/main/java/org/htmlunit/WebWindowAdapter.java b/src/main/java/org/htmlunit/WebWindowAdapter.java
index e23da1d128d..4183688ef9c 100644
--- a/src/main/java/org/htmlunit/WebWindowAdapter.java
+++ b/src/main/java/org/htmlunit/WebWindowAdapter.java
@@ -17,7 +17,7 @@
/**
* An adapter for the WebWindowListener interface.
*
- * @author Mike Bowler
+ * @author Mike Bowler
*/
public class WebWindowAdapter implements WebWindowListener {
diff --git a/src/main/java/org/htmlunit/WebWindowEvent.java b/src/main/java/org/htmlunit/WebWindowEvent.java
index bbe17d7b1dc..25c2b41c8ee 100644
--- a/src/main/java/org/htmlunit/WebWindowEvent.java
+++ b/src/main/java/org/htmlunit/WebWindowEvent.java
@@ -19,7 +19,7 @@
/**
* An event that will be fired when a WebWindow changes.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
*/
public final class WebWindowEvent extends EventObject {
diff --git a/src/main/java/org/htmlunit/WebWindowListener.java b/src/main/java/org/htmlunit/WebWindowListener.java
index e111fc50c70..f030bae8b97 100644
--- a/src/main/java/org/htmlunit/WebWindowListener.java
+++ b/src/main/java/org/htmlunit/WebWindowListener.java
@@ -30,7 +30,7 @@
* called for each and every containing (i)Frame when e.g. closing a {@link TopLevelWindow}.
*
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Ronald Brill
*/
public interface WebWindowListener {
diff --git a/src/main/java/org/htmlunit/WebWindowNotFoundException.java b/src/main/java/org/htmlunit/WebWindowNotFoundException.java
index a0624ad929e..b56483ba865 100644
--- a/src/main/java/org/htmlunit/WebWindowNotFoundException.java
+++ b/src/main/java/org/htmlunit/WebWindowNotFoundException.java
@@ -18,7 +18,7 @@
* Exception to indicate that no {@link WebWindow} could be found that matched
* a given name.
*
- * @author Mike Bowler
+ * @author Mike Bowler
*/
public class WebWindowNotFoundException extends RuntimeException {
private final String name_;
diff --git a/src/main/java/org/htmlunit/css/AbstractCssStyleDeclaration.java b/src/main/java/org/htmlunit/css/AbstractCssStyleDeclaration.java
index c0baff12da7..80fc46355e9 100644
--- a/src/main/java/org/htmlunit/css/AbstractCssStyleDeclaration.java
+++ b/src/main/java/org/htmlunit/css/AbstractCssStyleDeclaration.java
@@ -39,8 +39,8 @@
/**
* A css StyleDeclaration.
*
- * @author Mike Bowler
- * @author Christian Sell
+ * @author Mike Bowler
+ * @author Christian Sell
* @author Daniel Gredler
* @author Chris Erskine
* @author Ahmed Ashour
diff --git a/src/main/java/org/htmlunit/css/CssStyleSheet.java b/src/main/java/org/htmlunit/css/CssStyleSheet.java
index 1bf974a747f..fd3f7f797ee 100644
--- a/src/main/java/org/htmlunit/css/CssStyleSheet.java
+++ b/src/main/java/org/htmlunit/css/CssStyleSheet.java
@@ -39,6 +39,7 @@
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.Strings;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -563,7 +564,7 @@ static boolean selects(final BrowserVersion browserVersion,
final String prefixValue = prefixAttributeCondition.getValue();
if (prefixAttributeCondition.isCaseInSensitive()) {
return !org.htmlunit.util.StringUtils.isEmptyString(prefixValue)
- && StringUtils.startsWithIgnoreCase(
+ && Strings.CI.startsWith(
element.getAttribute(prefixAttributeCondition.getLocalName()), prefixValue);
}
return !org.htmlunit.util.StringUtils.isEmptyString(prefixValue)
@@ -574,7 +575,7 @@ static boolean selects(final BrowserVersion browserVersion,
final String suffixValue = suffixAttributeCondition.getValue();
if (suffixAttributeCondition.isCaseInSensitive()) {
return !org.htmlunit.util.StringUtils.isEmptyString(suffixValue)
- && StringUtils.endsWithIgnoreCase(
+ && Strings.CI.endsWith(
element.getAttribute(suffixAttributeCondition.getLocalName()), suffixValue);
}
return !org.htmlunit.util.StringUtils.isEmptyString(suffixValue)
@@ -585,7 +586,7 @@ static boolean selects(final BrowserVersion browserVersion,
final String substringValue = substringAttributeCondition.getValue();
if (substringAttributeCondition.isCaseInSensitive()) {
return !org.htmlunit.util.StringUtils.isEmptyString(substringValue)
- && StringUtils.containsIgnoreCase(
+ && Strings.CI.contains(
element.getAttribute(substringAttributeCondition.getLocalName()), substringValue);
}
return !org.htmlunit.util.StringUtils.isEmptyString(substringValue)
diff --git a/src/main/java/org/htmlunit/css/ElementCssStyleDeclaration.java b/src/main/java/org/htmlunit/css/ElementCssStyleDeclaration.java
index f98bab0d4b1..33bed3a0f98 100644
--- a/src/main/java/org/htmlunit/css/ElementCssStyleDeclaration.java
+++ b/src/main/java/org/htmlunit/css/ElementCssStyleDeclaration.java
@@ -27,8 +27,8 @@
/**
* A css StyleDeclaration backed by a {@link DomElement}.
*
- * @author Mike Bowler
- * @author Christian Sell
+ * @author Mike Bowler
+ * @author Christian Sell
* @author Daniel Gredler
* @author Chris Erskine
* @author Ahmed Ashour
diff --git a/src/main/java/org/htmlunit/css/StyleAttributes.java b/src/main/java/org/htmlunit/css/StyleAttributes.java
index 9d6f20247fd..b6c5c0d4be7 100644
--- a/src/main/java/org/htmlunit/css/StyleAttributes.java
+++ b/src/main/java/org/htmlunit/css/StyleAttributes.java
@@ -997,6 +997,57 @@ public enum Definition {
/** The style property {@code content-visibility}. */
CONTENT_VISISBILITY_("content-visibility", "content-visibility", ff("visible")),
+ /** The style property {@code cornerBlockEndShape}. */
+ CORNER_BLOCK_END_SHAPE("cornerBlockEndShape", "corner-block-end-shape", chromeAndEdge("round")),
+
+ /** The style property {@code cornerBlockStartShape}. */
+ CORNER_BLOCK_START_SHAPE("cornerBlockStartShape", "corner-block-start-shape", chromeAndEdge("round")),
+
+ /** The style property {@code cornerBottomLeftShape}. */
+ CORNER_BOTTOM_LEFT_SHAPE("cornerBottomLeftShape", "corner-bottom-left-shape", chromeAndEdge("round")),
+
+ /** The style property {@code cornerBottomRightShape}. */
+ CORNER_BOTTOM_RIGHT_SHAPE("cornerBottomRightShape", "corner-bottom-right-shape", chromeAndEdge("round")),
+
+ /** The style property {@code cornerBottomShape}. */
+ CORNER_BOTTOM_SHAPE("cornerBottomShape", "corner-bottom-shape", chromeAndEdge("round")),
+
+ /** The style property {@code cornerEndEndShape}. */
+ CORNER_END_END_SHAPE("cornerEndEndShape", "corner-end-end-shape", chromeAndEdge("round")),
+
+ /** The style property {@code cornerEndStartShape}. */
+ CORNER_END_START_SHAPE("cornerEndStartShape", "corner-end-start-shape", chromeAndEdge("round")),
+
+ /** The style property {@code cornerInlineEndShape}. */
+ CORNER_INLINE_END_SHAPE("cornerInlineEndShape", "corner-inline-end-shape", chromeAndEdge("round")),
+
+ /** The style property {@code cornerInlineStartShape}. */
+ CORNER_INLINE_START_SHAPE("cornerInlineStartShape", "corner-inline-start-shape", chromeAndEdge("round")),
+
+ /** The style property {@code cornerLeftShape}. */
+ CORNER_LEFT_SHAPE("cornerLeftShape", "corner-left-shape", chromeAndEdge("round")),
+
+ /** The style property {@code cornerRightShape}. */
+ CORNER_RIGHT_SHAPE("cornerRightShape", "corner-right-shape", chromeAndEdge("round")),
+
+ /** The style property {@code cornerShape}. */
+ CORNER_SHAPE("cornerShape", "corner-shape", chromeAndEdge("round")),
+
+ /** The style property {@code cornerStartEndShape}. */
+ CORNER_START_END_SHAPE("cornerStartEndShape", "corner-start-end-shape", chromeAndEdge("round")),
+
+ /** The style property {@code cornerStartStartShape}. */
+ CORNER_START_START_SHAPE("cornerStartStartShape", "corner-start-start-shape", chromeAndEdge("round")),
+
+ /** The style property {@code cornerTopLeftShape}. */
+ CORNER_TOP_LEFT_SHAPE("cornerTopLeftShape", "corner-top-left-shape", chromeAndEdge("round")),
+
+ /** The style property {@code cornerTopRightShape}. */
+ CORNER_TOP_RIGHT_SHAPE("cornerTopRightShape", "corner-top-right-shape", chromeAndEdge("round")),
+
+ /** The style property {@code cornerTopShape}. */
+ CORNER_TOP_SHAPE("cornerTopShape", "corner-top-shape", chromeAndEdge("round")),
+
/** The style property {@code counterIncrement}. */
COUNTER_INCREMENT("counterIncrement", "counter-increment", chromeAndEdgeNone(), ffNone()),
@@ -1266,7 +1317,10 @@ public enum Definition {
FONT_VARIANT_EAST_ASIAN_("font-variant-east-asian", "font-variant-east-asian", ffNormal()),
/** The style property {@code fontVariantEmoji}. */
- FONT_VARIANT_EMOKJI("fontVariantEmoji", "font-variant-emoji", chromeAndEdgeNormal()),
+ FONT_VARIANT_EMOJI("fontVariantEmoji", "font-variant-emoji", ffLatest("normal"), chromeAndEdgeNormal()),
+
+ /** The style property {@code font-variant-emoji}. */
+ FONT_VARIANT_EMOJI_("font-variant-emoji", "font-variant-emoji", ffLatest("normal")),
/** The style property {@code fontVariantLigatures}. */
FONT_VARIANT_LIGATURES("fontVariantLigatures", "font-variant-ligatures", ffNormal(), chromeAndEdgeNormal()),
@@ -2553,6 +2607,9 @@ public enum Definition {
/** The style property {@code resize}. */
RESIZE("resize", "resize", ffNone(), chromeAndEdgeNone()),
+ /** The style property {@code result}. */
+ RESULT("result", "result", chromeAndEdge("")),
+
/** The style property {@code right}. */
RIGHT("right", "right", chromeAndEdgeAuto(), ff("")),
diff --git a/src/main/java/org/htmlunit/css/StyleElement.java b/src/main/java/org/htmlunit/css/StyleElement.java
index 2e4f2a2714e..5593f91da0a 100644
--- a/src/main/java/org/htmlunit/css/StyleElement.java
+++ b/src/main/java/org/htmlunit/css/StyleElement.java
@@ -25,8 +25,8 @@
* Contains information about a single style element, including its name, its value, and an index which
* can be compared against other indices in order to determine precedence.
*
- * @author Mike Bowler
- * @author Christian Sell
+ * @author Mike Bowler
+ * @author Christian Sell
* @author Daniel Gredler
* @author Chris Erskine
* @author Ahmed Ashour
diff --git a/src/main/java/org/htmlunit/css/WrappedCssStyleDeclaration.java b/src/main/java/org/htmlunit/css/WrappedCssStyleDeclaration.java
index 6654f6acab9..b36fced1e47 100644
--- a/src/main/java/org/htmlunit/css/WrappedCssStyleDeclaration.java
+++ b/src/main/java/org/htmlunit/css/WrappedCssStyleDeclaration.java
@@ -27,8 +27,8 @@
/**
* A css StyleDeclaration backed by a {@link CSSStyleDeclarationImpl}.
*
- * @author Mike Bowler
- * @author Christian Sell
+ * @author Mike Bowler
+ * @author Christian Sell
* @author Daniel Gredler
* @author Chris Erskine
* @author Ahmed Ashour
diff --git a/src/main/java/org/htmlunit/html/AbstractDomNodeList.java b/src/main/java/org/htmlunit/html/AbstractDomNodeList.java
index c5a1434f11b..0afc18d2202 100644
--- a/src/main/java/org/htmlunit/html/AbstractDomNodeList.java
+++ b/src/main/java/org/htmlunit/html/AbstractDomNodeList.java
@@ -28,7 +28,7 @@
* @param The element type
*
* @author Daniel Gredler
- * @author Tom Anderson
+ * @author Tom Anderson
* @author Ronald Brill
*/
public abstract class AbstractDomNodeList extends AbstractList
diff --git a/src/main/java/org/htmlunit/html/BaseFrameElement.java b/src/main/java/org/htmlunit/html/BaseFrameElement.java
index 7d1ffd0aa31..a4408b4da00 100644
--- a/src/main/java/org/htmlunit/html/BaseFrameElement.java
+++ b/src/main/java/org/htmlunit/html/BaseFrameElement.java
@@ -40,9 +40,9 @@
/**
* Base class for frame and iframe.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Marc Guillemot
* @author David D. Kilzer
* @author Stefan Anzinger
diff --git a/src/main/java/org/htmlunit/html/DefaultElementFactory.java b/src/main/java/org/htmlunit/html/DefaultElementFactory.java
index 7e76ed5eb57..a91e03a6513 100644
--- a/src/main/java/org/htmlunit/html/DefaultElementFactory.java
+++ b/src/main/java/org/htmlunit/html/DefaultElementFactory.java
@@ -41,7 +41,7 @@
* where the first one is the owning page of the element, the second one is a map
* holding the initial attributes for the element.
*
- * @author Christian Sell
+ * @author Christian Sell
* @author Marc Guillemot
* @author Ahmed Ashour
* @author David K. Taylor
@@ -51,18 +51,12 @@
*/
public class DefaultElementFactory implements ElementFactory {
- // for performance optimization
- static final class OrderedFastHashMapWithLowercaseKeys extends OrderedFastHashMap {
- OrderedFastHashMapWithLowercaseKeys(final int size) {
- super(size);
- }
- }
-
/** Logging support. */
private static final Log LOG = LogFactory.getLog(DefaultElementFactory.class);
/**
- * You can generate your own test cases by looking into ElementTestSource.generateTestForHtmlElements.
+ * You can generate your own test cases by looking into
+ * org.htmlunit.source.ElementTestSource#generateTestForHtmlElements(String, String).
*/
public static final List SUPPORTED_TAGS_ = Collections.unmodifiableList(Arrays.asList(
HtmlAbbreviated.TAG_NAME, HtmlAcronym.TAG_NAME,
@@ -118,6 +112,13 @@ static final class OrderedFastHashMapWithLowercaseKeys extends OrderedFast
HtmlVariable.TAG_NAME, HtmlVideo.TAG_NAME, HtmlWordBreak.TAG_NAME, HtmlExample.TAG_NAME
));
+ // for performance optimization
+ static final class OrderedFastHashMapWithLowercaseKeys extends OrderedFastHashMap {
+ OrderedFastHashMapWithLowercaseKeys(final int size) {
+ super(size);
+ }
+ }
+
/**
* @param page the owning page
* @param tagName the HTML tag name
diff --git a/src/main/java/org/htmlunit/html/DomCharacterData.java b/src/main/java/org/htmlunit/html/DomCharacterData.java
index 79e316a31fd..d760517aeb2 100644
--- a/src/main/java/org/htmlunit/html/DomCharacterData.java
+++ b/src/main/java/org/htmlunit/html/DomCharacterData.java
@@ -21,7 +21,7 @@
* Wrapper for the DOM node CharacterData.
*
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Philip Graf
* @author Ronald Brill
diff --git a/src/main/java/org/htmlunit/html/DomElement.java b/src/main/java/org/htmlunit/html/DomElement.java
index e2356510d30..6d1760742cd 100644
--- a/src/main/java/org/htmlunit/html/DomElement.java
+++ b/src/main/java/org/htmlunit/html/DomElement.java
@@ -71,7 +71,7 @@
/**
* @author Ahmed Ashour
* @author Marc Guillemot
- * @author Tom Anderson
+ * @author Tom Anderson
* @author Ronald Brill
* @author Frank Danek
* @author Sven Strickroth
diff --git a/src/main/java/org/htmlunit/html/DomNode.java b/src/main/java/org/htmlunit/html/DomNode.java
index 21db7e8fd08..bf45669f9e1 100644
--- a/src/main/java/org/htmlunit/html/DomNode.java
+++ b/src/main/java/org/htmlunit/html/DomNode.java
@@ -61,10 +61,10 @@
* Base class for nodes in the HTML DOM tree. This class is modeled after the
* W3C DOM specification, but does not implement it.
*
- * @author Mike Bowler
- * @author Mike J. Bresnahan
+ * @author Mike Bowler
+ * @author Mike J. Bresnahan
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Chris Erskine
* @author Mike Williams
* @author Marc Guillemot
@@ -73,7 +73,7 @@
* @author Ahmed Ashour
* @author Rodney Gitzel
* @author Sudhan Moghe
- * @author Tom Anderson
+ * @author Tom Anderson
* @author Ronald Brill
* @author Chuck Dumont
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/DomNodeList.java b/src/main/java/org/htmlunit/html/DomNodeList.java
index 3080c25e5ec..50a851abbf7 100644
--- a/src/main/java/org/htmlunit/html/DomNodeList.java
+++ b/src/main/java/org/htmlunit/html/DomNodeList.java
@@ -21,7 +21,7 @@
/**
* A list of {@link DomNode}s which is both a W3C {@link NodeList} and a java {@link List}.
*
- * @author Tom Anderson
+ * @author Tom Anderson
* @param the element type
*/
public interface DomNodeList extends NodeList, List {
diff --git a/src/main/java/org/htmlunit/html/DomText.java b/src/main/java/org/htmlunit/html/DomText.java
index a8f9982c4dc..3af794f3539 100644
--- a/src/main/java/org/htmlunit/html/DomText.java
+++ b/src/main/java/org/htmlunit/html/DomText.java
@@ -27,7 +27,7 @@
* Representation of a text node in the HTML DOM.
*
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Rodney Gitzel
* @author Ahmed Ashour
* @author Sudhan Moghe
diff --git a/src/main/java/org/htmlunit/html/ElementFactory.java b/src/main/java/org/htmlunit/html/ElementFactory.java
index e6ba4ce68ff..bf1eaffe4e6 100644
--- a/src/main/java/org/htmlunit/html/ElementFactory.java
+++ b/src/main/java/org/htmlunit/html/ElementFactory.java
@@ -20,7 +20,7 @@
/**
* Specification of a factory capable of creating {@link DomElement} objects.
*
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
*/
public interface ElementFactory {
diff --git a/src/main/java/org/htmlunit/html/HtmlAddress.java b/src/main/java/org/htmlunit/html/HtmlAddress.java
index f8c760e46d4..3ef3654944a 100644
--- a/src/main/java/org/htmlunit/html/HtmlAddress.java
+++ b/src/main/java/org/htmlunit/html/HtmlAddress.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "address".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlAnchor.java b/src/main/java/org/htmlunit/html/HtmlAnchor.java
index ba42f1b9857..6cf7560323f 100644
--- a/src/main/java/org/htmlunit/html/HtmlAnchor.java
+++ b/src/main/java/org/htmlunit/html/HtmlAnchor.java
@@ -24,6 +24,7 @@
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.Strings;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.htmlunit.BrowserVersion;
@@ -42,9 +43,9 @@
/**
* Wrapper for the HTML element "a".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Dmitri Zoubkov
* @author Ronald Brill
@@ -116,7 +117,7 @@ protected void doClickStateUpdate(final boolean shiftKey, final boolean ctrlKey,
}
final String downloadAttribute = getDownloadAttribute();
HtmlPage page = (HtmlPage) getPage();
- if (StringUtils.startsWithIgnoreCase(href, JavaScriptURLConnection.JAVASCRIPT_PREFIX)) {
+ if (Strings.CI.startsWith(href, JavaScriptURLConnection.JAVASCRIPT_PREFIX)) {
final StringBuilder builder = new StringBuilder(href.length());
builder.append(JavaScriptURLConnection.JAVASCRIPT_PREFIX);
for (int i = JavaScriptURLConnection.JAVASCRIPT_PREFIX.length(); i < href.length(); i++) {
diff --git a/src/main/java/org/htmlunit/html/HtmlArea.java b/src/main/java/org/htmlunit/html/HtmlArea.java
index 129b22d02d2..6dcf7d79267 100644
--- a/src/main/java/org/htmlunit/html/HtmlArea.java
+++ b/src/main/java/org/htmlunit/html/HtmlArea.java
@@ -23,6 +23,7 @@
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.Strings;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.htmlunit.SgmlPage;
@@ -39,9 +40,9 @@
/**
* Wrapper for the HTML element "area".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Marc Guillemot
* @author Ahmed Ashour
* @author Frank Danek
@@ -80,7 +81,7 @@ protected boolean doClickStateUpdate(final boolean shiftKey, final boolean ctrlK
final String href = getHrefAttribute().trim();
if (!href.isEmpty()) {
final HtmlPage page = (HtmlPage) getPage();
- if (StringUtils.startsWithIgnoreCase(href, JavaScriptURLConnection.JAVASCRIPT_PREFIX)) {
+ if (Strings.CI.startsWith(href, JavaScriptURLConnection.JAVASCRIPT_PREFIX)) {
page.executeJavaScript(
href, "javascript url", getStartLineNumber());
return false;
diff --git a/src/main/java/org/htmlunit/html/HtmlBase.java b/src/main/java/org/htmlunit/html/HtmlBase.java
index 3056fae6771..753762e7f86 100644
--- a/src/main/java/org/htmlunit/html/HtmlBase.java
+++ b/src/main/java/org/htmlunit/html/HtmlBase.java
@@ -21,8 +21,8 @@
/**
* Wrapper for the HTML element "base".
*
- * @author Mike Bowler
- * @author Christian Sell
+ * @author Mike Bowler
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlBaseFont.java b/src/main/java/org/htmlunit/html/HtmlBaseFont.java
index 77224e41f08..db82d9049fb 100644
--- a/src/main/java/org/htmlunit/html/HtmlBaseFont.java
+++ b/src/main/java/org/htmlunit/html/HtmlBaseFont.java
@@ -21,8 +21,8 @@
/**
* Wrapper for the HTML element "basefont".
*
- * @author Mike Bowler
- * @author Christian Sell
+ * @author Mike Bowler
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlBidirectionalOverride.java b/src/main/java/org/htmlunit/html/HtmlBidirectionalOverride.java
index 7442adc95eb..3400aaf6ffb 100644
--- a/src/main/java/org/htmlunit/html/HtmlBidirectionalOverride.java
+++ b/src/main/java/org/htmlunit/html/HtmlBidirectionalOverride.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "bdo".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Ronald Brill
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlBlockQuote.java b/src/main/java/org/htmlunit/html/HtmlBlockQuote.java
index a68b95825c1..7de3e17550f 100644
--- a/src/main/java/org/htmlunit/html/HtmlBlockQuote.java
+++ b/src/main/java/org/htmlunit/html/HtmlBlockQuote.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "blockquote".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlBody.java b/src/main/java/org/htmlunit/html/HtmlBody.java
index 762e03530ee..e67033a2dc7 100644
--- a/src/main/java/org/htmlunit/html/HtmlBody.java
+++ b/src/main/java/org/htmlunit/html/HtmlBody.java
@@ -23,9 +23,9 @@
/**
* Wrapper for the HTML element "body".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlBreak.java b/src/main/java/org/htmlunit/html/HtmlBreak.java
index 95faabb88c1..36774be11c0 100644
--- a/src/main/java/org/htmlunit/html/HtmlBreak.java
+++ b/src/main/java/org/htmlunit/html/HtmlBreak.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "br".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Ronald Brill
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlButton.java b/src/main/java/org/htmlunit/html/HtmlButton.java
index 0b060974104..9e5f5b8b26b 100644
--- a/src/main/java/org/htmlunit/html/HtmlButton.java
+++ b/src/main/java/org/htmlunit/html/HtmlButton.java
@@ -35,9 +35,9 @@
/**
* Wrapper for the HTML element "button".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author David D. Kilzer
* @author Daniel Gredler
* @author Ahmed Ashour
diff --git a/src/main/java/org/htmlunit/html/HtmlButtonInput.java b/src/main/java/org/htmlunit/html/HtmlButtonInput.java
index 401aaed4964..f4e5f0673e7 100644
--- a/src/main/java/org/htmlunit/html/HtmlButtonInput.java
+++ b/src/main/java/org/htmlunit/html/HtmlButtonInput.java
@@ -21,8 +21,8 @@
/**
* Wrapper for the HTML element "input" where type is "button".
*
- * @author Mike Bowler
- * @author Christian Sell
+ * @author Mike Bowler
+ * @author Christian Sell
* @author Daniel Gredler
* @author Ahmed Ashour
* @author Ronald Brill
diff --git a/src/main/java/org/htmlunit/html/HtmlCaption.java b/src/main/java/org/htmlunit/html/HtmlCaption.java
index 5d24f5eb7c7..3e6a9726648 100644
--- a/src/main/java/org/htmlunit/html/HtmlCaption.java
+++ b/src/main/java/org/htmlunit/html/HtmlCaption.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "caption".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlCenter.java b/src/main/java/org/htmlunit/html/HtmlCenter.java
index e7493cb46ee..e3e4b298254 100644
--- a/src/main/java/org/htmlunit/html/HtmlCenter.java
+++ b/src/main/java/org/htmlunit/html/HtmlCenter.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "center".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlCheckBoxInput.java b/src/main/java/org/htmlunit/html/HtmlCheckBoxInput.java
index 2309c933e94..2b7abe39d5a 100644
--- a/src/main/java/org/htmlunit/html/HtmlCheckBoxInput.java
+++ b/src/main/java/org/htmlunit/html/HtmlCheckBoxInput.java
@@ -23,10 +23,10 @@
/**
* Wrapper for the HTML element "input".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Jun Chen
- * @author Christian Sell
+ * @author Jun Chen
+ * @author Christian Sell
* @author Marc Guillemot
* @author Mike Bresnahan
* @author Daniel Gredler
diff --git a/src/main/java/org/htmlunit/html/HtmlDefinitionDescription.java b/src/main/java/org/htmlunit/html/HtmlDefinitionDescription.java
index 12fbd63545d..e9f0c8563e6 100644
--- a/src/main/java/org/htmlunit/html/HtmlDefinitionDescription.java
+++ b/src/main/java/org/htmlunit/html/HtmlDefinitionDescription.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "dd".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlDefinitionList.java b/src/main/java/org/htmlunit/html/HtmlDefinitionList.java
index 2d24cfa6039..d64a6735d4b 100644
--- a/src/main/java/org/htmlunit/html/HtmlDefinitionList.java
+++ b/src/main/java/org/htmlunit/html/HtmlDefinitionList.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "dl".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlDefinitionTerm.java b/src/main/java/org/htmlunit/html/HtmlDefinitionTerm.java
index 64511c1c4d7..0ed8687c73e 100644
--- a/src/main/java/org/htmlunit/html/HtmlDefinitionTerm.java
+++ b/src/main/java/org/htmlunit/html/HtmlDefinitionTerm.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "dt".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlDeletedText.java b/src/main/java/org/htmlunit/html/HtmlDeletedText.java
index 9cc465b4c15..797f7306285 100644
--- a/src/main/java/org/htmlunit/html/HtmlDeletedText.java
+++ b/src/main/java/org/htmlunit/html/HtmlDeletedText.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "del".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Ronald Brill
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlDirectory.java b/src/main/java/org/htmlunit/html/HtmlDirectory.java
index f65d92fc925..5ffc3833a55 100644
--- a/src/main/java/org/htmlunit/html/HtmlDirectory.java
+++ b/src/main/java/org/htmlunit/html/HtmlDirectory.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "dir".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlDivision.java b/src/main/java/org/htmlunit/html/HtmlDivision.java
index 716fbe2fb8a..de3f21eda6c 100644
--- a/src/main/java/org/htmlunit/html/HtmlDivision.java
+++ b/src/main/java/org/htmlunit/html/HtmlDivision.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "div".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlDomTreeWalker.java b/src/main/java/org/htmlunit/html/HtmlDomTreeWalker.java
index 0f6a9a7625e..9cd7d0b3b1b 100644
--- a/src/main/java/org/htmlunit/html/HtmlDomTreeWalker.java
+++ b/src/main/java/org/htmlunit/html/HtmlDomTreeWalker.java
@@ -27,7 +27,7 @@
*
* @see
* DOM-Level-2-Traversal-Range
- * @author Mike Dirolf
+ * @author Mike Dirolf
* @author Frank Danek
* @author Ahmed Ashour
* @author Ronald Brill
diff --git a/src/main/java/org/htmlunit/html/HtmlElement.java b/src/main/java/org/htmlunit/html/HtmlElement.java
index 8038fc5efd2..c02485d8247 100644
--- a/src/main/java/org/htmlunit/html/HtmlElement.java
+++ b/src/main/java/org/htmlunit/html/HtmlElement.java
@@ -58,10 +58,10 @@
/**
* An abstract wrapper for HTML elements.
*
- * @author Mike Bowler
- * @author Mike J. Bresnahan
+ * @author Mike Bowler
+ * @author Mike J. Bresnahan
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author David D. Kilzer
* @author Mike Gallaher
* @author Denis N. Antonioli
diff --git a/src/main/java/org/htmlunit/html/HtmlFieldSet.java b/src/main/java/org/htmlunit/html/HtmlFieldSet.java
index bfe0cc3fdee..90d7a807eaa 100644
--- a/src/main/java/org/htmlunit/html/HtmlFieldSet.java
+++ b/src/main/java/org/htmlunit/html/HtmlFieldSet.java
@@ -25,9 +25,9 @@
/**
* Wrapper for the HTML element "fieldset".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
* @author Ronald Brill
diff --git a/src/main/java/org/htmlunit/html/HtmlFileInput.java b/src/main/java/org/htmlunit/html/HtmlFileInput.java
index 5f95299fd61..93b3cf4d309 100644
--- a/src/main/java/org/htmlunit/html/HtmlFileInput.java
+++ b/src/main/java/org/htmlunit/html/HtmlFileInput.java
@@ -35,8 +35,8 @@
/**
* Wrapper for the HTML element "input".
*
- * @author Mike Bowler
- * @author Christian Sell
+ * @author Mike Bowler
+ * @author Christian Sell
* @author Daniel Gredler
* @author Ahmed Ashour
* @author Marc Guillemot
diff --git a/src/main/java/org/htmlunit/html/HtmlFont.java b/src/main/java/org/htmlunit/html/HtmlFont.java
index cd9df518051..2d7e043e7a5 100644
--- a/src/main/java/org/htmlunit/html/HtmlFont.java
+++ b/src/main/java/org/htmlunit/html/HtmlFont.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "font".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Rodney Gitzel
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlForm.java b/src/main/java/org/htmlunit/html/HtmlForm.java
index dd7797388f3..1fb417a067c 100644
--- a/src/main/java/org/htmlunit/html/HtmlForm.java
+++ b/src/main/java/org/htmlunit/html/HtmlForm.java
@@ -34,6 +34,7 @@
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.Strings;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.htmlunit.BrowserVersion;
@@ -59,10 +60,10 @@
/**
* Wrapper for the HTML element "form".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
* @author Brad Clarke
- * @author Christian Sell
+ * @author Christian Sell
* @author Marc Guillemot
* @author George Murnock
* @author Kent Tong
@@ -158,13 +159,13 @@ && getAttributeDirect(ATTRIBUTE_NOVALIDATE) != ATTRIBUTE_NOT_DEFINED) {
}
final String action = getActionAttribute().trim();
- if (StringUtils.startsWithIgnoreCase(action, JavaScriptURLConnection.JAVASCRIPT_PREFIX)) {
+ if (Strings.CI.startsWith(action, JavaScriptURLConnection.JAVASCRIPT_PREFIX)) {
htmlPage.executeJavaScript(action, "Form action", getStartLineNumber());
return;
}
}
else {
- if (StringUtils.startsWithIgnoreCase(getActionAttribute(), JavaScriptURLConnection.JAVASCRIPT_PREFIX)) {
+ if (Strings.CI.startsWith(getActionAttribute(), JavaScriptURLConnection.JAVASCRIPT_PREFIX)) {
// The action is JavaScript but JavaScript isn't enabled.
return;
}
diff --git a/src/main/java/org/htmlunit/html/HtmlFrame.java b/src/main/java/org/htmlunit/html/HtmlFrame.java
index 1759bc89df9..d45167edd5e 100644
--- a/src/main/java/org/htmlunit/html/HtmlFrame.java
+++ b/src/main/java/org/htmlunit/html/HtmlFrame.java
@@ -23,9 +23,9 @@
/**
* Wrapper for the HTML element "frame".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Marc Guillemot
* @author Ahmed Ashour
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlFrameSet.java b/src/main/java/org/htmlunit/html/HtmlFrameSet.java
index 72373a95208..3b92e295cf7 100644
--- a/src/main/java/org/htmlunit/html/HtmlFrameSet.java
+++ b/src/main/java/org/htmlunit/html/HtmlFrameSet.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "frameset".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
* @author Ronny Shapiro
diff --git a/src/main/java/org/htmlunit/html/HtmlHead.java b/src/main/java/org/htmlunit/html/HtmlHead.java
index 1644ec3a378..4704019776f 100644
--- a/src/main/java/org/htmlunit/html/HtmlHead.java
+++ b/src/main/java/org/htmlunit/html/HtmlHead.java
@@ -21,8 +21,8 @@
/**
* Wrapper for the HTML element "head".
*
- * @author Mike Bowler
- * @author Christian Sell
+ * @author Mike Bowler
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlHeading1.java b/src/main/java/org/htmlunit/html/HtmlHeading1.java
index e5eeefb519a..3ebf3d2f500 100644
--- a/src/main/java/org/htmlunit/html/HtmlHeading1.java
+++ b/src/main/java/org/htmlunit/html/HtmlHeading1.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "h1".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlHeading2.java b/src/main/java/org/htmlunit/html/HtmlHeading2.java
index e3524b607f6..06aad3be012 100644
--- a/src/main/java/org/htmlunit/html/HtmlHeading2.java
+++ b/src/main/java/org/htmlunit/html/HtmlHeading2.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "h2".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlHeading3.java b/src/main/java/org/htmlunit/html/HtmlHeading3.java
index fdcf4f0ab16..d748449ddcb 100644
--- a/src/main/java/org/htmlunit/html/HtmlHeading3.java
+++ b/src/main/java/org/htmlunit/html/HtmlHeading3.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "h3".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlHeading4.java b/src/main/java/org/htmlunit/html/HtmlHeading4.java
index 9755347b3fb..b089746ca2b 100644
--- a/src/main/java/org/htmlunit/html/HtmlHeading4.java
+++ b/src/main/java/org/htmlunit/html/HtmlHeading4.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "h4".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlHeading5.java b/src/main/java/org/htmlunit/html/HtmlHeading5.java
index 14d26988ca8..888a593cea5 100644
--- a/src/main/java/org/htmlunit/html/HtmlHeading5.java
+++ b/src/main/java/org/htmlunit/html/HtmlHeading5.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "h5".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlHeading6.java b/src/main/java/org/htmlunit/html/HtmlHeading6.java
index bf585172957..727ccfa79bf 100644
--- a/src/main/java/org/htmlunit/html/HtmlHeading6.java
+++ b/src/main/java/org/htmlunit/html/HtmlHeading6.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "h6".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlHiddenInput.java b/src/main/java/org/htmlunit/html/HtmlHiddenInput.java
index ed3cc0e36c7..db13fb85280 100644
--- a/src/main/java/org/htmlunit/html/HtmlHiddenInput.java
+++ b/src/main/java/org/htmlunit/html/HtmlHiddenInput.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "input" of type "hidden".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Daniel Gredler
* @author Marc Guillemot
* @author Ahmed Ashour
diff --git a/src/main/java/org/htmlunit/html/HtmlHorizontalRule.java b/src/main/java/org/htmlunit/html/HtmlHorizontalRule.java
index 2495a7cd555..3778f150a45 100644
--- a/src/main/java/org/htmlunit/html/HtmlHorizontalRule.java
+++ b/src/main/java/org/htmlunit/html/HtmlHorizontalRule.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "hr".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlImage.java b/src/main/java/org/htmlunit/html/HtmlImage.java
index ec90e4aa4f4..1955a7eba91 100644
--- a/src/main/java/org/htmlunit/html/HtmlImage.java
+++ b/src/main/java/org/htmlunit/html/HtmlImage.java
@@ -55,11 +55,11 @@
/**
* Wrapper for the HTML element "img".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
- * @author Knut Johannes Dahle
+ * @author Knut Johannes Dahle
* @author Ronald Brill
* @author Frank Danek
* @author Carsten Steul
diff --git a/src/main/java/org/htmlunit/html/HtmlImageInput.java b/src/main/java/org/htmlunit/html/HtmlImageInput.java
index e9c7b0f9139..fcbf85ab0ce 100644
--- a/src/main/java/org/htmlunit/html/HtmlImageInput.java
+++ b/src/main/java/org/htmlunit/html/HtmlImageInput.java
@@ -38,9 +38,9 @@
* Wrapper for the HTML element "input".
* HtmlUnit does not download the associated image for performance reasons.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Marc Guillemot
* @author Daniel Gredler
* @author Ahmed Ashour
diff --git a/src/main/java/org/htmlunit/html/HtmlInlineFrame.java b/src/main/java/org/htmlunit/html/HtmlInlineFrame.java
index d700d07815f..4646d94bd4b 100644
--- a/src/main/java/org/htmlunit/html/HtmlInlineFrame.java
+++ b/src/main/java/org/htmlunit/html/HtmlInlineFrame.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "iframe".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Marc Guillemot
* @author Ahmed Ashour
* @author Ronald Brill
diff --git a/src/main/java/org/htmlunit/html/HtmlInlineQuotation.java b/src/main/java/org/htmlunit/html/HtmlInlineQuotation.java
index 3197d7a7df9..0c74dfa2f8c 100644
--- a/src/main/java/org/htmlunit/html/HtmlInlineQuotation.java
+++ b/src/main/java/org/htmlunit/html/HtmlInlineQuotation.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "q".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Ronald Brill
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlInput.java b/src/main/java/org/htmlunit/html/HtmlInput.java
index 5cabcfdb7fc..3473b74ac81 100644
--- a/src/main/java/org/htmlunit/html/HtmlInput.java
+++ b/src/main/java/org/htmlunit/html/HtmlInput.java
@@ -48,9 +48,9 @@
/**
* Wrapper for the HTML element "input".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author David D. Kilzer
* @author Marc Guillemot
* @author Daniel Gredler
diff --git a/src/main/java/org/htmlunit/html/HtmlInsertedText.java b/src/main/java/org/htmlunit/html/HtmlInsertedText.java
index 3f65a4d2e3e..d19523338ae 100644
--- a/src/main/java/org/htmlunit/html/HtmlInsertedText.java
+++ b/src/main/java/org/htmlunit/html/HtmlInsertedText.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "ins".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Ronald Brill
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlLabel.java b/src/main/java/org/htmlunit/html/HtmlLabel.java
index 7ab63990ef7..3e3ff7b5b0e 100644
--- a/src/main/java/org/htmlunit/html/HtmlLabel.java
+++ b/src/main/java/org/htmlunit/html/HtmlLabel.java
@@ -25,9 +25,9 @@
/**
* Wrapper for the HTML element "label".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Marc Guillemot
* @author Ahmed Ashour
* @author Ronald Brill
diff --git a/src/main/java/org/htmlunit/html/HtmlLegend.java b/src/main/java/org/htmlunit/html/HtmlLegend.java
index 4eaa2c826ff..a21e0e1b25c 100644
--- a/src/main/java/org/htmlunit/html/HtmlLegend.java
+++ b/src/main/java/org/htmlunit/html/HtmlLegend.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "legend".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Ronald Brill
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlLink.java b/src/main/java/org/htmlunit/html/HtmlLink.java
index 481afdc3e38..58b0dd33bb5 100644
--- a/src/main/java/org/htmlunit/html/HtmlLink.java
+++ b/src/main/java/org/htmlunit/html/HtmlLink.java
@@ -43,9 +43,9 @@
* Wrapper for the HTML element "link". Note: This is not a clickable link,
* that one is an HtmlAnchor
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Marc Guillemot
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlListItem.java b/src/main/java/org/htmlunit/html/HtmlListItem.java
index 05ce4b5f967..a764bc74e79 100644
--- a/src/main/java/org/htmlunit/html/HtmlListItem.java
+++ b/src/main/java/org/htmlunit/html/HtmlListItem.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "li".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlMap.java b/src/main/java/org/htmlunit/html/HtmlMap.java
index bb248b3b4ef..d7a7f2638fe 100644
--- a/src/main/java/org/htmlunit/html/HtmlMap.java
+++ b/src/main/java/org/htmlunit/html/HtmlMap.java
@@ -22,9 +22,9 @@
/**
* Wrapper for the HTML element "map".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Ronald Brill
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlMenu.java b/src/main/java/org/htmlunit/html/HtmlMenu.java
index 4a920511bb6..8e5813c83fb 100644
--- a/src/main/java/org/htmlunit/html/HtmlMenu.java
+++ b/src/main/java/org/htmlunit/html/HtmlMenu.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "menu".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlMeta.java b/src/main/java/org/htmlunit/html/HtmlMeta.java
index cb73a6ce15b..a3cd0b0b691 100644
--- a/src/main/java/org/htmlunit/html/HtmlMeta.java
+++ b/src/main/java/org/htmlunit/html/HtmlMeta.java
@@ -23,8 +23,8 @@
/**
* Wrapper for the HTML element "meta".
*
- * @author Mike Bowler
- * @author Christian Sell
+ * @author Mike Bowler
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
* @author Ronald Brill
diff --git a/src/main/java/org/htmlunit/html/HtmlNoFrames.java b/src/main/java/org/htmlunit/html/HtmlNoFrames.java
index 928fe6b59f2..2dd1129adfa 100644
--- a/src/main/java/org/htmlunit/html/HtmlNoFrames.java
+++ b/src/main/java/org/htmlunit/html/HtmlNoFrames.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "noframes".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Marc Guillemot
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlNoScript.java b/src/main/java/org/htmlunit/html/HtmlNoScript.java
index 87cc03590e7..f3cc632c5bf 100644
--- a/src/main/java/org/htmlunit/html/HtmlNoScript.java
+++ b/src/main/java/org/htmlunit/html/HtmlNoScript.java
@@ -23,9 +23,9 @@
/**
* Wrapper for the HTML element "noscript".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Ronald Brill
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlObject.java b/src/main/java/org/htmlunit/html/HtmlObject.java
index e1464ff9003..f077a862402 100644
--- a/src/main/java/org/htmlunit/html/HtmlObject.java
+++ b/src/main/java/org/htmlunit/html/HtmlObject.java
@@ -26,9 +26,9 @@
/**
* Wrapper for the HTML element "object".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Ronald Brill
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlOption.java b/src/main/java/org/htmlunit/html/HtmlOption.java
index c0dda178ab6..06c9556a84d 100644
--- a/src/main/java/org/htmlunit/html/HtmlOption.java
+++ b/src/main/java/org/htmlunit/html/HtmlOption.java
@@ -28,9 +28,9 @@
/**
* Wrapper for the HTML element "option".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author David D. Kilzer
* @author Marc Guillemot
* @author Ahmed Ashour
diff --git a/src/main/java/org/htmlunit/html/HtmlOptionGroup.java b/src/main/java/org/htmlunit/html/HtmlOptionGroup.java
index a37dd3ba01c..50963b1e2f6 100644
--- a/src/main/java/org/htmlunit/html/HtmlOptionGroup.java
+++ b/src/main/java/org/htmlunit/html/HtmlOptionGroup.java
@@ -22,9 +22,9 @@
/**
* Wrapper for the HTML element "optgroup".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author David D. Kilzer
* @author Ahmed Ashour
* @author Daniel Gredler
diff --git a/src/main/java/org/htmlunit/html/HtmlOrderedList.java b/src/main/java/org/htmlunit/html/HtmlOrderedList.java
index 25e20d1c087..bf64019dabb 100644
--- a/src/main/java/org/htmlunit/html/HtmlOrderedList.java
+++ b/src/main/java/org/htmlunit/html/HtmlOrderedList.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "ol".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlPage.java b/src/main/java/org/htmlunit/html/HtmlPage.java
index f1e3c78da81..b5d236be33c 100644
--- a/src/main/java/org/htmlunit/html/HtmlPage.java
+++ b/src/main/java/org/htmlunit/html/HtmlPage.java
@@ -43,6 +43,7 @@
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.Strings;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.htmlunit.Cache;
@@ -116,12 +117,12 @@
*
*
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Alex Nikiforoff
* @author Noboru Sinohara
* @author David K. Taylor
* @author Andreas Hangler
- * @author Christian Sell
+ * @author Christian Sell
* @author Chris Erskine
* @author Marc Guillemot
* @author Ahmed Ashour
@@ -129,7 +130,7 @@
* @author Dmitri Zoubkov
* @author Sudhan Moghe
* @author Ethan Glasser-Camp
- * @author Tom Anderson
+ * @author Tom Anderson
* @author Ronald Brill
* @author Frank Danek
* @author Joerg Werner
@@ -938,7 +939,7 @@ public ScriptResult executeJavaScript(String sourceCode, final String sourceName
return new ScriptResult(JavaScriptEngine.UNDEFINED);
}
- if (StringUtils.startsWithIgnoreCase(sourceCode, JavaScriptURLConnection.JAVASCRIPT_PREFIX)) {
+ if (Strings.CI.startsWith(sourceCode, JavaScriptURLConnection.JAVASCRIPT_PREFIX)) {
sourceCode = sourceCode.substring(JavaScriptURLConnection.JAVASCRIPT_PREFIX.length()).trim();
if (sourceCode.startsWith("return ")) {
sourceCode = sourceCode.substring("return ".length());
@@ -1354,10 +1355,9 @@ private void executeRefreshIfNeeded() throws IOException {
final double time;
final URL url;
- int index = StringUtils.indexOfAnyBut(refreshString, "0123456789");
- final boolean timeOnly = index == -1;
+ final int index = StringUtils.indexOfAnyBut(refreshString, "0123456789.");
- if (timeOnly) {
+ if (index == -1) {
// Format:
try {
time = Double.parseDouble(refreshString);
@@ -1373,7 +1373,7 @@ private void executeRefreshIfNeeded() throws IOException {
else {
// Format:
try {
- time = Double.parseDouble(refreshString.substring(0, index).trim());
+ time = Double.parseDouble(refreshString.substring(0, index));
}
catch (final NumberFormatException e) {
if (LOG.isErrorEnabled()) {
@@ -1381,55 +1381,90 @@ private void executeRefreshIfNeeded() throws IOException {
}
return;
}
- index = refreshString.toLowerCase(Locale.ROOT).indexOf("url=", index);
- if (index == -1) {
- if (LOG.isErrorEnabled()) {
- LOG.error("Malformed refresh string (found ';' but no 'url='): " + refreshString);
- }
- return;
- }
- final StringBuilder builder = new StringBuilder(refreshString.substring(index + 4));
- if (StringUtils.isBlank(builder.toString())) {
- //content='10; URL=' is treated as content='10'
- url = getUrl();
- }
- else {
- if (builder.charAt(0) == '"' || builder.charAt(0) == 0x27) {
- builder.deleteCharAt(0);
- }
- if (builder.charAt(builder.length() - 1) == '"' || builder.charAt(builder.length() - 1) == 0x27) {
- builder.deleteCharAt(builder.length() - 1);
+
+ String urlPart = refreshString.substring(index);
+ final char separator = urlPart.charAt(0);
+ if (";, \r\n\t".indexOf(separator) >= 0) {
+ urlPart = StringUtils.stripStart(urlPart, ";, \r\n\t");
+ if (urlPart.toLowerCase(Locale.ROOT).startsWith("url")) {
+ urlPart = urlPart.substring(3);
+ urlPart = urlPart.trim();
+
+ if (urlPart.toLowerCase().startsWith("=")) {
+ urlPart = urlPart.substring(1);
+ urlPart = urlPart.trim();
+ }
}
- final String urlString = builder.toString();
- try {
- url = getFullyQualifiedUrl(urlString);
+
+ if (StringUtils.isBlank(urlPart)) {
+ //content='10; URL=' is treated as content='10'
+ url = getUrl();
}
- catch (final MalformedURLException e) {
- if (LOG.isErrorEnabled()) {
- LOG.error("Malformed URL in refresh string: " + refreshString, e);
+ else {
+ if (urlPart.charAt(0) == '"' || urlPart.charAt(0) == 0x27) {
+ urlPart = urlPart.substring(1);
+ }
+ if (urlPart.charAt(urlPart.length() - 1) == '"' || urlPart.charAt(urlPart.length() - 1) == 0x27) {
+ urlPart = urlPart.substring(0, urlPart.length() - 1);
+ }
+ try {
+ url = getFullyQualifiedUrl(urlPart);
+ }
+ catch (final MalformedURLException e) {
+ if (LOG.isErrorEnabled()) {
+ LOG.error("Malformed URL in refresh string: " + refreshString, e);
+ }
+ return;
}
- throw e;
}
}
+ else {
+ if (LOG.isErrorEnabled()) {
+ LOG.error("Malformed refresh string (separator after time missing): " + refreshString);
+ }
+ return;
+ }
}
- final int timeRounded = (int) time;
- checkRecursion();
- getWebClient().getRefreshHandler().handleRefresh(this, url, timeRounded);
+ processRefresh(url, time);
}
- private void checkRecursion() {
- final StackTraceElement[] elements = new Exception().getStackTrace();
- if (elements.length > 500) {
- for (int i = 0; i < 500; i++) {
- if (!elements[i].getClassName().startsWith("org.htmlunit.")) {
- return;
- }
- }
+ // this is different from what is done in org.htmlunit.WebClient.loadWebResponseFromWebConnection(WebRequest, int)
+ // because there we are directly replacing the response before loading the response into the window
+ // here we are replacing the page in the window (maybe after some time)
+ private void processRefresh(final URL url, final double time) throws IOException {
+ final WebClient webClient = getWebClient();
+
+ final int refreshLimit = webClient.getOptions().getPageRefreshLimit();
+ if (refreshLimit == 0) {
final WebResponse webResponse = getWebResponse();
- throw new FailingHttpStatusCodeException("Too much redirect for "
+ throw new FailingHttpStatusCodeException("Too many redirects for "
+ webResponse.getWebRequest().getUrl(), webResponse);
}
+
+ if (refreshLimit >= 0) {
+ final StackTraceElement[] elements = new Exception().getStackTrace();
+ int count = 0;
+ final int elementCountLimit = refreshLimit > 50 ? 400 : refreshLimit > 10 ? 80 : 5;
+ final int elementCount = elements.length;
+
+ if (elementCount > elementCountLimit) {
+ for (int i = 0; i < elementCount; i++) {
+ if ("processRefresh".equals(elements[i].getMethodName())
+ && "org.htmlunit.html.HtmlPage".equals(elements[i].getClassName())) {
+ count++;
+ if (count >= refreshLimit) {
+ final WebResponse webResponse = getWebResponse();
+ throw new FailingHttpStatusCodeException(
+ "Too many redirects (>= " + count + ") for "
+ + webResponse.getWebRequest().getUrl(), webResponse);
+ }
+ }
+ }
+ }
+ }
+
+ webClient.getRefreshHandler().handleRefresh(this, url, (int) time);
}
/**
diff --git a/src/main/java/org/htmlunit/html/HtmlParagraph.java b/src/main/java/org/htmlunit/html/HtmlParagraph.java
index c8e4cd21f4b..d9ce33c9c51 100644
--- a/src/main/java/org/htmlunit/html/HtmlParagraph.java
+++ b/src/main/java/org/htmlunit/html/HtmlParagraph.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "p".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Rodney Gitzel
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlParameter.java b/src/main/java/org/htmlunit/html/HtmlParameter.java
index c44aedaa1c3..1029a47a53b 100644
--- a/src/main/java/org/htmlunit/html/HtmlParameter.java
+++ b/src/main/java/org/htmlunit/html/HtmlParameter.java
@@ -21,8 +21,8 @@
/**
* Wrapper for the HTML element "param".
*
- * @author Mike Bowler
- * @author Christian Sell
+ * @author Mike Bowler
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Ronald Brill
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlPasswordInput.java b/src/main/java/org/htmlunit/html/HtmlPasswordInput.java
index 4e07ac633b3..086899cbffe 100644
--- a/src/main/java/org/htmlunit/html/HtmlPasswordInput.java
+++ b/src/main/java/org/htmlunit/html/HtmlPasswordInput.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "input".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Daniel Gredler
* @author Ahmed Ashour
* @author Ronald Brill
diff --git a/src/main/java/org/htmlunit/html/HtmlPreformattedText.java b/src/main/java/org/htmlunit/html/HtmlPreformattedText.java
index 265711cdbc2..072e14e069c 100644
--- a/src/main/java/org/htmlunit/html/HtmlPreformattedText.java
+++ b/src/main/java/org/htmlunit/html/HtmlPreformattedText.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "pre".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlRadioButtonInput.java b/src/main/java/org/htmlunit/html/HtmlRadioButtonInput.java
index d0eeb72b17d..cc0d1d591d4 100644
--- a/src/main/java/org/htmlunit/html/HtmlRadioButtonInput.java
+++ b/src/main/java/org/htmlunit/html/HtmlRadioButtonInput.java
@@ -25,9 +25,9 @@
/**
* Wrapper for the HTML element "input".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Marc Guillemot
* @author Mike Bresnahan
* @author Daniel Gredler
diff --git a/src/main/java/org/htmlunit/html/HtmlResetInput.java b/src/main/java/org/htmlunit/html/HtmlResetInput.java
index d7623a39f0c..cfb0a7cdbcb 100644
--- a/src/main/java/org/htmlunit/html/HtmlResetInput.java
+++ b/src/main/java/org/htmlunit/html/HtmlResetInput.java
@@ -22,9 +22,9 @@
/**
* Wrapper for the HTML element "input".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Daniel Gredler
* @author Ahmed Ashour
* @author Ronald Brill
diff --git a/src/main/java/org/htmlunit/html/HtmlScript.java b/src/main/java/org/htmlunit/html/HtmlScript.java
index 3c9cdec7d1b..03a3fc379a5 100644
--- a/src/main/java/org/htmlunit/html/HtmlScript.java
+++ b/src/main/java/org/htmlunit/html/HtmlScript.java
@@ -32,8 +32,8 @@
* (i.e. document.write("<span id='mySpan'/>"); document.getElementById("mySpan").tagName;
* can't work with a filter).
*
- * @author Mike Bowler
- * @author Christian Sell
+ * @author Mike Bowler
+ * @author Christian Sell
* @author Marc Guillemot
* @author David K. Taylor
* @author Ahmed Ashour
diff --git a/src/main/java/org/htmlunit/html/HtmlSelect.java b/src/main/java/org/htmlunit/html/HtmlSelect.java
index 5c3b99a774c..a72f1c359b0 100644
--- a/src/main/java/org/htmlunit/html/HtmlSelect.java
+++ b/src/main/java/org/htmlunit/html/HtmlSelect.java
@@ -36,10 +36,10 @@
/**
* Wrapper for the HTML element "select".
*
- * @author Mike Bowler
- * @author Mike J. Bresnahan
+ * @author Mike Bowler
+ * @author Mike J. Bresnahan
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author David D. Kilzer
* @author Marc Guillemot
* @author Daniel Gredler
diff --git a/src/main/java/org/htmlunit/html/HtmlSpan.java b/src/main/java/org/htmlunit/html/HtmlSpan.java
index abf2243c018..af08d48d033 100644
--- a/src/main/java/org/htmlunit/html/HtmlSpan.java
+++ b/src/main/java/org/htmlunit/html/HtmlSpan.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "span".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Rodney Gitzel
* @author Sudhan Moghe
diff --git a/src/main/java/org/htmlunit/html/HtmlStyle.java b/src/main/java/org/htmlunit/html/HtmlStyle.java
index d450ea6babc..4a069092a18 100644
--- a/src/main/java/org/htmlunit/html/HtmlStyle.java
+++ b/src/main/java/org/htmlunit/html/HtmlStyle.java
@@ -29,8 +29,8 @@
/**
* Wrapper for the HTML element "style".
*
- * @author Mike Bowler
- * @author Christian Sell
+ * @author Mike Bowler
+ * @author Christian Sell
* @author Marc Guillemot
* @author Ahmed Ashour
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlSubmitInput.java b/src/main/java/org/htmlunit/html/HtmlSubmitInput.java
index 3c1067d3788..be7078602d5 100644
--- a/src/main/java/org/htmlunit/html/HtmlSubmitInput.java
+++ b/src/main/java/org/htmlunit/html/HtmlSubmitInput.java
@@ -25,9 +25,9 @@
/**
* Wrapper for the HTML element "input".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Daniel Gredler
* @author Ahmed Ashour
* @author Marc Guillemot
diff --git a/src/main/java/org/htmlunit/html/HtmlTable.java b/src/main/java/org/htmlunit/html/HtmlTable.java
index 9d62e33c804..d7e4c824a35 100644
--- a/src/main/java/org/htmlunit/html/HtmlTable.java
+++ b/src/main/java/org/htmlunit/html/HtmlTable.java
@@ -28,9 +28,9 @@
/**
* Wrapper for the HTML element "table".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Ronald Brill
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlTableBody.java b/src/main/java/org/htmlunit/html/HtmlTableBody.java
index 6febca3b576..902b2dc4657 100644
--- a/src/main/java/org/htmlunit/html/HtmlTableBody.java
+++ b/src/main/java/org/htmlunit/html/HtmlTableBody.java
@@ -21,8 +21,8 @@
/**
* Wrapper for the HTML element "tbody".
*
- * @author Mike Bowler
- * @author Christian Sell
+ * @author Mike Bowler
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Ronald Brill
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlTableCell.java b/src/main/java/org/htmlunit/html/HtmlTableCell.java
index 591a495729e..59447d98c85 100644
--- a/src/main/java/org/htmlunit/html/HtmlTableCell.java
+++ b/src/main/java/org/htmlunit/html/HtmlTableCell.java
@@ -22,9 +22,9 @@
/**
* An abstract cell that provides the implementation for HtmlTableDataCell and HtmlTableHeaderCell.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
* @author Lai Quang Duong
diff --git a/src/main/java/org/htmlunit/html/HtmlTableColumn.java b/src/main/java/org/htmlunit/html/HtmlTableColumn.java
index 41b63761952..a974fd6ef15 100644
--- a/src/main/java/org/htmlunit/html/HtmlTableColumn.java
+++ b/src/main/java/org/htmlunit/html/HtmlTableColumn.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "col".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Ronald Brill
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlTableColumnGroup.java b/src/main/java/org/htmlunit/html/HtmlTableColumnGroup.java
index ac92ea5e2f6..0e965e4d7d3 100644
--- a/src/main/java/org/htmlunit/html/HtmlTableColumnGroup.java
+++ b/src/main/java/org/htmlunit/html/HtmlTableColumnGroup.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "colgroup".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Ronald Brill
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlTableDataCell.java b/src/main/java/org/htmlunit/html/HtmlTableDataCell.java
index 65693e08c7f..3871c756324 100644
--- a/src/main/java/org/htmlunit/html/HtmlTableDataCell.java
+++ b/src/main/java/org/htmlunit/html/HtmlTableDataCell.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "td".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlTableFooter.java b/src/main/java/org/htmlunit/html/HtmlTableFooter.java
index 38141b21ab9..3fbc9a21be0 100644
--- a/src/main/java/org/htmlunit/html/HtmlTableFooter.java
+++ b/src/main/java/org/htmlunit/html/HtmlTableFooter.java
@@ -21,8 +21,8 @@
/**
* Wrapper for the HTML element "tfoot".
*
- * @author Mike Bowler
- * @author Christian Sell
+ * @author Mike Bowler
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Ronald Brill
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlTableHeader.java b/src/main/java/org/htmlunit/html/HtmlTableHeader.java
index f53cdad68b3..ef04a08f5bd 100644
--- a/src/main/java/org/htmlunit/html/HtmlTableHeader.java
+++ b/src/main/java/org/htmlunit/html/HtmlTableHeader.java
@@ -21,8 +21,8 @@
/**
* Wrapper for the HTML element "thead".
*
- * @author Mike Bowler
- * @author Christian Sell
+ * @author Mike Bowler
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Ronald Brill
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlTableHeaderCell.java b/src/main/java/org/htmlunit/html/HtmlTableHeaderCell.java
index 40514eb6bc4..8dd2313dc44 100644
--- a/src/main/java/org/htmlunit/html/HtmlTableHeaderCell.java
+++ b/src/main/java/org/htmlunit/html/HtmlTableHeaderCell.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML "th" tag.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/HtmlTableRow.java b/src/main/java/org/htmlunit/html/HtmlTableRow.java
index 0afdd5f95a9..6d2b6d1a947 100644
--- a/src/main/java/org/htmlunit/html/HtmlTableRow.java
+++ b/src/main/java/org/htmlunit/html/HtmlTableRow.java
@@ -26,9 +26,9 @@
/**
* Wrapper for the HTML element "tr".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Ronald Brill
* @author Frank Danek
diff --git a/src/main/java/org/htmlunit/html/HtmlTextArea.java b/src/main/java/org/htmlunit/html/HtmlTextArea.java
index 8b32425c046..8bb9afbbd71 100644
--- a/src/main/java/org/htmlunit/html/HtmlTextArea.java
+++ b/src/main/java/org/htmlunit/html/HtmlTextArea.java
@@ -32,10 +32,10 @@
/**
* Wrapper for the HTML element "textarea".
*
- * @author Mike Bowler
- * @author Barnaby Court
+ * @author Mike Bowler
+ * @author Barnaby Court
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author David D. Kilzer
* @author Marc Guillemot
* @author Daniel Gredler
diff --git a/src/main/java/org/htmlunit/html/HtmlTextInput.java b/src/main/java/org/htmlunit/html/HtmlTextInput.java
index a50abdd9571..8159702abce 100644
--- a/src/main/java/org/htmlunit/html/HtmlTextInput.java
+++ b/src/main/java/org/htmlunit/html/HtmlTextInput.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "input" with type="text".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Daniel Gredler
* @author Ahmed Ashour
* @author Marc Guillemot
diff --git a/src/main/java/org/htmlunit/html/HtmlTitle.java b/src/main/java/org/htmlunit/html/HtmlTitle.java
index fc04a5c0b83..4adbd973e9d 100644
--- a/src/main/java/org/htmlunit/html/HtmlTitle.java
+++ b/src/main/java/org/htmlunit/html/HtmlTitle.java
@@ -21,8 +21,8 @@
/**
* Wrapper for the HTML element "title".
*
- * @author Mike Bowler
- * @author Christian Sell
+ * @author Mike Bowler
+ * @author Christian Sell
* @author Chris Erskine
* @author Marc Guillemot
* @author Ahmed Ashour
diff --git a/src/main/java/org/htmlunit/html/HtmlUnknownElement.java b/src/main/java/org/htmlunit/html/HtmlUnknownElement.java
index 0cd1dd74ead..5cc1b081f6b 100644
--- a/src/main/java/org/htmlunit/html/HtmlUnknownElement.java
+++ b/src/main/java/org/htmlunit/html/HtmlUnknownElement.java
@@ -24,9 +24,9 @@
/**
* An element that is returned for an HTML tag that is not supported by this framework.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Rodney Gitzel
* @author Ronald Brill
diff --git a/src/main/java/org/htmlunit/html/HtmlUnorderedList.java b/src/main/java/org/htmlunit/html/HtmlUnorderedList.java
index e12a0904b37..bff37df2169 100644
--- a/src/main/java/org/htmlunit/html/HtmlUnorderedList.java
+++ b/src/main/java/org/htmlunit/html/HtmlUnorderedList.java
@@ -21,9 +21,9 @@
/**
* Wrapper for the HTML element "ul".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Frank Danek
*/
diff --git a/src/main/java/org/htmlunit/html/ScriptElementSupport.java b/src/main/java/org/htmlunit/html/ScriptElementSupport.java
index 796c53d1a94..801fb7f55e3 100644
--- a/src/main/java/org/htmlunit/html/ScriptElementSupport.java
+++ b/src/main/java/org/htmlunit/html/ScriptElementSupport.java
@@ -19,6 +19,7 @@
import java.nio.charset.Charset;
import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.Strings;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.htmlunit.FailingHttpStatusCodeException;
@@ -297,7 +298,7 @@ public static boolean isJavaScript(String typeAttribute, final String languageAt
}
if (StringUtils.isNotEmpty(languageAttribute)) {
- return StringUtils.startsWithIgnoreCase(languageAttribute, "javascript");
+ return Strings.CI.startsWith(languageAttribute, "javascript");
}
return true;
}
diff --git a/src/main/java/org/htmlunit/html/SiblingDomNodeList.java b/src/main/java/org/htmlunit/html/SiblingDomNodeList.java
index b864693af43..ebd9b3148ad 100644
--- a/src/main/java/org/htmlunit/html/SiblingDomNodeList.java
+++ b/src/main/java/org/htmlunit/html/SiblingDomNodeList.java
@@ -23,7 +23,7 @@
/**
* An implementation of DomNodeList that is much less expensive for iteration.
*
- * @author Tom Anderson
+ * @author Tom Anderson
*/
class SiblingDomNodeList extends AbstractSequentialList implements DomNodeList {
diff --git a/src/main/java/org/htmlunit/html/SubmittableElement.java b/src/main/java/org/htmlunit/html/SubmittableElement.java
index b913146e4f9..90ad86f8d9d 100644
--- a/src/main/java/org/htmlunit/html/SubmittableElement.java
+++ b/src/main/java/org/htmlunit/html/SubmittableElement.java
@@ -19,7 +19,7 @@
/**
* An element that can have it's values sent to the server during a form submit.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Daniel Gredler
*/
public interface SubmittableElement {
diff --git a/src/main/java/org/htmlunit/html/TableRowGroup.java b/src/main/java/org/htmlunit/html/TableRowGroup.java
index c1befc12605..6f8633ad0d2 100644
--- a/src/main/java/org/htmlunit/html/TableRowGroup.java
+++ b/src/main/java/org/htmlunit/html/TableRowGroup.java
@@ -23,9 +23,9 @@
/**
* Superclass for the wrappers for the HTML elements "thead", "tbody" and "tfoot".
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author David K. Taylor
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author Daniel Gredler
* @author Ronald Brill
diff --git a/src/main/java/org/htmlunit/html/UnknownElementFactory.java b/src/main/java/org/htmlunit/html/UnknownElementFactory.java
index 4ecff7bab49..5c81a242a02 100644
--- a/src/main/java/org/htmlunit/html/UnknownElementFactory.java
+++ b/src/main/java/org/htmlunit/html/UnknownElementFactory.java
@@ -23,7 +23,7 @@
* A factory for elements encountered in parsing the input which are not represented
* by dedicated element classes.
*
- * @author Christian Sell
+ * @author Christian Sell
* @author Ahmed Ashour
* @author David K. Taylor
* @author Ronald Brill
diff --git a/src/main/java/org/htmlunit/html/parser/HTMLParser.java b/src/main/java/org/htmlunit/html/parser/HTMLParser.java
index 9df2e782538..c661097090f 100644
--- a/src/main/java/org/htmlunit/html/parser/HTMLParser.java
+++ b/src/main/java/org/htmlunit/html/parser/HTMLParser.java
@@ -27,7 +27,7 @@
/**
* Interface for the parser used to parse HTML into a HtmlUnit-specific DOM (HU-DOM) tree.
*
- * @author Christian Sell
+ * @author Christian Sell
* @author David K. Taylor
* @author Chris Erskine
* @author Ahmed Ashour
diff --git a/src/main/java/org/htmlunit/html/parser/HTMLParserDOMBuilder.java b/src/main/java/org/htmlunit/html/parser/HTMLParserDOMBuilder.java
index c12143e4a9f..f1fcb52377c 100644
--- a/src/main/java/org/htmlunit/html/parser/HTMLParserDOMBuilder.java
+++ b/src/main/java/org/htmlunit/html/parser/HTMLParserDOMBuilder.java
@@ -19,7 +19,7 @@
*
* Interface for the parser.
*
- * @author Christian Sell
+ * @author Christian Sell
* @author David K. Taylor
* @author Chris Erskine
* @author Ahmed Ashour
diff --git a/src/main/java/org/htmlunit/html/parser/neko/HtmlUnitNekoDOMBuilder.java b/src/main/java/org/htmlunit/html/parser/neko/HtmlUnitNekoDOMBuilder.java
index 4241ac13949..cd61bd95e6c 100644
--- a/src/main/java/org/htmlunit/html/parser/neko/HtmlUnitNekoDOMBuilder.java
+++ b/src/main/java/org/htmlunit/html/parser/neko/HtmlUnitNekoDOMBuilder.java
@@ -79,7 +79,7 @@
* the ContentHandler interface. Thus all parser APIs are kept private. The ContentHandler methods
* consume SAX events to build the page DOM
*
- * @author Christian Sell
+ * @author Christian Sell
* @author David K. Taylor
* @author Chris Erskine
* @author Ahmed Ashour
diff --git a/src/main/java/org/htmlunit/html/parser/neko/HtmlUnitNekoHtmlParser.java b/src/main/java/org/htmlunit/html/parser/neko/HtmlUnitNekoHtmlParser.java
index 89e5d3fbea2..24c79cb8ea7 100644
--- a/src/main/java/org/htmlunit/html/parser/neko/HtmlUnitNekoHtmlParser.java
+++ b/src/main/java/org/htmlunit/html/parser/neko/HtmlUnitNekoHtmlParser.java
@@ -56,7 +56,7 @@
* SAX parser implementation that uses the NekoHTML {@link org.htmlunit.cyberneko.HTMLConfiguration}
* to parse HTML into a HtmlUnit-specific DOM (HU-DOM) tree.
*
- * @author Christian Sell
+ * @author Christian Sell
* @author David K. Taylor
* @author Chris Erskine
* @author Ahmed Ashour
diff --git a/src/main/java/org/htmlunit/html/serializer/HtmlSerializerInnerOuterText.java b/src/main/java/org/htmlunit/html/serializer/HtmlSerializerInnerOuterText.java
index 3e919e6a3df..455b1656f10 100644
--- a/src/main/java/org/htmlunit/html/serializer/HtmlSerializerInnerOuterText.java
+++ b/src/main/java/org/htmlunit/html/serializer/HtmlSerializerInnerOuterText.java
@@ -387,9 +387,9 @@ public void append(final String content, final Mode mode) {
}
length--;
- int i = -1;
- for (char c : content.toCharArray()) {
- i++;
+ final int contentLenght = content.length();
+ for (int i = 0; i < contentLenght; i++) {
+ char c = content.charAt(i);
// handle \r
if (c == '\r') {
diff --git a/src/main/java/org/htmlunit/html/serializer/HtmlSerializerNormalizedText.java b/src/main/java/org/htmlunit/html/serializer/HtmlSerializerNormalizedText.java
index 9be60feb6dd..7b886cd3555 100644
--- a/src/main/java/org/htmlunit/html/serializer/HtmlSerializerNormalizedText.java
+++ b/src/main/java/org/htmlunit/html/serializer/HtmlSerializerNormalizedText.java
@@ -638,7 +638,10 @@ public void append(final String content, final Mode mode) {
}
boolean crFound = false;
- for (final char c : text.toCharArray()) {
+ final int textLenght = text.length();
+ for (int i = 0; i < textLenght; i++) {
+ final char c = text.charAt(i);
+
if (mode == Mode.NORMALIZE) {
if (isSpace(c)) {
switch (state_) {
diff --git a/src/main/java/org/htmlunit/html/serializer/HtmlSerializerVisibleText.java b/src/main/java/org/htmlunit/html/serializer/HtmlSerializerVisibleText.java
index 435a3d22201..cc3b345eabb 100644
--- a/src/main/java/org/htmlunit/html/serializer/HtmlSerializerVisibleText.java
+++ b/src/main/java/org/htmlunit/html/serializer/HtmlSerializerVisibleText.java
@@ -812,9 +812,9 @@ public void append(final String content, final Mode mode) {
}
length--;
- int i = -1;
- for (char c : content.toCharArray()) {
- i++;
+ final int contentLenght = content.length();
+ for (int i = 0; i < contentLenght; i++) {
+ char c = content.charAt(i);
// handle \r
if (c == '\r') {
diff --git a/src/main/java/org/htmlunit/httpclient/HtmlUnitBrowserCompatCookieSpec.java b/src/main/java/org/htmlunit/httpclient/HtmlUnitBrowserCompatCookieSpec.java
index fce1220057f..977ce63d5d2 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitBrowserCompatCookieSpec.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitBrowserCompatCookieSpec.java
@@ -56,7 +56,7 @@
* Implementation is based on the HttpClient code.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Noboru Sinohara
* @author David D. Kilzer
* @author Marc Guillemot
diff --git a/src/main/java/org/htmlunit/httpclient/HtmlUnitExpiresHandler.java b/src/main/java/org/htmlunit/httpclient/HtmlUnitExpiresHandler.java
index 733632c4e33..7920982320c 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitExpiresHandler.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitExpiresHandler.java
@@ -28,7 +28,7 @@
/**
* Customized BasicExpiresHandler for HtmlUnit.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Noboru Sinohara
* @author David D. Kilzer
* @author Marc Guillemot
diff --git a/src/main/java/org/htmlunit/httpclient/HtmlUnitHttpOnlyHandler.java b/src/main/java/org/htmlunit/httpclient/HtmlUnitHttpOnlyHandler.java
index ea38eba236c..542ad79a7f0 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitHttpOnlyHandler.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitHttpOnlyHandler.java
@@ -24,7 +24,7 @@
/**
* Customized CookieAttributeHandler for handling of the httponly attribute.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Noboru Sinohara
* @author David D. Kilzer
* @author Marc Guillemot
diff --git a/src/main/java/org/htmlunit/httpclient/HtmlUnitPathHandler.java b/src/main/java/org/htmlunit/httpclient/HtmlUnitPathHandler.java
index ec1385557a1..9cbe9bc0fa0 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitPathHandler.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitPathHandler.java
@@ -22,7 +22,7 @@
/**
* Customized BasicPathHandler for HtmlUnit.
*
- * @author Mike Bowler
+ * @author Mike Bowler
* @author Noboru Sinohara
* @author David D. Kilzer
* @author Marc Guillemot
diff --git a/src/main/java/org/htmlunit/javascript/AbstractJavaScriptEngine.java b/src/main/java/org/htmlunit/javascript/AbstractJavaScriptEngine.java
index 29a558c6080..fffde2ef763 100644
--- a/src/main/java/org/htmlunit/javascript/AbstractJavaScriptEngine.java
+++ b/src/main/java/org/htmlunit/javascript/AbstractJavaScriptEngine.java
@@ -25,11 +25,11 @@
*
* @param \n"
+ + "