cssparser: support plain color definitions with var/calc.
diff --git a/src/main/java/org/htmlunit/BrowserVersion.java b/src/main/java/org/htmlunit/BrowserVersion.java
index 274518314a9..eca62e39bed 100644
--- a/src/main/java/org/htmlunit/BrowserVersion.java
+++ b/src/main/java/org/htmlunit/BrowserVersion.java
@@ -64,7 +64,7 @@
public final class BrowserVersion implements Serializable {
/** Latest Firefox. */
- public static final BrowserVersion FIREFOX = new BrowserVersion(133, "FF");
+ public static final BrowserVersion FIREFOX = new BrowserVersion(134, "FF");
private static final int FIREFOX_ESR_NUMERIC = 128;
@@ -72,10 +72,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(131, "Edge");
+ public static final BrowserVersion EDGE = new BrowserVersion(132, "Edge");
/** Latest Chrome. */
- public static final BrowserVersion CHROME = new BrowserVersion(131, "Chrome");
+ public static final BrowserVersion CHROME = new BrowserVersion(132, "Chrome");
/**
* Array with all supported browsers.
@@ -195,9 +195,9 @@ public final class BrowserVersion implements Serializable {
CHROME.imgAcceptHeader_ = "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8";
CHROME.cssAcceptHeader_ = "text/css,*/*;q=0.1";
CHROME.scriptAcceptHeader_ = "*/*";
- CHROME.secClientHintUserAgentHeader_ = "\"Google Chrome\";v=\""
- + CHROME.getBrowserVersionNumeric() + "\", \"Chromium\";v=\""
- + CHROME.getBrowserVersionNumeric() + "\", \"Not_A Brand\";v=\"24\"";
+ CHROME.secClientHintUserAgentHeader_ = "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\""
+ + CHROME.getBrowserVersionNumeric() + "\", \"Google Chrome\";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,
27, 28, 30, 31, 32, 33, 34, 36, 37, 37, 38, 40, 42, 43, 44, 45, 47, 48, 48, 49, 51, 52, 53, 54, 55, 57,
diff --git a/src/main/java/org/htmlunit/WebClientOptions.java b/src/main/java/org/htmlunit/WebClientOptions.java
index 092ee7fb86e..65748a875f2 100644
--- a/src/main/java/org/htmlunit/WebClientOptions.java
+++ b/src/main/java/org/htmlunit/WebClientOptions.java
@@ -55,7 +55,7 @@ public class WebClientOptions implements Serializable {
private KeyStore sslClientCertificateStore_;
private char[] sslClientCertificatePassword_;
- private KeyStore sslTrustStore_;
+ private transient KeyStore sslTrustStore_;
private String[] sslClientProtocols_;
private String[] sslClientCipherSuites_;
@@ -541,6 +541,7 @@ public String getSSLInsecureProtocol() {
/**
* Sets the SSL server certificate trust store. All server certificates will be validated against
* this trust store.
+ * This property is transient (because KeyStore is not serializable)
*
* The needed parameters are used to construct a {@link java.security.KeyStore}.
*
@@ -564,6 +565,7 @@ void setSSLTrustStore(final KeyStore keyStore) {
/**
* Gets the SSL TrustStore.
+ *
This property is transient (because KeyStore is not serializable)
* @return the SSL TrustStore for insecure SSL connections
*/
public KeyStore getSSLTrustStore() {
@@ -848,7 +850,7 @@ public void setGeolocation(final Geolocation geolocation) {
geolocation_ = geolocation;
}
- public static class Geolocation {
+ public static class Geolocation implements Serializable {
private final double accuracy_;
private final double latitude_;
private final double longitude_;
diff --git a/src/main/java/org/htmlunit/css/StyleAttributes.java b/src/main/java/org/htmlunit/css/StyleAttributes.java
index 40764c86553..04c778afcd1 100644
--- a/src/main/java/org/htmlunit/css/StyleAttributes.java
+++ b/src/main/java/org/htmlunit/css/StyleAttributes.java
@@ -695,10 +695,10 @@ public enum Definition {
BORDER_RIGHT_WIDTH_("border-right-width", "border-right-width", ff("0px")),
/** The style property {@code borderSpacing}. */
- BORDER_SPACING("borderSpacing", "border-spacing", chromeAndEdge("0px 0px"), ff("0px 0px")),
+ BORDER_SPACING("borderSpacing", "border-spacing", chromeAndEdge("0px 0px"), ffEsr("0px 0px"), ffLatest("0px")),
/** The style property {@code border-spacing}. */
- BORDER_SPACING_("border-spacing", "border-spacing", ff("0px 0px")),
+ BORDER_SPACING_("border-spacing", "border-spacing", ffEsr("0px 0px"), ffLatest("0px")),
/** The style property {@code borderStartEndRadius}. */
BORDER_START_END_RADIUS("borderStartEndRadius", "border-start-end-radius", chromeAndEdge("0px"), ff("0px")),
diff --git a/src/main/java/org/htmlunit/html/DomAttr.java b/src/main/java/org/htmlunit/html/DomAttr.java
index a126dc5c166..19affc2d36d 100644
--- a/src/main/java/org/htmlunit/html/DomAttr.java
+++ b/src/main/java/org/htmlunit/html/DomAttr.java
@@ -108,7 +108,13 @@ public void setNodeValue(final String value) {
*/
@Override
public void setValue(final String value) {
- value_ = value;
+ if (value != null
+ && value.isEmpty()) {
+ value_ = DomElement.ATTRIBUTE_VALUE_EMPTY;
+ }
+ else {
+ value_ = value;
+ }
specified_ = true;
}
diff --git a/src/main/java/org/htmlunit/html/HtmlDomTreeWalker.java b/src/main/java/org/htmlunit/html/HtmlDomTreeWalker.java
index 594a3dc760b..e2db02a4411 100644
--- a/src/main/java/org/htmlunit/html/HtmlDomTreeWalker.java
+++ b/src/main/java/org/htmlunit/html/HtmlDomTreeWalker.java
@@ -14,6 +14,8 @@
*/
package org.htmlunit.html;
+import java.io.Serializable;
+
import org.w3c.dom.DOMException;
import org.w3c.dom.Node;
import org.w3c.dom.traversal.NodeFilter;
@@ -30,7 +32,7 @@
* @author Ahmed Ashour
* @author Ronald Brill
*/
-public class HtmlDomTreeWalker {
+public class HtmlDomTreeWalker implements Serializable {
private final DomNode root_;
private DomNode currentNode_;
diff --git a/src/main/java/org/htmlunit/javascript/JavaScriptEngine.java b/src/main/java/org/htmlunit/javascript/JavaScriptEngine.java
index 0c429bddfdf..197daeef1cd 100644
--- a/src/main/java/org/htmlunit/javascript/JavaScriptEngine.java
+++ b/src/main/java/org/htmlunit/javascript/JavaScriptEngine.java
@@ -423,7 +423,7 @@ public static void configureRhino(final WebClient webClient,
NumberCustom.class, ScriptableObject.DONTENUM);
// remove some objects, that Rhino defines in top scope but that we don't want
- deleteProperties(scope, "Continuation", "StopIteration", "BigInt");
+ deleteProperties(scope, "Continuation", "StopIteration");
if (!browserVersion.hasFeature(JS_ITERATOR_VISIBLE_IN_WINDOW)) {
deleteProperties(scope, "Iterator");
}
diff --git a/src/site/xdoc/index.xml b/src/site/xdoc/index.xml
index ef3136d9d03..2529e6664f4 100644
--- a/src/site/xdoc/index.xml
+++ b/src/site/xdoc/index.xml
@@ -83,9 +83,9 @@
- Latest release January 12, 2025
+ Latest release January 22, 2025
- version 4.8.0
+ version 4.9.0
Source code
@@ -210,7 +210,7 @@
org.htmlunit
htmlunit
- 4.8.0
+ 4.9.0
]]>
diff --git a/src/test/java/org/htmlunit/BrowserVersion2Test.java b/src/test/java/org/htmlunit/BrowserVersion2Test.java
index a5bf89c4535..f672b7c6c13 100644
--- a/src/test/java/org/htmlunit/BrowserVersion2Test.java
+++ b/src/test/java/org/htmlunit/BrowserVersion2Test.java
@@ -20,7 +20,7 @@
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/BrowserVersionTest.java b/src/test/java/org/htmlunit/BrowserVersionTest.java
index a74d00fb817..4c3a60bd475 100644
--- a/src/test/java/org/htmlunit/BrowserVersionTest.java
+++ b/src/test/java/org/htmlunit/BrowserVersionTest.java
@@ -38,10 +38,10 @@ public class BrowserVersionTest {
*/
@Test
public void getBrowserVersionNumeric() {
- assertEquals(133, BrowserVersion.FIREFOX.getBrowserVersionNumeric());
+ assertEquals(134, BrowserVersion.FIREFOX.getBrowserVersionNumeric());
assertEquals(128, BrowserVersion.FIREFOX_ESR.getBrowserVersionNumeric());
- assertEquals(131, BrowserVersion.CHROME.getBrowserVersionNumeric());
- assertEquals(131, BrowserVersion.EDGE.getBrowserVersionNumeric());
+ assertEquals(132, BrowserVersion.CHROME.getBrowserVersionNumeric());
+ assertEquals(132, BrowserVersion.EDGE.getBrowserVersionNumeric());
}
/**
diff --git a/src/test/java/org/htmlunit/CacheTest.java b/src/test/java/org/htmlunit/CacheTest.java
index 9aca1a0407f..3764dccafc9 100644
--- a/src/test/java/org/htmlunit/CacheTest.java
+++ b/src/test/java/org/htmlunit/CacheTest.java
@@ -35,7 +35,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.http.HttpStatus;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.htmlunit.util.mocks.WebResponseMock;
diff --git a/src/test/java/org/htmlunit/CookieManager2Test.java b/src/test/java/org/htmlunit/CookieManager2Test.java
index 915d1c6f755..4c743d6cb65 100644
--- a/src/test/java/org/htmlunit/CookieManager2Test.java
+++ b/src/test/java/org/htmlunit/CookieManager2Test.java
@@ -22,7 +22,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.Cookie;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/CookieManager4Test.java b/src/test/java/org/htmlunit/CookieManager4Test.java
index 533bfc1a73d..13d2a2a0ff2 100644
--- a/src/test/java/org/htmlunit/CookieManager4Test.java
+++ b/src/test/java/org/htmlunit/CookieManager4Test.java
@@ -27,8 +27,8 @@
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.junit.Before;
diff --git a/src/test/java/org/htmlunit/CookieManagerTest.java b/src/test/java/org/htmlunit/CookieManagerTest.java
index 67eaec733c6..46ba3da7268 100644
--- a/src/test/java/org/htmlunit/CookieManagerTest.java
+++ b/src/test/java/org/htmlunit/CookieManagerTest.java
@@ -26,7 +26,7 @@
import org.apache.http.client.utils.DateUtils;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/DefaultCredentialsProvider2Test.java b/src/test/java/org/htmlunit/DefaultCredentialsProvider2Test.java
index 724f6cf9bd0..432bc690c94 100644
--- a/src/test/java/org/htmlunit/DefaultCredentialsProvider2Test.java
+++ b/src/test/java/org/htmlunit/DefaultCredentialsProvider2Test.java
@@ -28,7 +28,7 @@
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.htmlunit.html.HtmlPage;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/ErrorOutputCheckerTest.java b/src/test/java/org/htmlunit/ErrorOutputCheckerTest.java
index c9f8b0b347a..f9b2e3aa74e 100644
--- a/src/test/java/org/htmlunit/ErrorOutputCheckerTest.java
+++ b/src/test/java/org/htmlunit/ErrorOutputCheckerTest.java
@@ -15,7 +15,7 @@
package org.htmlunit;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/ExternalTest.java b/src/test/java/org/htmlunit/ExternalTest.java
index 2cac8dcd0c4..36aa1566f37 100644
--- a/src/test/java/org/htmlunit/ExternalTest.java
+++ b/src/test/java/org/htmlunit/ExternalTest.java
@@ -55,11 +55,11 @@ public class ExternalTest {
static String MAVEN_REPO_URL_ = "https://repo1.maven.org/maven2/";
/** Chrome driver. */
- static String CHROME_DRIVER_ = "131.0.6778";
+ static String CHROME_DRIVER_ = "132.0.6834";
static String CHROME_DRIVER_URL_ =
"https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json";
- static String EDGE_DRIVER_ = "130.0.2849";
+ static String EDGE_DRIVER_ = "132.0.2957";
static String EDGE_DRIVER_URL_ = "https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/";
/** Gecko driver. */
diff --git a/src/test/java/org/htmlunit/History2Test.java b/src/test/java/org/htmlunit/History2Test.java
index 87d9001cf13..6eafdc13360 100644
--- a/src/test/java/org/htmlunit/History2Test.java
+++ b/src/test/java/org/htmlunit/History2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/HistoryTest.java b/src/test/java/org/htmlunit/HistoryTest.java
index da9ceee8d4b..797df7bee09 100644
--- a/src/test/java/org/htmlunit/HistoryTest.java
+++ b/src/test/java/org/htmlunit/HistoryTest.java
@@ -29,7 +29,7 @@
import javax.servlet.http.HttpServletResponse;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Assert;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/HttpWebConnection3Test.java b/src/test/java/org/htmlunit/HttpWebConnection3Test.java
index ea0cb8848fc..9a58ea8b174 100644
--- a/src/test/java/org/htmlunit/HttpWebConnection3Test.java
+++ b/src/test/java/org/htmlunit/HttpWebConnection3Test.java
@@ -24,10 +24,10 @@
import org.apache.commons.lang3.StringUtils;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
-import org.htmlunit.junit.BrowserRunner.OS;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
+import org.htmlunit.junit.annotation.OS;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/NoHttpResponseTest.java b/src/test/java/org/htmlunit/NoHttpResponseTest.java
index ec87af43283..d20e6e1fc1a 100644
--- a/src/test/java/org/htmlunit/NoHttpResponseTest.java
+++ b/src/test/java/org/htmlunit/NoHttpResponseTest.java
@@ -21,8 +21,8 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.After;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
diff --git a/src/test/java/org/htmlunit/NotYetImplementedTest.java b/src/test/java/org/htmlunit/NotYetImplementedTest.java
index 33f452acd72..d16ebc43688 100644
--- a/src/test/java/org/htmlunit/NotYetImplementedTest.java
+++ b/src/test/java/org/htmlunit/NotYetImplementedTest.java
@@ -58,6 +58,7 @@ private void process(final File dir) throws IOException {
else {
if (fileName.endsWith(".java")
&& !"SimpleWebTestCase.java".equals(fileName)
+ && !"AnnotationUtilsTest.java".equals(fileName)
&& !"NotYetImplementedTest.java".equals(fileName)
&& !"CodeStyleTest.java".equals(fileName)) {
final List lines = FileUtils.readLines(file, ISO_8859_1);
diff --git a/src/test/java/org/htmlunit/PageReloadTest.java b/src/test/java/org/htmlunit/PageReloadTest.java
index c862bf30787..3246e5a2d78 100644
--- a/src/test/java/org/htmlunit/PageReloadTest.java
+++ b/src/test/java/org/htmlunit/PageReloadTest.java
@@ -17,7 +17,7 @@
import java.net.URL;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/SgmlPage2Test.java b/src/test/java/org/htmlunit/SgmlPage2Test.java
index 8eeb8e8b949..6611c52eaa8 100644
--- a/src/test/java/org/htmlunit/SgmlPage2Test.java
+++ b/src/test/java/org/htmlunit/SgmlPage2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/TopLevelWindowTest.java b/src/test/java/org/htmlunit/TopLevelWindowTest.java
index 843c1231225..6cdbe6a52c2 100644
--- a/src/test/java/org/htmlunit/TopLevelWindowTest.java
+++ b/src/test/java/org/htmlunit/TopLevelWindowTest.java
@@ -25,7 +25,7 @@
import org.htmlunit.javascript.background.JavaScriptJob;
import org.htmlunit.javascript.background.JavaScriptJobManager;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/WebClient2Test.java b/src/test/java/org/htmlunit/WebClient2Test.java
index c8f19f107d5..dd947fcbc80 100644
--- a/src/test/java/org/htmlunit/WebClient2Test.java
+++ b/src/test/java/org/htmlunit/WebClient2Test.java
@@ -28,10 +28,10 @@
import org.apache.commons.lang3.SerializationUtils;
import org.htmlunit.html.HtmlPage;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
-import org.htmlunit.junit.Retry;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
+import org.htmlunit.junit.annotation.Retry;
import org.htmlunit.util.Cookie;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/WebClient3Test.java b/src/test/java/org/htmlunit/WebClient3Test.java
index 0d5fd725786..32c903e610c 100644
--- a/src/test/java/org/htmlunit/WebClient3Test.java
+++ b/src/test/java/org/htmlunit/WebClient3Test.java
@@ -28,9 +28,9 @@
import org.apache.commons.io.IOUtils;
import org.htmlunit.html.HtmlInlineFrame;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/WebClient6Test.java b/src/test/java/org/htmlunit/WebClient6Test.java
index 50ed8494ae7..130b1cbc786 100644
--- a/src/test/java/org/htmlunit/WebClient6Test.java
+++ b/src/test/java/org/htmlunit/WebClient6Test.java
@@ -20,8 +20,8 @@
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.NameValuePair;
import org.junit.Assert;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/WebClient7Test.java b/src/test/java/org/htmlunit/WebClient7Test.java
index 8bfa8df474d..3a365ddba68 100644
--- a/src/test/java/org/htmlunit/WebClient7Test.java
+++ b/src/test/java/org/htmlunit/WebClient7Test.java
@@ -18,9 +18,9 @@
import java.nio.charset.Charset;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/WebClientOptionsTest.java b/src/test/java/org/htmlunit/WebClientOptionsTest.java
index d2af684c155..fbcc6816c7b 100644
--- a/src/test/java/org/htmlunit/WebClientOptionsTest.java
+++ b/src/test/java/org/htmlunit/WebClientOptionsTest.java
@@ -14,6 +14,8 @@
*/
package org.htmlunit;
+import java.security.KeyStore;
+
import javax.net.ssl.SSLContext;
import org.apache.commons.lang3.SerializationUtils;
@@ -48,6 +50,9 @@ public void serialization() throws Exception {
assertEquals(original.isThrowExceptionOnScriptError(), deserialized.isThrowExceptionOnScriptError());
assertEquals(original.isPopupBlockerEnabled(), deserialized.isPopupBlockerEnabled());
assertEquals(original.isRedirectEnabled(), deserialized.isRedirectEnabled());
+
+ assertEquals(original.isGeolocationEnabled(), deserialized.isGeolocationEnabled());
+ assertEquals(original.getGeolocation(), deserialized.getGeolocation());
}
/**
@@ -65,6 +70,9 @@ public void serializationChanged() throws Exception {
original.setPopupBlockerEnabled(true);
original.setRedirectEnabled(false);
+ original.setGeolocationEnabled(true);
+ original.setGeolocation(new WebClientOptions.Geolocation(1d, 2d, 3d, 4d, 5d, 6d, 7d));
+
final byte[] bytes = SerializationUtils.serialize(original);
final WebClientOptions deserialized = (WebClientOptions) SerializationUtils.deserialize(bytes);
@@ -77,6 +85,16 @@ public void serializationChanged() throws Exception {
assertEquals(original.isThrowExceptionOnScriptError(), deserialized.isThrowExceptionOnScriptError());
assertEquals(original.isPopupBlockerEnabled(), deserialized.isPopupBlockerEnabled());
assertEquals(original.isRedirectEnabled(), deserialized.isRedirectEnabled());
+
+ assertEquals(original.isGeolocationEnabled(), deserialized.isGeolocationEnabled());
+ assertEquals(original.getGeolocation().getAccuracy(), deserialized.getGeolocation().getAccuracy());
+ assertEquals(original.getGeolocation().getLatitude(), deserialized.getGeolocation().getLatitude());
+ assertEquals(original.getGeolocation().getLongitude(), deserialized.getGeolocation().getLongitude());
+ assertEquals(original.getGeolocation().getAltitude(), deserialized.getGeolocation().getAltitude());
+ assertEquals(original.getGeolocation().getAltitudeAccuracy(),
+ deserialized.getGeolocation().getAltitudeAccuracy());
+ assertEquals(original.getGeolocation().getHeading(), deserialized.getGeolocation().getHeading());
+ assertEquals(original.getGeolocation().getSpeed(), deserialized.getGeolocation().getSpeed());
}
/**
@@ -92,4 +110,20 @@ public void serializationSSLContextProvider() throws Exception {
assertNull(deserialized.getSSLContext());
}
+
+ /**
+ * @throws Exception if an error occurs
+ */
+ @Test
+ public void serializationSSLTrustStore() throws Exception {
+ final WebClientOptions original = new WebClientOptions();
+
+ final KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
+ original.setSSLTrustStore(keyStore);
+
+ final byte[] bytes = SerializationUtils.serialize(original);
+ final WebClientOptions deserialized = (WebClientOptions) SerializationUtils.deserialize(bytes);
+
+ assertNull(deserialized.getSSLTrustStore());
+ }
}
diff --git a/src/test/java/org/htmlunit/WebClientTest.java b/src/test/java/org/htmlunit/WebClientTest.java
index 90fd10072f8..233f1ac27d1 100644
--- a/src/test/java/org/htmlunit/WebClientTest.java
+++ b/src/test/java/org/htmlunit/WebClientTest.java
@@ -51,7 +51,7 @@
import org.htmlunit.http.HttpStatus;
import org.htmlunit.javascript.host.html.HTMLStyleElement;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.htmlunit.util.UrlUtils;
diff --git a/src/test/java/org/htmlunit/WebClientWaitForBackgroundJobsTest.java b/src/test/java/org/htmlunit/WebClientWaitForBackgroundJobsTest.java
index 8b1b5ca7f15..fd876b0209b 100644
--- a/src/test/java/org/htmlunit/WebClientWaitForBackgroundJobsTest.java
+++ b/src/test/java/org/htmlunit/WebClientWaitForBackgroundJobsTest.java
@@ -25,7 +25,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.javascript.background.JavaScriptJobManager;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Tries;
+import org.htmlunit.junit.annotation.Tries;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/WebDriverTestCase.java b/src/test/java/org/htmlunit/WebDriverTestCase.java
index ad5c21e0648..766dbc3379c 100644
--- a/src/test/java/org/htmlunit/WebDriverTestCase.java
+++ b/src/test/java/org/htmlunit/WebDriverTestCase.java
@@ -614,16 +614,6 @@ private FirefoxDriver createFirefoxDriver(final String geckodriverBinary, final
return new FirefoxDriver(service, options);
}
- private static String getBrowserName(final BrowserVersion browserVersion) {
- if (browserVersion == BrowserVersion.FIREFOX) {
- return browserVersion.getNickname() + '-' + browserVersion.getBrowserVersionNumeric();
- }
- if (browserVersion == BrowserVersion.FIREFOX_ESR) {
- return browserVersion.getNickname() + '-' + browserVersion.getBrowserVersionNumeric();
- }
- return browserVersion.getNickname();
- }
-
/**
* Starts the web server delivering response from the provided connection.
* @param mockConnection the sources for responses
@@ -1097,18 +1087,28 @@ protected final WebDriver loadPageVerifyTitle2(final String html, final String..
protected final WebDriver verifyTitle2(final long maxWaitTime, final WebDriver driver,
final String... expectedAlerts) throws Exception {
+
+ final StringBuilder expected = new StringBuilder();
+ for (int i = 0; i < expectedAlerts.length; i++) {
+ expected.append(expectedAlerts[i]).append('\u00A7');
+ }
+ final String expectedTitle = expected.toString();
+
final long maxWait = System.currentTimeMillis() + maxWaitTime;
while (System.currentTimeMillis() < maxWait) {
try {
- return verifyTitle2(driver, expectedAlerts);
+ final String title = driver.getTitle();
+ assertEquals(expectedTitle, title);
+ return driver;
}
catch (final AssertionError e) {
// ignore and wait
}
}
- return verifyTitle2(driver, expectedAlerts);
+ assertEquals(expectedTitle, driver.getTitle());
+ return driver;
}
protected final WebDriver verifyTitle2(final WebDriver driver,
@@ -1152,14 +1152,14 @@ protected final WebDriver verifyTextArea2(final WebDriver driver,
final WebElement textArea = driver.findElement(By.id("myLog"));
if (expectedAlerts.length == 0) {
- assertEquals("", textArea.getAttribute("value"));
+ assertEquals("", textArea.getDomProperty("value"));
return driver;
}
if (!useRealBrowser()
&& expectedAlerts.length == 1
&& expectedAlerts[0].startsWith("data:image/png;base64,")) {
- String value = textArea.getAttribute("value");
+ String value = textArea.getDomProperty("value");
if (value.endsWith("\u00A7")) {
value = value.substring(0, value.length() - 1);
}
@@ -1171,7 +1171,7 @@ protected final WebDriver verifyTextArea2(final WebDriver driver,
for (int i = 0; i < expectedAlerts.length; i++) {
expected.append(expectedAlerts[i]).append('\u00A7');
}
- verify(() -> textArea.getAttribute("value"), expected.toString());
+ verify(() -> textArea.getDomProperty("value"), expected.toString());
return driver;
}
diff --git a/src/test/java/org/htmlunit/WebWindowListenerTest.java b/src/test/java/org/htmlunit/WebWindowListenerTest.java
index f2f1b48ddde..78a4f07d4c4 100644
--- a/src/test/java/org/htmlunit/WebWindowListenerTest.java
+++ b/src/test/java/org/htmlunit/WebWindowListenerTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/archunit/Architecture2Test.java b/src/test/java/org/htmlunit/archunit/Architecture2Test.java
index 7e9b5abf6fc..54adb3954e5 100644
--- a/src/test/java/org/htmlunit/archunit/Architecture2Test.java
+++ b/src/test/java/org/htmlunit/archunit/Architecture2Test.java
@@ -14,6 +14,7 @@
*/
package org.htmlunit.archunit;
+import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.methods;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
import java.util.HashSet;
@@ -21,14 +22,20 @@
import java.util.stream.Collectors;
import org.htmlunit.BrowserVersion;
+import org.htmlunit.junit.annotation.AnnotationUtils;
import org.junit.Assert;
+import org.junit.Test;
import org.junit.runner.RunWith;
import com.tngtech.archunit.core.domain.JavaClasses;
+import com.tngtech.archunit.core.domain.JavaMethod;
import com.tngtech.archunit.junit.AnalyzeClasses;
import com.tngtech.archunit.junit.ArchTest;
import com.tngtech.archunit.junit.ArchUnitRunner;
+import com.tngtech.archunit.lang.ArchCondition;
import com.tngtech.archunit.lang.ArchRule;
+import com.tngtech.archunit.lang.ConditionEvents;
+import com.tngtech.archunit.lang.SimpleConditionEvent;
/**
* Architecture tests for our test cases.
@@ -176,4 +183,26 @@ else if (oneTests.size() == 0) {
@ArchTest
public static final ArchRule hamcrest = noClasses()
.should().dependOnClassesThat().resideInAPackage("org.hamcrest..");
+
+ private static final ArchCondition haveConsistentTestAnnotations =
+ new ArchCondition("have consistent HtmlUnit test annotations") {
+ @Override
+ public void check(final JavaMethod method, final ConditionEvents events) {
+ try {
+ AnnotationUtils.assertAlerts(method.reflect());
+ }
+ catch (final AssertionError e) {
+ events.add(SimpleConditionEvent.violated(method, e.getMessage()));
+ }
+ }
+ };
+
+ /**
+ * Validate test annotations.
+ */
+ @ArchTest
+ public static final ArchRule jsxGetterAnnotationStartsWithGet = methods()
+ .that().areAnnotatedWith(Test.class)
+ .and().areNotDeclaredIn("org.htmlunit.junit.annotation.AnnotationUtilsTest")
+ .should(haveConsistentTestAnnotations);
}
diff --git a/src/test/java/org/htmlunit/attachment/DownloadingAttachmentHandlerTest.java b/src/test/java/org/htmlunit/attachment/DownloadingAttachmentHandlerTest.java
index 3e5065fa3ee..0eac7e885c4 100644
--- a/src/test/java/org/htmlunit/attachment/DownloadingAttachmentHandlerTest.java
+++ b/src/test/java/org/htmlunit/attachment/DownloadingAttachmentHandlerTest.java
@@ -164,6 +164,7 @@ public void basicFileNameFromHeader() throws Exception {
final File tmpFolder = new File(System.getProperty("java.io.tmpdir"));
final File downloadFolder = new File(tmpFolder, "downloading-attachment-test");
+ FileUtils.deleteDirectory(downloadFolder);
try {
FileUtils.forceMkdir(downloadFolder);
diff --git a/src/test/java/org/htmlunit/css/StyleAttributesIterable2Test.java b/src/test/java/org/htmlunit/css/StyleAttributesIterable2Test.java
index 0a75c44abba..51a6d0d4bdf 100644
--- a/src/test/java/org/htmlunit/css/StyleAttributesIterable2Test.java
+++ b/src/test/java/org/htmlunit/css/StyleAttributesIterable2Test.java
@@ -18,7 +18,7 @@
import org.htmlunit.javascript.host.css.CSSStyleDeclaration;
import org.htmlunit.javascript.host.css.ComputedCSSStyleDeclaration;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/encoding/CssStyleSheetEncodingTest.java b/src/test/java/org/htmlunit/encoding/CssStyleSheetEncodingTest.java
index b99ced24fad..88877361e19 100644
--- a/src/test/java/org/htmlunit/encoding/CssStyleSheetEncodingTest.java
+++ b/src/test/java/org/htmlunit/encoding/CssStyleSheetEncodingTest.java
@@ -29,7 +29,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserParameterizedRunner;
import org.htmlunit.junit.BrowserParameterizedRunner.Default;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/encoding/HtmlPageEncodingTest.java b/src/test/java/org/htmlunit/encoding/HtmlPageEncodingTest.java
index 8bb3e581316..05a98777bb1 100644
--- a/src/test/java/org/htmlunit/encoding/HtmlPageEncodingTest.java
+++ b/src/test/java/org/htmlunit/encoding/HtmlPageEncodingTest.java
@@ -32,8 +32,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserParameterizedRunner;
import org.htmlunit.junit.BrowserParameterizedRunner.Default;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/encoding/ScriptEncodingTest.java b/src/test/java/org/htmlunit/encoding/ScriptEncodingTest.java
index 15a1f726ff2..9c905e93e38 100644
--- a/src/test/java/org/htmlunit/encoding/ScriptEncodingTest.java
+++ b/src/test/java/org/htmlunit/encoding/ScriptEncodingTest.java
@@ -35,8 +35,8 @@
import org.htmlunit.html.HtmlScript;
import org.htmlunit.junit.BrowserParameterizedRunner;
import org.htmlunit.junit.BrowserParameterizedRunner.Default;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/general/DedicatedWorkerGlobalScopeClassNameTest.java b/src/test/java/org/htmlunit/general/DedicatedWorkerGlobalScopeClassNameTest.java
index e7ad2192a0d..33a1ddf5095 100644
--- a/src/test/java/org/htmlunit/general/DedicatedWorkerGlobalScopeClassNameTest.java
+++ b/src/test/java/org/htmlunit/general/DedicatedWorkerGlobalScopeClassNameTest.java
@@ -21,8 +21,8 @@
import org.htmlunit.javascript.host.css.CSSStyleRule;
import org.htmlunit.javascript.host.css.CSSStyleSheet;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -508,6 +508,15 @@ public void beforeUnloadEvent() throws Exception {
test("BeforeUnloadEvent");
}
+ /**
+ * @throws Exception if the test fails
+ */
+ @Test
+ @Alerts("function BigInt() { [native code] }")
+ public void bigInt() throws Exception {
+ test("BigInt");
+ }
+
/**
* @throws Exception if the test fails
*/
diff --git a/src/test/java/org/htmlunit/general/DedicatedWorkerGlobalScopeConstantsTest.java b/src/test/java/org/htmlunit/general/DedicatedWorkerGlobalScopeConstantsTest.java
index 28af25ab802..a258ed750e0 100644
--- a/src/test/java/org/htmlunit/general/DedicatedWorkerGlobalScopeConstantsTest.java
+++ b/src/test/java/org/htmlunit/general/DedicatedWorkerGlobalScopeConstantsTest.java
@@ -31,7 +31,7 @@
import org.htmlunit.javascript.configuration.WorkerJavaScriptConfiguration;
import org.htmlunit.junit.BrowserParameterizedRunner;
import org.htmlunit.junit.BrowserParameterizedRunner.Default;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/general/DedicatedWorkerGlobalScopeTypeOfTest.java b/src/test/java/org/htmlunit/general/DedicatedWorkerGlobalScopeTypeOfTest.java
index 0012183769d..ea145c9a02d 100644
--- a/src/test/java/org/htmlunit/general/DedicatedWorkerGlobalScopeTypeOfTest.java
+++ b/src/test/java/org/htmlunit/general/DedicatedWorkerGlobalScopeTypeOfTest.java
@@ -21,8 +21,8 @@
import org.htmlunit.javascript.host.css.CSSStyleRule;
import org.htmlunit.javascript.host.css.CSSStyleSheet;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -505,6 +505,15 @@ public void beforeUnloadEvent() throws Exception {
test("BeforeUnloadEvent");
}
+ /**
+ * @throws Exception if the test fails
+ */
+ @Test
+ @Alerts("function")
+ public void bigInt() throws Exception {
+ test("BigInt");
+ }
+
/**
* @throws Exception if the test fails
*/
diff --git a/src/test/java/org/htmlunit/general/ElementChildNodesTest.java b/src/test/java/org/htmlunit/general/ElementChildNodesTest.java
index 5e576acd705..fb28d6f8ddd 100644
--- a/src/test/java/org/htmlunit/general/ElementChildNodesTest.java
+++ b/src/test/java/org/htmlunit/general/ElementChildNodesTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/general/ElementClosesItselfTest.java b/src/test/java/org/htmlunit/general/ElementClosesItselfTest.java
index 6183397d5c9..af7cb4eebcb 100644
--- a/src/test/java/org/htmlunit/general/ElementClosesItselfTest.java
+++ b/src/test/java/org/htmlunit/general/ElementClosesItselfTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/general/ElementCreationTest.java b/src/test/java/org/htmlunit/general/ElementCreationTest.java
index 1778dac3fad..c1ea92432de 100644
--- a/src/test/java/org/htmlunit/general/ElementCreationTest.java
+++ b/src/test/java/org/htmlunit/general/ElementCreationTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/general/ElementDefaultStyleDisplayTest.java b/src/test/java/org/htmlunit/general/ElementDefaultStyleDisplayTest.java
index df56cf763a4..a37a7ac7bd2 100644
--- a/src/test/java/org/htmlunit/general/ElementDefaultStyleDisplayTest.java
+++ b/src/test/java/org/htmlunit/general/ElementDefaultStyleDisplayTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.annotations.StandardsMode;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.AlertsStandards;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.AlertsStandards;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/general/ElementOuterHtmlTest.java b/src/test/java/org/htmlunit/general/ElementOuterHtmlTest.java
index 71721a04d3a..1ee159cba65 100644
--- a/src/test/java/org/htmlunit/general/ElementOuterHtmlTest.java
+++ b/src/test/java/org/htmlunit/general/ElementOuterHtmlTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/general/ElementOwnPropertiesTest.java b/src/test/java/org/htmlunit/general/ElementOwnPropertiesTest.java
index 3910a1b12d1..f36aa7e1488 100644
--- a/src/test/java/org/htmlunit/general/ElementOwnPropertiesTest.java
+++ b/src/test/java/org/htmlunit/general/ElementOwnPropertiesTest.java
@@ -45,8 +45,8 @@
import org.htmlunit.javascript.host.html.HTMLCollection;
import org.htmlunit.javascript.host.performance.Performance;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.junit.BrowserVersionClassRunner;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
@@ -17871,12 +17871,14 @@ public void xmlHttpRequest() throws Exception {
* @throws Exception if the test fails
*/
@Test
- @Alerts(CHROME = "arrayBuffer(),blob(),body[GCE],bodyUsed[GCE],cache[GCE],clone(),constructor(),credentials[GCE],"
+ @Alerts(CHROME = "arrayBuffer(),blob(),body[GCE],bodyUsed[GCE],bytes(),"
+ + "cache[GCE],clone(),constructor(),credentials[GCE],"
+ "destination[GCE],duplex[GCE],formData(),headers[GCE],integrity[GCE],isHistoryNavigation[GCE],json(),"
+ "keepalive[GCE],method[GCE],mode[GCE],redirect[GCE],referrer[GCE],referrerPolicy[GCE],signal[GCE],"
+ "targetAddressSpace[GCE],text(),"
+ "url[GCE]",
- EDGE = "arrayBuffer(),blob(),body[GCE],bodyUsed[GCE],cache[GCE],clone(),constructor(),credentials[GCE],"
+ EDGE = "arrayBuffer(),blob(),body[GCE],bodyUsed[GCE],bytes(),"
+ + "cache[GCE],clone(),constructor(),credentials[GCE],"
+ "destination[GCE],duplex[GCE],formData(),headers[GCE],integrity[GCE],isHistoryNavigation[GCE],json(),"
+ "keepalive[GCE],method[GCE],mode[GCE],redirect[GCE],referrer[GCE],referrerPolicy[GCE],signal[GCE],"
+ "targetAddressSpace[GCE],text(),"
@@ -17903,10 +17905,12 @@ public void request() throws Exception {
* @throws Exception if the test fails
*/
@Test
- @Alerts(CHROME = "arrayBuffer(),blob(),body[GCE],bodyUsed[GCE],clone(),constructor(),formData(),headers[GCE],"
+ @Alerts(CHROME = "arrayBuffer(),blob(),body[GCE],bodyUsed[GCE],bytes(),"
+ + "clone(),constructor(),formData(),headers[GCE],"
+ "json(),ok[GCE],redirected[GCE],status[GCE],statusText[GCE],text(),type[GCE],"
+ "url[GCE]",
- EDGE = "arrayBuffer(),blob(),body[GCE],bodyUsed[GCE],clone(),constructor(),formData(),headers[GCE],"
+ EDGE = "arrayBuffer(),blob(),body[GCE],bodyUsed[GCE],bytes(),"
+ + "clone(),constructor(),formData(),headers[GCE],"
+ "json(),ok[GCE],redirected[GCE],status[GCE],statusText[GCE],text(),type[GCE],"
+ "url[GCE]",
FF = "arrayBuffer(),blob(),body[GCE],bodyUsed[GCE],bytes(),clone(),constructor(),formData(),"
@@ -18141,8 +18145,10 @@ public void mimeType() throws Exception {
+ "canLoadAdAuctionFencedFrame(),canShare(),clearAppBadge(),clearOriginJoinedAdInterestGroups(),"
+ "clipboard[GCE],connection[GCE],constructor(),cookieEnabled[GCE],createAuctionNonce(),"
+ "credentials[GCE],deprecatedReplaceInURN(),deprecatedRunAdAuctionEnforcesKAnonymity[GCE],"
- + "deprecatedURNToURL(),deviceMemory[GCE],doNotTrack[GCE],geolocation[GCE],getBattery(),"
- + "getGamepads(),getInstalledRelatedApps(),getUserMedia(),gpu[GCE],hardwareConcurrency[GCE],"
+ + "deprecatedURNToURL(),deviceMemory[GCE],devicePosture[GCE],"
+ + "doNotTrack[GCE],geolocation[GCE],getBattery(),"
+ + "getGamepads(),getInstalledRelatedApps(),getInterestGroupAdAuctionData(),"
+ + "getUserMedia(),gpu[GCE],hardwareConcurrency[GCE],"
+ "hid[GCE],ink[GCE],javaEnabled(),joinAdInterestGroup(),keyboard[GCE],language[GCE],languages[GCE],"
+ "leaveAdInterestGroup(),locks[GCE],login[GCE],managed[GCE],maxTouchPoints[GCE],"
+ "mediaCapabilities[GCE],mediaDevices[GCE],mediaSession[GCE],mimeTypes[GCE],onLine[GCE],"
@@ -18159,8 +18165,10 @@ public void mimeType() throws Exception {
+ "canLoadAdAuctionFencedFrame(),canShare(),clearAppBadge(),clearOriginJoinedAdInterestGroups(),"
+ "clipboard[GCE],connection[GCE],constructor(),cookieEnabled[GCE],createAuctionNonce(),"
+ "credentials[GCE],deprecatedReplaceInURN(),deprecatedRunAdAuctionEnforcesKAnonymity[GCE],"
- + "deprecatedURNToURL(),deviceMemory[GCE],doNotTrack[GCE],geolocation[GCE],getBattery(),"
- + "getGamepads(),getInstalledRelatedApps(),getUserMedia(),gpu[GCE],hardwareConcurrency[GCE],"
+ + "deprecatedURNToURL(),deviceMemory[GCE],devicePosture[GCE],"
+ + "doNotTrack[GCE],geolocation[GCE],getBattery(),"
+ + "getGamepads(),getInstalledRelatedApps(),getInterestGroupAdAuctionData(),"
+ + "getUserMedia(),gpu[GCE],hardwareConcurrency[GCE],"
+ "hid[GCE],ink[GCE],javaEnabled(),joinAdInterestGroup(),keyboard[GCE],language[GCE],languages[GCE],"
+ "leaveAdInterestGroup(),locks[GCE],login[GCE],managed[GCE],maxTouchPoints[GCE],"
+ "mediaCapabilities[GCE],mediaDevices[GCE],mediaSession[GCE],mimeTypes[GCE],onLine[GCE],"
diff --git a/src/test/java/org/htmlunit/general/ElementOwnPropertySymbolsTest.java b/src/test/java/org/htmlunit/general/ElementOwnPropertySymbolsTest.java
index 78c64892508..be50faa89e0 100644
--- a/src/test/java/org/htmlunit/general/ElementOwnPropertySymbolsTest.java
+++ b/src/test/java/org/htmlunit/general/ElementOwnPropertySymbolsTest.java
@@ -45,8 +45,8 @@
import org.htmlunit.javascript.host.html.HTMLCollection;
import org.htmlunit.javascript.host.performance.Performance;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.junit.BrowserVersionClassRunner;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
diff --git a/src/test/java/org/htmlunit/general/ElementPropertiesTest.java b/src/test/java/org/htmlunit/general/ElementPropertiesTest.java
index 5ded9406c30..0f8ff98bc32 100644
--- a/src/test/java/org/htmlunit/general/ElementPropertiesTest.java
+++ b/src/test/java/org/htmlunit/general/ElementPropertiesTest.java
@@ -44,8 +44,8 @@
import org.htmlunit.javascript.host.html.HTMLCollection;
import org.htmlunit.javascript.host.performance.Performance;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.junit.BrowserVersionClassRunner;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
@@ -8990,11 +8990,13 @@ public void xmlHttpRequest() throws Exception {
* @throws Exception if the test fails
*/
@Test
- @Alerts(CHROME = "arrayBuffer(),blob(),body,bodyUsed,cache,clone(),credentials,destination,duplex,formData(),"
+ @Alerts(CHROME = "arrayBuffer(),blob(),body,bodyUsed,bytes(),"
+ + "cache,clone(),credentials,destination,duplex,formData(),"
+ "headers,integrity,isHistoryNavigation,json(),keepalive,method,mode,redirect,referrer,"
+ "referrerPolicy,signal,targetAddressSpace,text(),"
+ "url",
- EDGE = "arrayBuffer(),blob(),body,bodyUsed,cache,clone(),credentials,destination,duplex,formData(),"
+ EDGE = "arrayBuffer(),blob(),body,bodyUsed,bytes(),"
+ + "cache,clone(),credentials,destination,duplex,formData(),"
+ "headers,integrity,isHistoryNavigation,json(),keepalive,method,mode,redirect,referrer,"
+ "referrerPolicy,signal,targetAddressSpace,text(),"
+ "url",
@@ -9018,10 +9020,12 @@ public void request() throws Exception {
* @throws Exception if the test fails
*/
@Test
- @Alerts(CHROME = "arrayBuffer(),blob(),body,bodyUsed,clone(),formData(),headers,json(),ok,redirected,status,"
+ @Alerts(CHROME = "arrayBuffer(),blob(),body,bodyUsed,bytes(),"
+ + "clone(),formData(),headers,json(),ok,redirected,status,"
+ "statusText,text(),type,"
+ "url",
- EDGE = "arrayBuffer(),blob(),body,bodyUsed,clone(),formData(),headers,json(),ok,redirected,status,"
+ EDGE = "arrayBuffer(),blob(),body,bodyUsed,bytes(),"
+ + "clone(),formData(),headers,json(),ok,redirected,status,"
+ "statusText,text(),type,"
+ "url",
FF = "arrayBuffer(),blob(),body,bodyUsed,bytes(),clone(),formData(),headers,json(),ok,redirected,"
@@ -9265,8 +9269,10 @@ public void mimeType() throws Exception {
@Alerts(CHROME = "adAuctionComponents(),appCodeName,appName,appVersion,bluetooth,canLoadAdAuctionFencedFrame(),"
+ "canShare(),clearAppBadge(),clearOriginJoinedAdInterestGroups(),clipboard,connection,"
+ "cookieEnabled,createAuctionNonce(),credentials,deprecatedReplaceInURN(),"
- + "deprecatedRunAdAuctionEnforcesKAnonymity,deprecatedURNToURL(),deviceMemory,doNotTrack,"
- + "geolocation,getBattery(),getGamepads(),getInstalledRelatedApps(),getUserMedia(),gpu,"
+ + "deprecatedRunAdAuctionEnforcesKAnonymity,deprecatedURNToURL(),deviceMemory,devicePosture,"
+ + "doNotTrack,"
+ + "geolocation,getBattery(),getGamepads(),getInstalledRelatedApps(),getInterestGroupAdAuctionData(),"
+ + "getUserMedia(),gpu,"
+ "hardwareConcurrency,hid,ink,javaEnabled(),joinAdInterestGroup(),keyboard,language,languages,"
+ "leaveAdInterestGroup(),locks,login,managed,maxTouchPoints,mediaCapabilities,mediaDevices,"
+ "mediaSession,mimeTypes,onLine,pdfViewerEnabled,permissions,platform,plugins,presentation,product,"
@@ -9280,8 +9286,10 @@ public void mimeType() throws Exception {
EDGE = "adAuctionComponents(),appCodeName,appName,appVersion,bluetooth,canLoadAdAuctionFencedFrame(),"
+ "canShare(),clearAppBadge(),clearOriginJoinedAdInterestGroups(),clipboard,connection,"
+ "cookieEnabled,createAuctionNonce(),credentials,deprecatedReplaceInURN(),"
- + "deprecatedRunAdAuctionEnforcesKAnonymity,deprecatedURNToURL(),deviceMemory,doNotTrack,"
- + "geolocation,getBattery(),getGamepads(),getInstalledRelatedApps(),getUserMedia(),gpu,"
+ + "deprecatedRunAdAuctionEnforcesKAnonymity,deprecatedURNToURL(),deviceMemory,devicePosture,"
+ + "doNotTrack,"
+ + "geolocation,getBattery(),getGamepads(),getInstalledRelatedApps(),getInterestGroupAdAuctionData(),"
+ + "getUserMedia(),gpu,"
+ "hardwareConcurrency,hid,ink,javaEnabled(),joinAdInterestGroup(),keyboard,language,languages,"
+ "leaveAdInterestGroup(),locks,login,managed,maxTouchPoints,mediaCapabilities,mediaDevices,"
+ "mediaSession,mimeTypes,onLine,pdfViewerEnabled,permissions,platform,plugins,presentation,product,"
diff --git a/src/test/java/org/htmlunit/general/HostClassNameTest.java b/src/test/java/org/htmlunit/general/HostClassNameTest.java
index 9f7ea4dfb2a..89f88ac4c32 100644
--- a/src/test/java/org/htmlunit/general/HostClassNameTest.java
+++ b/src/test/java/org/htmlunit/general/HostClassNameTest.java
@@ -30,9 +30,9 @@
import org.htmlunit.javascript.host.css.MediaList;
import org.htmlunit.javascript.host.css.StyleSheetList;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.AlertsStandards;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.AlertsStandards;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.w3c.dom.css.CSS2Properties;
@@ -522,6 +522,15 @@ public void beforeUnloadEvent() throws Exception {
test("BeforeUnloadEvent");
}
+ /**
+ * @throws Exception if the test fails
+ */
+ @Test
+ @Alerts("function BigInt() { [native code] }")
+ public void bigInt() throws Exception {
+ test("BigInt");
+ }
+
/**
* @throws Exception if the test fails
*/
diff --git a/src/test/java/org/htmlunit/general/HostConstructorTest.java b/src/test/java/org/htmlunit/general/HostConstructorTest.java
index f0b29a93d5e..5229efb28d7 100644
--- a/src/test/java/org/htmlunit/general/HostConstructorTest.java
+++ b/src/test/java/org/htmlunit/general/HostConstructorTest.java
@@ -25,7 +25,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserParameterizedRunner;
import org.htmlunit.junit.BrowserParameterizedRunner.Default;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/general/HostTypeOfTest.java b/src/test/java/org/htmlunit/general/HostTypeOfTest.java
index 4ee8217f147..2ab79f9d7dd 100644
--- a/src/test/java/org/htmlunit/general/HostTypeOfTest.java
+++ b/src/test/java/org/htmlunit/general/HostTypeOfTest.java
@@ -19,8 +19,8 @@
import org.htmlunit.javascript.host.css.CSSStyleRule;
import org.htmlunit.javascript.host.css.CSSStyleSheet;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -498,6 +498,15 @@ public void beforeUnloadEvent() throws Exception {
test("BeforeUnloadEvent");
}
+ /**
+ * @throws Exception if the test fails
+ */
+ @Test
+ @Alerts("function")
+ public void bigInt() throws Exception {
+ test("BigInt");
+ }
+
/**
* @throws Exception if the test fails
*/
diff --git a/src/test/java/org/htmlunit/general/huge/ElementClosesElementTest.java b/src/test/java/org/htmlunit/general/huge/ElementClosesElementTest.java
index d88500d9a63..ec55357d316 100644
--- a/src/test/java/org/htmlunit/general/huge/ElementClosesElementTest.java
+++ b/src/test/java/org/htmlunit/general/huge/ElementClosesElementTest.java
@@ -24,8 +24,8 @@
import org.htmlunit.html.DefaultElementFactory;
import org.htmlunit.junit.BrowserParameterizedRunner;
import org.htmlunit.junit.BrowserParameterizedRunner.Default;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/general/huge/HostParentOf.java b/src/test/java/org/htmlunit/general/huge/HostParentOf.java
index 2a54d7a2969..b613c91a0da 100644
--- a/src/test/java/org/htmlunit/general/huge/HostParentOf.java
+++ b/src/test/java/org/htmlunit/general/huge/HostParentOf.java
@@ -24,7 +24,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserParameterizedRunner.Default;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.After;
import org.junit.Test;
import org.junit.runners.Parameterized.Parameter;
diff --git a/src/test/java/org/htmlunit/general/huge/HostParentOfATest.java b/src/test/java/org/htmlunit/general/huge/HostParentOfATest.java
index 6b5dfd3f307..7bde3ff4508 100644
--- a/src/test/java/org/htmlunit/general/huge/HostParentOfATest.java
+++ b/src/test/java/org/htmlunit/general/huge/HostParentOfATest.java
@@ -17,8 +17,8 @@
import java.util.Collection;
import org.htmlunit.junit.BrowserParameterizedRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameters;
diff --git a/src/test/java/org/htmlunit/general/huge/HostParentOfBTest.java b/src/test/java/org/htmlunit/general/huge/HostParentOfBTest.java
index 59cd7396530..79135e439c6 100644
--- a/src/test/java/org/htmlunit/general/huge/HostParentOfBTest.java
+++ b/src/test/java/org/htmlunit/general/huge/HostParentOfBTest.java
@@ -17,7 +17,7 @@
import java.util.Collection;
import org.htmlunit.junit.BrowserParameterizedRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameters;
diff --git a/src/test/java/org/htmlunit/general/huge/HostParentOfCTest.java b/src/test/java/org/htmlunit/general/huge/HostParentOfCTest.java
index 9f39fe72759..7c72ec953d7 100644
--- a/src/test/java/org/htmlunit/general/huge/HostParentOfCTest.java
+++ b/src/test/java/org/htmlunit/general/huge/HostParentOfCTest.java
@@ -17,8 +17,8 @@
import java.util.Collection;
import org.htmlunit.junit.BrowserParameterizedRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameters;
diff --git a/src/test/java/org/htmlunit/general/huge/HostParentOfDTest.java b/src/test/java/org/htmlunit/general/huge/HostParentOfDTest.java
index e123b4f7cbe..f708116b521 100644
--- a/src/test/java/org/htmlunit/general/huge/HostParentOfDTest.java
+++ b/src/test/java/org/htmlunit/general/huge/HostParentOfDTest.java
@@ -17,8 +17,8 @@
import java.util.Collection;
import org.htmlunit.junit.BrowserParameterizedRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameters;
diff --git a/src/test/java/org/htmlunit/general/huge/HostParentOfFTest.java b/src/test/java/org/htmlunit/general/huge/HostParentOfFTest.java
index f177b9ba884..59d4449c74b 100644
--- a/src/test/java/org/htmlunit/general/huge/HostParentOfFTest.java
+++ b/src/test/java/org/htmlunit/general/huge/HostParentOfFTest.java
@@ -17,7 +17,7 @@
import java.util.Collection;
import org.htmlunit.junit.BrowserParameterizedRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameters;
diff --git a/src/test/java/org/htmlunit/general/huge/HostParentOfHTest.java b/src/test/java/org/htmlunit/general/huge/HostParentOfHTest.java
index 36e0f1fe6fb..665a5f01ef7 100644
--- a/src/test/java/org/htmlunit/general/huge/HostParentOfHTest.java
+++ b/src/test/java/org/htmlunit/general/huge/HostParentOfHTest.java
@@ -17,8 +17,8 @@
import java.util.Collection;
import org.htmlunit.junit.BrowserParameterizedRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameters;
diff --git a/src/test/java/org/htmlunit/general/huge/HostParentOfITest.java b/src/test/java/org/htmlunit/general/huge/HostParentOfITest.java
index 3c900faa803..cad8052c7d8 100644
--- a/src/test/java/org/htmlunit/general/huge/HostParentOfITest.java
+++ b/src/test/java/org/htmlunit/general/huge/HostParentOfITest.java
@@ -17,7 +17,7 @@
import java.util.Collection;
import org.htmlunit.junit.BrowserParameterizedRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameters;
diff --git a/src/test/java/org/htmlunit/general/huge/HostParentOfMTest.java b/src/test/java/org/htmlunit/general/huge/HostParentOfMTest.java
index 4ff30fdc873..8ffdad8e860 100644
--- a/src/test/java/org/htmlunit/general/huge/HostParentOfMTest.java
+++ b/src/test/java/org/htmlunit/general/huge/HostParentOfMTest.java
@@ -17,7 +17,7 @@
import java.util.Collection;
import org.htmlunit.junit.BrowserParameterizedRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameters;
diff --git a/src/test/java/org/htmlunit/general/huge/HostParentOfNTest.java b/src/test/java/org/htmlunit/general/huge/HostParentOfNTest.java
index d08321164db..90c7b4deb7e 100644
--- a/src/test/java/org/htmlunit/general/huge/HostParentOfNTest.java
+++ b/src/test/java/org/htmlunit/general/huge/HostParentOfNTest.java
@@ -17,8 +17,8 @@
import java.util.Collection;
import org.htmlunit.junit.BrowserParameterizedRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameters;
diff --git a/src/test/java/org/htmlunit/general/huge/HostParentOfPTest.java b/src/test/java/org/htmlunit/general/huge/HostParentOfPTest.java
index 22cbdaf439b..8cdbcb7f9df 100644
--- a/src/test/java/org/htmlunit/general/huge/HostParentOfPTest.java
+++ b/src/test/java/org/htmlunit/general/huge/HostParentOfPTest.java
@@ -17,7 +17,7 @@
import java.util.Collection;
import org.htmlunit.junit.BrowserParameterizedRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameters;
diff --git a/src/test/java/org/htmlunit/general/huge/HostParentOfS2Test.java b/src/test/java/org/htmlunit/general/huge/HostParentOfS2Test.java
index 2675682f136..6a84794588d 100644
--- a/src/test/java/org/htmlunit/general/huge/HostParentOfS2Test.java
+++ b/src/test/java/org/htmlunit/general/huge/HostParentOfS2Test.java
@@ -18,8 +18,8 @@
import org.apache.commons.lang3.StringUtils;
import org.htmlunit.junit.BrowserParameterizedRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameters;
diff --git a/src/test/java/org/htmlunit/general/huge/HostParentOfSTest.java b/src/test/java/org/htmlunit/general/huge/HostParentOfSTest.java
index b63aa496ced..e073009708a 100644
--- a/src/test/java/org/htmlunit/general/huge/HostParentOfSTest.java
+++ b/src/test/java/org/htmlunit/general/huge/HostParentOfSTest.java
@@ -18,7 +18,7 @@
import org.apache.commons.lang3.StringUtils;
import org.htmlunit.junit.BrowserParameterizedRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameters;
diff --git a/src/test/java/org/htmlunit/general/huge/HostParentOfTTest.java b/src/test/java/org/htmlunit/general/huge/HostParentOfTTest.java
index c171190c1bb..0594b18fc33 100644
--- a/src/test/java/org/htmlunit/general/huge/HostParentOfTTest.java
+++ b/src/test/java/org/htmlunit/general/huge/HostParentOfTTest.java
@@ -17,7 +17,7 @@
import java.util.Collection;
import org.htmlunit.junit.BrowserParameterizedRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameters;
diff --git a/src/test/java/org/htmlunit/general/huge/HostParentOfWTest.java b/src/test/java/org/htmlunit/general/huge/HostParentOfWTest.java
index 14dce99d11b..be977b4ba25 100644
--- a/src/test/java/org/htmlunit/general/huge/HostParentOfWTest.java
+++ b/src/test/java/org/htmlunit/general/huge/HostParentOfWTest.java
@@ -17,7 +17,7 @@
import java.util.Collection;
import org.htmlunit.junit.BrowserParameterizedRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameters;
diff --git a/src/test/java/org/htmlunit/html/BaseFrameElement2Test.java b/src/test/java/org/htmlunit/html/BaseFrameElement2Test.java
index ba568a8c5b5..f148ea22ea1 100644
--- a/src/test/java/org/htmlunit/html/BaseFrameElement2Test.java
+++ b/src/test/java/org/htmlunit/html/BaseFrameElement2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/ClickableElement2Test.java b/src/test/java/org/htmlunit/html/ClickableElement2Test.java
index d2d4d341023..766bb65d841 100644
--- a/src/test/java/org/htmlunit/html/ClickableElement2Test.java
+++ b/src/test/java/org/htmlunit/html/ClickableElement2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/ClickableElementTest.java b/src/test/java/org/htmlunit/html/ClickableElementTest.java
index 21c9f527757..90c7bda5332 100644
--- a/src/test/java/org/htmlunit/html/ClickableElementTest.java
+++ b/src/test/java/org/htmlunit/html/ClickableElementTest.java
@@ -22,8 +22,8 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.WebClient;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/DomDocumentFragmentTest.java b/src/test/java/org/htmlunit/html/DomDocumentFragmentTest.java
index e5050d5f60e..53bbf491eaf 100644
--- a/src/test/java/org/htmlunit/html/DomDocumentFragmentTest.java
+++ b/src/test/java/org/htmlunit/html/DomDocumentFragmentTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/DomElementTest.java b/src/test/java/org/htmlunit/html/DomElementTest.java
index cd08989eb0a..c536c8319e5 100644
--- a/src/test/java/org/htmlunit/html/DomElementTest.java
+++ b/src/test/java/org/htmlunit/html/DomElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/DomNode2Test.java b/src/test/java/org/htmlunit/html/DomNode2Test.java
index f8adf3303b6..e1a7f969924 100644
--- a/src/test/java/org/htmlunit/html/DomNode2Test.java
+++ b/src/test/java/org/htmlunit/html/DomNode2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/DomNodeTest.java b/src/test/java/org/htmlunit/html/DomNodeTest.java
index c4d83cb9e8d..3916fc8a99b 100644
--- a/src/test/java/org/htmlunit/html/DomNodeTest.java
+++ b/src/test/java/org/htmlunit/html/DomNodeTest.java
@@ -24,7 +24,7 @@
import org.htmlunit.WebClient;
import org.htmlunit.html.DomNode.DescendantHtmlElementsIterator;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.htmlunit.xml.XmlPage;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/html/FocusableElement2Test.java b/src/test/java/org/htmlunit/html/FocusableElement2Test.java
index e89ec6b7883..b076cbc49cc 100644
--- a/src/test/java/org/htmlunit/html/FocusableElement2Test.java
+++ b/src/test/java/org/htmlunit/html/FocusableElement2Test.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlAnchor2Test.java b/src/test/java/org/htmlunit/html/HtmlAnchor2Test.java
index 2d59a3aa980..71c8898f637 100644
--- a/src/test/java/org/htmlunit/html/HtmlAnchor2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlAnchor2Test.java
@@ -40,7 +40,7 @@
import org.htmlunit.WebWindow;
import org.htmlunit.attachment.AttachmentHandler;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlAnchorTest.java b/src/test/java/org/htmlunit/html/HtmlAnchorTest.java
index f786c9f6ce8..b894686be0e 100644
--- a/src/test/java/org/htmlunit/html/HtmlAnchorTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlAnchorTest.java
@@ -29,9 +29,9 @@
import org.htmlunit.MockWebConnection;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/html/HtmlAreaTest.java b/src/test/java/org/htmlunit/html/HtmlAreaTest.java
index 4938fe05a63..81c6dd9f14e 100644
--- a/src/test/java/org/htmlunit/html/HtmlAreaTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlAreaTest.java
@@ -24,8 +24,8 @@
import org.htmlunit.Page;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlBackgroundSoundTest.java b/src/test/java/org/htmlunit/html/HtmlBackgroundSoundTest.java
index a5953fb7f74..fe8b0f1afcc 100644
--- a/src/test/java/org/htmlunit/html/HtmlBackgroundSoundTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlBackgroundSoundTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlBaseFontTest.java b/src/test/java/org/htmlunit/html/HtmlBaseFontTest.java
index 67f68d886ee..a651b089aa6 100644
--- a/src/test/java/org/htmlunit/html/HtmlBaseFontTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlBaseFontTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlBaseTest.java b/src/test/java/org/htmlunit/html/HtmlBaseTest.java
index 4921e957ee5..2411a00712b 100644
--- a/src/test/java/org/htmlunit/html/HtmlBaseTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlBaseTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlBodyTest.java b/src/test/java/org/htmlunit/html/HtmlBodyTest.java
index 8c7d977d658..ea7e092ea97 100644
--- a/src/test/java/org/htmlunit/html/HtmlBodyTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlBodyTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlBreakTest.java b/src/test/java/org/htmlunit/html/HtmlBreakTest.java
index 9339cd4d261..c08ad7eb952 100644
--- a/src/test/java/org/htmlunit/html/HtmlBreakTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlBreakTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlButton2Test.java b/src/test/java/org/htmlunit/html/HtmlButton2Test.java
index 0323c0ba96a..54442516d39 100644
--- a/src/test/java/org/htmlunit/html/HtmlButton2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlButton2Test.java
@@ -18,7 +18,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.NameValuePair;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlButtonInput2Test.java b/src/test/java/org/htmlunit/html/HtmlButtonInput2Test.java
index 9783deb3d6b..f4924ecbde9 100644
--- a/src/test/java/org/htmlunit/html/HtmlButtonInput2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlButtonInput2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlButtonInputTest.java b/src/test/java/org/htmlunit/html/HtmlButtonInputTest.java
index 4a5b4e982cf..74be629a11b 100644
--- a/src/test/java/org/htmlunit/html/HtmlButtonInputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlButtonInputTest.java
@@ -19,7 +19,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlButtonTest.java b/src/test/java/org/htmlunit/html/HtmlButtonTest.java
index 5f124a8d59b..f6f8b1ae1a9 100644
--- a/src/test/java/org/htmlunit/html/HtmlButtonTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlButtonTest.java
@@ -20,7 +20,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.NameValuePair;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlCanvasTest.java b/src/test/java/org/htmlunit/html/HtmlCanvasTest.java
index 7129356d6a6..53da8e4a8d2 100644
--- a/src/test/java/org/htmlunit/html/HtmlCanvasTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlCanvasTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlCaptionTest.java b/src/test/java/org/htmlunit/html/HtmlCaptionTest.java
index 37988eb1de6..765b5d24775 100644
--- a/src/test/java/org/htmlunit/html/HtmlCaptionTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlCaptionTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlCheckBoxInput2Test.java b/src/test/java/org/htmlunit/html/HtmlCheckBoxInput2Test.java
index d7df1d3aa0d..aa28a091673 100644
--- a/src/test/java/org/htmlunit/html/HtmlCheckBoxInput2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlCheckBoxInput2Test.java
@@ -18,7 +18,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlColorInput2Test.java b/src/test/java/org/htmlunit/html/HtmlColorInput2Test.java
index fe44d154565..23eb208f6b5 100644
--- a/src/test/java/org/htmlunit/html/HtmlColorInput2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlColorInput2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlColorInputTest.java b/src/test/java/org/htmlunit/html/HtmlColorInputTest.java
index 161b0726ddb..4caa65c0496 100644
--- a/src/test/java/org/htmlunit/html/HtmlColorInputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlColorInputTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlDateInputTest.java b/src/test/java/org/htmlunit/html/HtmlDateInputTest.java
index c01cc124c16..4a8ff16c887 100644
--- a/src/test/java/org/htmlunit/html/HtmlDateInputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlDateInputTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlDateTimeInputTest.java b/src/test/java/org/htmlunit/html/HtmlDateTimeInputTest.java
index 630b5ebc8e3..3814b051a82 100644
--- a/src/test/java/org/htmlunit/html/HtmlDateTimeInputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlDateTimeInputTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlDateTimeLocalInputTest.java b/src/test/java/org/htmlunit/html/HtmlDateTimeLocalInputTest.java
index 9f42f954aea..24393e2fb7a 100644
--- a/src/test/java/org/htmlunit/html/HtmlDateTimeLocalInputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlDateTimeLocalInputTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlDefinitionListTest.java b/src/test/java/org/htmlunit/html/HtmlDefinitionListTest.java
index f71b647974a..b5084391605 100644
--- a/src/test/java/org/htmlunit/html/HtmlDefinitionListTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlDefinitionListTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlDirectoryTest.java b/src/test/java/org/htmlunit/html/HtmlDirectoryTest.java
index 41003d509d0..01ec729e60f 100644
--- a/src/test/java/org/htmlunit/html/HtmlDirectoryTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlDirectoryTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlDivision2Test.java b/src/test/java/org/htmlunit/html/HtmlDivision2Test.java
index 0aa770b8bfb..31f25cadd47 100644
--- a/src/test/java/org/htmlunit/html/HtmlDivision2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlDivision2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlDomTreeWalkerTest.java b/src/test/java/org/htmlunit/html/HtmlDomTreeWalkerTest.java
new file mode 100644
index 00000000000..42223a63139
--- /dev/null
+++ b/src/test/java/org/htmlunit/html/HtmlDomTreeWalkerTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2002-2025 Gargoyle Software Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.htmlunit.html;
+
+import org.apache.commons.lang3.SerializationUtils;
+import org.htmlunit.SimpleWebTestCase;
+import org.htmlunit.junit.BrowserRunner;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Tests for {@link HtmlDomTreeWalker}.
+ *
+ * @author Ronald Brill
+ */
+@RunWith(BrowserRunner.class)
+public class HtmlDomTreeWalkerTest extends SimpleWebTestCase {
+
+ /**
+ * @throws Exception if an error occurs
+ */
+ @Test
+ public void serialization() throws Exception {
+ final String html = "\n"
+ + "1
2
\n"
+ + "";
+
+ final HtmlPage page = loadPage(html);
+
+ final byte[] bytes = SerializationUtils.serialize(new HtmlDomTreeWalker(page.getBody(), 0, null, false));
+
+ final HtmlDomTreeWalker deserialized = (HtmlDomTreeWalker) SerializationUtils.deserialize(bytes);
+ Assert.assertEquals(page.getBody().getNodeName(), deserialized.getRoot().getNodeName());
+ }
+}
diff --git a/src/test/java/org/htmlunit/html/HtmlElement2Test.java b/src/test/java/org/htmlunit/html/HtmlElement2Test.java
index 3802ad48c21..7bd60951eee 100644
--- a/src/test/java/org/htmlunit/html/HtmlElement2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlElement2Test.java
@@ -21,9 +21,9 @@
import org.apache.commons.io.IOUtils;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlElementTest.java b/src/test/java/org/htmlunit/html/HtmlElementTest.java
index 2d256365e42..9d1e42e676f 100644
--- a/src/test/java/org/htmlunit/html/HtmlElementTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlElementTest.java
@@ -22,7 +22,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.WebClient;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.w3c.dom.NodeList;
diff --git a/src/test/java/org/htmlunit/html/HtmlEmailInput2Test.java b/src/test/java/org/htmlunit/html/HtmlEmailInput2Test.java
index 844b2ba64fb..b4100754e7d 100644
--- a/src/test/java/org/htmlunit/html/HtmlEmailInput2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlEmailInput2Test.java
@@ -17,7 +17,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.javascript.host.event.KeyboardEvent;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlEmailInputTest.java b/src/test/java/org/htmlunit/html/HtmlEmailInputTest.java
index aed9958423c..8df3784eae4 100644
--- a/src/test/java/org/htmlunit/html/HtmlEmailInputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlEmailInputTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlEmbedTest.java b/src/test/java/org/htmlunit/html/HtmlEmbedTest.java
index fd9e7caaf44..e8252ff6ec8 100644
--- a/src/test/java/org/htmlunit/html/HtmlEmbedTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlEmbedTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlFieldSetTest.java b/src/test/java/org/htmlunit/html/HtmlFieldSetTest.java
index 684fa07b02e..4fef865d2aa 100644
--- a/src/test/java/org/htmlunit/html/HtmlFieldSetTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlFieldSetTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlFileInput2Test.java b/src/test/java/org/htmlunit/html/HtmlFileInput2Test.java
index 5417af95412..bfa3b41a22a 100644
--- a/src/test/java/org/htmlunit/html/HtmlFileInput2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlFileInput2Test.java
@@ -51,7 +51,7 @@
import org.htmlunit.WebRequest;
import org.htmlunit.WebServerTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.KeyDataPair;
import org.htmlunit.util.MimeType;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/html/HtmlFileInput3Test.java b/src/test/java/org/htmlunit/html/HtmlFileInput3Test.java
index 70161324a4a..8988d424111 100644
--- a/src/test/java/org/htmlunit/html/HtmlFileInput3Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlFileInput3Test.java
@@ -34,7 +34,7 @@
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.BeforeClass;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/html/HtmlFileInputTest.java b/src/test/java/org/htmlunit/html/HtmlFileInputTest.java
index 5e2944083e6..63922a182d8 100644
--- a/src/test/java/org/htmlunit/html/HtmlFileInputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlFileInputTest.java
@@ -23,8 +23,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.WebRequest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.Retry;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.Retry;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlFontTest.java b/src/test/java/org/htmlunit/html/HtmlFontTest.java
index 528f93ffc26..c513ec1422c 100644
--- a/src/test/java/org/htmlunit/html/HtmlFontTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlFontTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlForm2Test.java b/src/test/java/org/htmlunit/html/HtmlForm2Test.java
index 852798025be..72bb9960fdb 100644
--- a/src/test/java/org/htmlunit/html/HtmlForm2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlForm2Test.java
@@ -40,8 +40,8 @@
import org.htmlunit.WebClient;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.htmlunit.util.UrlUtils;
diff --git a/src/test/java/org/htmlunit/html/HtmlFormTest.java b/src/test/java/org/htmlunit/html/HtmlFormTest.java
index 4b3d707eae9..241a8605fe1 100644
--- a/src/test/java/org/htmlunit/html/HtmlFormTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlFormTest.java
@@ -32,7 +32,7 @@
import org.htmlunit.WebRequest;
import org.htmlunit.WebWindow;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/html/HtmlFrame2Test.java b/src/test/java/org/htmlunit/html/HtmlFrame2Test.java
index f279c9d647f..b7232495a6d 100644
--- a/src/test/java/org/htmlunit/html/HtmlFrame2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlFrame2Test.java
@@ -19,9 +19,9 @@
import org.htmlunit.MockWebConnection;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlFrameSetTest.java b/src/test/java/org/htmlunit/html/HtmlFrameSetTest.java
index 2b4c8924be8..6c144cffb4e 100644
--- a/src/test/java/org/htmlunit/html/HtmlFrameSetTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlFrameSetTest.java
@@ -26,7 +26,7 @@
import org.htmlunit.WebClient;
import org.htmlunit.WebWindow;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlFrameTest.java b/src/test/java/org/htmlunit/html/HtmlFrameTest.java
index 1fd3b7070f8..968e8e858b2 100644
--- a/src/test/java/org/htmlunit/html/HtmlFrameTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlFrameTest.java
@@ -27,7 +27,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.WebClient;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlHeadTest.java b/src/test/java/org/htmlunit/html/HtmlHeadTest.java
index b585ede1932..5624d7a7cd8 100644
--- a/src/test/java/org/htmlunit/html/HtmlHeadTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlHeadTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlHeading2Test.java b/src/test/java/org/htmlunit/html/HtmlHeading2Test.java
index 098668d6aea..c9abe571c41 100644
--- a/src/test/java/org/htmlunit/html/HtmlHeading2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlHeading2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlHiddenInputTest.java b/src/test/java/org/htmlunit/html/HtmlHiddenInputTest.java
index 1912f60f464..615aab476e3 100644
--- a/src/test/java/org/htmlunit/html/HtmlHiddenInputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlHiddenInputTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlHorizontalRuleTest.java b/src/test/java/org/htmlunit/html/HtmlHorizontalRuleTest.java
index f229ff56fd8..1020d49e2b3 100644
--- a/src/test/java/org/htmlunit/html/HtmlHorizontalRuleTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlHorizontalRuleTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlImage2Test.java b/src/test/java/org/htmlunit/html/HtmlImage2Test.java
index ad7a8e84c54..3c54c7d920f 100644
--- a/src/test/java/org/htmlunit/html/HtmlImage2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlImage2Test.java
@@ -14,8 +14,8 @@
*/
package org.htmlunit.html;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.CHROME;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.EDGE;
+import static org.htmlunit.junit.annotation.TestedBrowser.CHROME;
+import static org.htmlunit.junit.annotation.TestedBrowser.EDGE;
import java.io.InputStream;
import java.net.URL;
@@ -24,8 +24,8 @@
import org.apache.commons.io.IOUtils;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlImageInput2Test.java b/src/test/java/org/htmlunit/html/HtmlImageInput2Test.java
index 0023a0ef021..973d3b73992 100644
--- a/src/test/java/org/htmlunit/html/HtmlImageInput2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlImageInput2Test.java
@@ -27,7 +27,7 @@
import org.htmlunit.MockWebConnection;
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.NameValuePair;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlImageInputTest.java b/src/test/java/org/htmlunit/html/HtmlImageInputTest.java
index e6d1b556242..ca065308ba2 100644
--- a/src/test/java/org/htmlunit/html/HtmlImageInputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlImageInputTest.java
@@ -14,8 +14,8 @@
*/
package org.htmlunit.html;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.CHROME;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.EDGE;
+import static org.htmlunit.junit.annotation.TestedBrowser.CHROME;
+import static org.htmlunit.junit.annotation.TestedBrowser.EDGE;
import java.io.InputStream;
import java.net.URL;
@@ -24,9 +24,9 @@
import org.apache.commons.io.IOUtils;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlImageTest.java b/src/test/java/org/htmlunit/html/HtmlImageTest.java
index 591df83c678..ac66c7daac3 100644
--- a/src/test/java/org/htmlunit/html/HtmlImageTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlImageTest.java
@@ -24,7 +24,7 @@
import org.htmlunit.Page;
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlInlineFrame2Test.java b/src/test/java/org/htmlunit/html/HtmlInlineFrame2Test.java
index b7e0bb9f156..3dcb5792ae5 100644
--- a/src/test/java/org/htmlunit/html/HtmlInlineFrame2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlInlineFrame2Test.java
@@ -14,8 +14,8 @@
*/
package org.htmlunit.html;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.CHROME;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.EDGE;
+import static org.htmlunit.junit.annotation.TestedBrowser.CHROME;
+import static org.htmlunit.junit.annotation.TestedBrowser.EDGE;
import java.io.File;
import java.net.URL;
@@ -25,9 +25,9 @@
import org.htmlunit.MockWebConnection;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlInput2Test.java b/src/test/java/org/htmlunit/html/HtmlInput2Test.java
index 4a57679d211..128be9056d3 100644
--- a/src/test/java/org/htmlunit/html/HtmlInput2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlInput2Test.java
@@ -20,8 +20,8 @@
import org.apache.commons.lang3.StringUtils;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlInput3Test.java b/src/test/java/org/htmlunit/html/HtmlInput3Test.java
index 04626fcbff2..76a8b71625a 100644
--- a/src/test/java/org/htmlunit/html/HtmlInput3Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlInput3Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlInsertedTextTest.java b/src/test/java/org/htmlunit/html/HtmlInsertedTextTest.java
index 88dea6e1b09..d2ee05dec57 100644
--- a/src/test/java/org/htmlunit/html/HtmlInsertedTextTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlInsertedTextTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlIsIndex2Test.java b/src/test/java/org/htmlunit/html/HtmlIsIndex2Test.java
index 28ce752fb7c..88dad2a9df9 100644
--- a/src/test/java/org/htmlunit/html/HtmlIsIndex2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlIsIndex2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlLabelTest.java b/src/test/java/org/htmlunit/html/HtmlLabelTest.java
index 4937c39b74e..733826b4636 100644
--- a/src/test/java/org/htmlunit/html/HtmlLabelTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlLabelTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlLegendTest.java b/src/test/java/org/htmlunit/html/HtmlLegendTest.java
index 62c8110f146..d30d330574b 100644
--- a/src/test/java/org/htmlunit/html/HtmlLegendTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlLegendTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlLink2Test.java b/src/test/java/org/htmlunit/html/HtmlLink2Test.java
index 08d16edb381..77f05d0c143 100644
--- a/src/test/java/org/htmlunit/html/HtmlLink2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlLink2Test.java
@@ -28,7 +28,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.WebResponse;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/html/HtmlLinkTest.java b/src/test/java/org/htmlunit/html/HtmlLinkTest.java
index 87410d347bf..105ce749720 100644
--- a/src/test/java/org/htmlunit/html/HtmlLinkTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlLinkTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlListItemTest.java b/src/test/java/org/htmlunit/html/HtmlListItemTest.java
index 01e42efdc67..9fa4ab0ea6e 100644
--- a/src/test/java/org/htmlunit/html/HtmlListItemTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlListItemTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlMapTest.java b/src/test/java/org/htmlunit/html/HtmlMapTest.java
index ce6530ca6cc..8e32daf8087 100644
--- a/src/test/java/org/htmlunit/html/HtmlMapTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlMapTest.java
@@ -23,8 +23,8 @@
import org.htmlunit.MockWebConnection;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlMenuTest.java b/src/test/java/org/htmlunit/html/HtmlMenuTest.java
index cd7e834d893..d09b1899358 100644
--- a/src/test/java/org/htmlunit/html/HtmlMenuTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlMenuTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlMetaTest.java b/src/test/java/org/htmlunit/html/HtmlMetaTest.java
index b084b1e310b..5d775b91f37 100644
--- a/src/test/java/org/htmlunit/html/HtmlMetaTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlMetaTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlModificationTest.java b/src/test/java/org/htmlunit/html/HtmlModificationTest.java
index 6ced588d148..88debda5459 100644
--- a/src/test/java/org/htmlunit/html/HtmlModificationTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlModificationTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlMonthInput2Test.java b/src/test/java/org/htmlunit/html/HtmlMonthInput2Test.java
index b2b3f89f5f8..3ac1d5abe6d 100644
--- a/src/test/java/org/htmlunit/html/HtmlMonthInput2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlMonthInput2Test.java
@@ -14,12 +14,12 @@
*/
package org.htmlunit.html;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF_ESR;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF_ESR;
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlMonthInputTest.java b/src/test/java/org/htmlunit/html/HtmlMonthInputTest.java
index a0e7d401193..1dd160dbe11 100644
--- a/src/test/java/org/htmlunit/html/HtmlMonthInputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlMonthInputTest.java
@@ -14,13 +14,13 @@
*/
package org.htmlunit.html;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF_ESR;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF_ESR;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlNoFrames2Test.java b/src/test/java/org/htmlunit/html/HtmlNoFrames2Test.java
index f4c12a26b89..6437e39a90f 100644
--- a/src/test/java/org/htmlunit/html/HtmlNoFrames2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlNoFrames2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlNoScript2Test.java b/src/test/java/org/htmlunit/html/HtmlNoScript2Test.java
index e99f48ac6c9..4d2eafa962a 100644
--- a/src/test/java/org/htmlunit/html/HtmlNoScript2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlNoScript2Test.java
@@ -18,7 +18,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.WebClient;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlNoScriptTest.java b/src/test/java/org/htmlunit/html/HtmlNoScriptTest.java
index 95f6184edfd..e4f268b8ded 100644
--- a/src/test/java/org/htmlunit/html/HtmlNoScriptTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlNoScriptTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlNumberInput2Test.java b/src/test/java/org/htmlunit/html/HtmlNumberInput2Test.java
index 9d0f32b1e4c..ce76e07cd24 100644
--- a/src/test/java/org/htmlunit/html/HtmlNumberInput2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlNumberInput2Test.java
@@ -17,7 +17,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.javascript.host.event.KeyboardEvent;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlNumberInputTest.java b/src/test/java/org/htmlunit/html/HtmlNumberInputTest.java
index 54f81f9ce44..bd26aaa7fdc 100644
--- a/src/test/java/org/htmlunit/html/HtmlNumberInputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlNumberInputTest.java
@@ -20,8 +20,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlObject2Test.java b/src/test/java/org/htmlunit/html/HtmlObject2Test.java
index f4e7e6923c9..251565d8f44 100644
--- a/src/test/java/org/htmlunit/html/HtmlObject2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlObject2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlObjectTest.java b/src/test/java/org/htmlunit/html/HtmlObjectTest.java
index 09b463ee397..f013bda7bad 100644
--- a/src/test/java/org/htmlunit/html/HtmlObjectTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlObjectTest.java
@@ -22,7 +22,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.WebClient;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlOption2Test.java b/src/test/java/org/htmlunit/html/HtmlOption2Test.java
index 7f4880df13e..bfebe5cc2fc 100644
--- a/src/test/java/org/htmlunit/html/HtmlOption2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlOption2Test.java
@@ -19,9 +19,9 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlOptionGroup2Test.java b/src/test/java/org/htmlunit/html/HtmlOptionGroup2Test.java
index 421ff530ceb..4d6f619f045 100644
--- a/src/test/java/org/htmlunit/html/HtmlOptionGroup2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlOptionGroup2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlOptionGroupTest.java b/src/test/java/org/htmlunit/html/HtmlOptionGroupTest.java
index 428468f12a0..7ceefda8a02 100644
--- a/src/test/java/org/htmlunit/html/HtmlOptionGroupTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlOptionGroupTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlOptionTest.java b/src/test/java/org/htmlunit/html/HtmlOptionTest.java
index c0444128026..f2785add345 100644
--- a/src/test/java/org/htmlunit/html/HtmlOptionTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlOptionTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlOrderedList2Test.java b/src/test/java/org/htmlunit/html/HtmlOrderedList2Test.java
index 80092c7ef47..d4447de5f7f 100644
--- a/src/test/java/org/htmlunit/html/HtmlOrderedList2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlOrderedList2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlOutputTest.java b/src/test/java/org/htmlunit/html/HtmlOutputTest.java
index 84156b05ebc..ed3ffdd520b 100644
--- a/src/test/java/org/htmlunit/html/HtmlOutputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlOutputTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlPage2Test.java b/src/test/java/org/htmlunit/html/HtmlPage2Test.java
index 929497c52c2..e807096fb89 100644
--- a/src/test/java/org/htmlunit/html/HtmlPage2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlPage2Test.java
@@ -33,7 +33,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.WebClient;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Rule;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/html/HtmlPage3Test.java b/src/test/java/org/htmlunit/html/HtmlPage3Test.java
index 82e3ac28cf1..6e4d2f45d46 100644
--- a/src/test/java/org/htmlunit/html/HtmlPage3Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlPage3Test.java
@@ -15,8 +15,8 @@
package org.htmlunit.html;
import static java.nio.charset.StandardCharsets.ISO_8859_1;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF_ESR;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF_ESR;
import java.net.URL;
import java.util.List;
@@ -25,8 +25,8 @@
import org.htmlunit.HttpHeader;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlPage4Test.java b/src/test/java/org/htmlunit/html/HtmlPage4Test.java
index 1803ea5b17b..7d337aebbb8 100644
--- a/src/test/java/org/htmlunit/html/HtmlPage4Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlPage4Test.java
@@ -31,7 +31,7 @@
import org.htmlunit.WebClient;
import org.htmlunit.WebServerTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.ServletContentWrapper;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/html/HtmlPageTest.java b/src/test/java/org/htmlunit/html/HtmlPageTest.java
index 224a5bfed72..37bfb5cb2a0 100644
--- a/src/test/java/org/htmlunit/html/HtmlPageTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlPageTest.java
@@ -50,7 +50,7 @@
import org.htmlunit.WebResponse;
import org.htmlunit.html.HtmlElementTest.HtmlAttributeChangeListenerTestImpl;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.Cookie;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
diff --git a/src/test/java/org/htmlunit/html/HtmlPageTest5.java b/src/test/java/org/htmlunit/html/HtmlPageTest5.java
index d897b484381..8d44ea29644 100644
--- a/src/test/java/org/htmlunit/html/HtmlPageTest5.java
+++ b/src/test/java/org/htmlunit/html/HtmlPageTest5.java
@@ -19,7 +19,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlParameterTest.java b/src/test/java/org/htmlunit/html/HtmlParameterTest.java
index 6c0a2c85592..1131c4bd555 100644
--- a/src/test/java/org/htmlunit/html/HtmlParameterTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlParameterTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlPasswordInput2Test.java b/src/test/java/org/htmlunit/html/HtmlPasswordInput2Test.java
index 9c4a016a5b4..7bcd6ba8003 100644
--- a/src/test/java/org/htmlunit/html/HtmlPasswordInput2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlPasswordInput2Test.java
@@ -17,7 +17,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.javascript.host.event.KeyboardEvent;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlPasswordInputTest.java b/src/test/java/org/htmlunit/html/HtmlPasswordInputTest.java
index a87f1e5622b..d0b5e255a36 100644
--- a/src/test/java/org/htmlunit/html/HtmlPasswordInputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlPasswordInputTest.java
@@ -20,7 +20,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlPreformattedTextTest.java b/src/test/java/org/htmlunit/html/HtmlPreformattedTextTest.java
index c030769b28c..ae251e622f2 100644
--- a/src/test/java/org/htmlunit/html/HtmlPreformattedTextTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlPreformattedTextTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlProgressTest.java b/src/test/java/org/htmlunit/html/HtmlProgressTest.java
index 4bddc52e48e..ba0377f92f8 100644
--- a/src/test/java/org/htmlunit/html/HtmlProgressTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlProgressTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlQuoteTest.java b/src/test/java/org/htmlunit/html/HtmlQuoteTest.java
index 801ed193bf9..5ea8e06386f 100644
--- a/src/test/java/org/htmlunit/html/HtmlQuoteTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlQuoteTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlRadioButtonInput2Test.java b/src/test/java/org/htmlunit/html/HtmlRadioButtonInput2Test.java
index 0e01a109f30..537914829fa 100644
--- a/src/test/java/org/htmlunit/html/HtmlRadioButtonInput2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlRadioButtonInput2Test.java
@@ -18,7 +18,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlRadioButtonInputTest.java b/src/test/java/org/htmlunit/html/HtmlRadioButtonInputTest.java
index d0e83034434..c0a23793d27 100644
--- a/src/test/java/org/htmlunit/html/HtmlRadioButtonInputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlRadioButtonInputTest.java
@@ -21,7 +21,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.WebClient;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlRangeInputTest.java b/src/test/java/org/htmlunit/html/HtmlRangeInputTest.java
index 2144753060d..10febc6c4eb 100644
--- a/src/test/java/org/htmlunit/html/HtmlRangeInputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlRangeInputTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlRbTest.java b/src/test/java/org/htmlunit/html/HtmlRbTest.java
index e0063b4a0e0..96ea589e3a0 100644
--- a/src/test/java/org/htmlunit/html/HtmlRbTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlRbTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlResetInput2Test.java b/src/test/java/org/htmlunit/html/HtmlResetInput2Test.java
index 2b50168eb15..6702734e535 100644
--- a/src/test/java/org/htmlunit/html/HtmlResetInput2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlResetInput2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlRpTest.java b/src/test/java/org/htmlunit/html/HtmlRpTest.java
index f2975977288..70f116f1078 100644
--- a/src/test/java/org/htmlunit/html/HtmlRpTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlRpTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlRtTest.java b/src/test/java/org/htmlunit/html/HtmlRtTest.java
index 02a37ca9035..8f946b3e94d 100644
--- a/src/test/java/org/htmlunit/html/HtmlRtTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlRtTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlRtcTest.java b/src/test/java/org/htmlunit/html/HtmlRtcTest.java
index f6afc8bd9a3..ad15d5b015a 100644
--- a/src/test/java/org/htmlunit/html/HtmlRtcTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlRtcTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlScript2Test.java b/src/test/java/org/htmlunit/html/HtmlScript2Test.java
index 9b5db8db5a5..795bac75e62 100644
--- a/src/test/java/org/htmlunit/html/HtmlScript2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlScript2Test.java
@@ -26,8 +26,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.http.HttpStatus;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/html/HtmlScriptTest.java b/src/test/java/org/htmlunit/html/HtmlScriptTest.java
index 4c5f464269c..c901b9f1ace 100644
--- a/src/test/java/org/htmlunit/html/HtmlScriptTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlScriptTest.java
@@ -26,7 +26,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.WebClient;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlSearchInput2Test.java b/src/test/java/org/htmlunit/html/HtmlSearchInput2Test.java
index 81dd046ac9e..7930ff80e24 100644
--- a/src/test/java/org/htmlunit/html/HtmlSearchInput2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlSearchInput2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlSearchInputTest.java b/src/test/java/org/htmlunit/html/HtmlSearchInputTest.java
index 7907fb13231..eee276e87f4 100644
--- a/src/test/java/org/htmlunit/html/HtmlSearchInputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlSearchInputTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlSelect2Test.java b/src/test/java/org/htmlunit/html/HtmlSelect2Test.java
index 5f62f8c07e7..a336615dcf1 100644
--- a/src/test/java/org/htmlunit/html/HtmlSelect2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlSelect2Test.java
@@ -18,7 +18,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlSlotTest.java b/src/test/java/org/htmlunit/html/HtmlSlotTest.java
index 8618b7436b9..ae945e45504 100644
--- a/src/test/java/org/htmlunit/html/HtmlSlotTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlSlotTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlSpan2Test.java b/src/test/java/org/htmlunit/html/HtmlSpan2Test.java
index 878f5b90ccc..db48fe0ecfa 100644
--- a/src/test/java/org/htmlunit/html/HtmlSpan2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlSpan2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlStyle2Test.java b/src/test/java/org/htmlunit/html/HtmlStyle2Test.java
index ee4f2a09337..a91d73b49b9 100644
--- a/src/test/java/org/htmlunit/html/HtmlStyle2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlStyle2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlSubmitInput2Test.java b/src/test/java/org/htmlunit/html/HtmlSubmitInput2Test.java
index a38baff8460..9de8074054d 100644
--- a/src/test/java/org/htmlunit/html/HtmlSubmitInput2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlSubmitInput2Test.java
@@ -19,7 +19,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlSubmitInputTest.java b/src/test/java/org/htmlunit/html/HtmlSubmitInputTest.java
index 5abac0b4d8e..c0111f0e7a7 100644
--- a/src/test/java/org/htmlunit/html/HtmlSubmitInputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlSubmitInputTest.java
@@ -22,7 +22,7 @@
import org.htmlunit.MockWebConnection;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.NameValuePair;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlSvgTest.java b/src/test/java/org/htmlunit/html/HtmlSvgTest.java
index b0b18a2a821..b08b5f80afc 100644
--- a/src/test/java/org/htmlunit/html/HtmlSvgTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlSvgTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlTable2Test.java b/src/test/java/org/htmlunit/html/HtmlTable2Test.java
index 55481511d27..beeb664bd80 100644
--- a/src/test/java/org/htmlunit/html/HtmlTable2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlTable2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlTableCellTest.java b/src/test/java/org/htmlunit/html/HtmlTableCellTest.java
index 87ae90835d8..9b53b241694 100644
--- a/src/test/java/org/htmlunit/html/HtmlTableCellTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlTableCellTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlTableColumnTest.java b/src/test/java/org/htmlunit/html/HtmlTableColumnTest.java
index 409f79ce7c7..107208d55ad 100644
--- a/src/test/java/org/htmlunit/html/HtmlTableColumnTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlTableColumnTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlTableRowTest.java b/src/test/java/org/htmlunit/html/HtmlTableRowTest.java
index c433e39b4be..337d30bc598 100644
--- a/src/test/java/org/htmlunit/html/HtmlTableRowTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlTableRowTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.corejs.javascript.ScriptableObject;
import org.htmlunit.javascript.host.html.HTMLElement;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlTableSection2Test.java b/src/test/java/org/htmlunit/html/HtmlTableSection2Test.java
index f6a69d0cb8f..a900919ba0f 100644
--- a/src/test/java/org/htmlunit/html/HtmlTableSection2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlTableSection2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlTelInput2Test.java b/src/test/java/org/htmlunit/html/HtmlTelInput2Test.java
index 05a2c4a9c3c..5bd2a6e1063 100644
--- a/src/test/java/org/htmlunit/html/HtmlTelInput2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlTelInput2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlTelInputTest.java b/src/test/java/org/htmlunit/html/HtmlTelInputTest.java
index cf3e1a52ba8..85bdb0b8694 100644
--- a/src/test/java/org/htmlunit/html/HtmlTelInputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlTelInputTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlTemplateTest.java b/src/test/java/org/htmlunit/html/HtmlTemplateTest.java
index 9db88a5595d..fdfcd13d85d 100644
--- a/src/test/java/org/htmlunit/html/HtmlTemplateTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlTemplateTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlTextArea2Test.java b/src/test/java/org/htmlunit/html/HtmlTextArea2Test.java
index 4fc0a701c8c..17bd15a24f7 100644
--- a/src/test/java/org/htmlunit/html/HtmlTextArea2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlTextArea2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlTextInput2Test.java b/src/test/java/org/htmlunit/html/HtmlTextInput2Test.java
index 03d41d31aa5..21c81745977 100644
--- a/src/test/java/org/htmlunit/html/HtmlTextInput2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlTextInput2Test.java
@@ -24,7 +24,7 @@
import org.htmlunit.WebClient;
import org.htmlunit.javascript.host.event.KeyboardEvent;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.platform.AwtClipboardHandler;
import org.junit.Assume;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/html/HtmlTextInputTest.java b/src/test/java/org/htmlunit/html/HtmlTextInputTest.java
index aebfae21a52..ec196b720ea 100644
--- a/src/test/java/org/htmlunit/html/HtmlTextInputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlTextInputTest.java
@@ -23,7 +23,7 @@
import org.apache.commons.lang3.ArrayUtils;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Assume;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/html/HtmlTimeInputTest.java b/src/test/java/org/htmlunit/html/HtmlTimeInputTest.java
index 4f3d5b401f5..048888cb022 100644
--- a/src/test/java/org/htmlunit/html/HtmlTimeInputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlTimeInputTest.java
@@ -16,9 +16,9 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlTitle2Test.java b/src/test/java/org/htmlunit/html/HtmlTitle2Test.java
index 147bc3b682d..7f033c16251 100644
--- a/src/test/java/org/htmlunit/html/HtmlTitle2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlTitle2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlTitleTest.java b/src/test/java/org/htmlunit/html/HtmlTitleTest.java
index 701ee167399..f8eb3bec5aa 100644
--- a/src/test/java/org/htmlunit/html/HtmlTitleTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlTitleTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.MockWebConnection;
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlUnknownElementTest.java b/src/test/java/org/htmlunit/html/HtmlUnknownElementTest.java
index b07af17a843..3a7b0aca4ac 100644
--- a/src/test/java/org/htmlunit/html/HtmlUnknownElementTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlUnknownElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/HtmlUnorderedListTest.java b/src/test/java/org/htmlunit/html/HtmlUnorderedListTest.java
index 42bc2d78453..6480a2a1799 100644
--- a/src/test/java/org/htmlunit/html/HtmlUnorderedListTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlUnorderedListTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlUrlInput2Test.java b/src/test/java/org/htmlunit/html/HtmlUrlInput2Test.java
index 95bd94f7112..48947b91265 100644
--- a/src/test/java/org/htmlunit/html/HtmlUrlInput2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlUrlInput2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlUrlInputTest.java b/src/test/java/org/htmlunit/html/HtmlUrlInputTest.java
index f4fcf86404c..8071a6faef6 100644
--- a/src/test/java/org/htmlunit/html/HtmlUrlInputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlUrlInputTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlWeekInput2Test.java b/src/test/java/org/htmlunit/html/HtmlWeekInput2Test.java
index 1bb0770989c..aa8b08d07a5 100644
--- a/src/test/java/org/htmlunit/html/HtmlWeekInput2Test.java
+++ b/src/test/java/org/htmlunit/html/HtmlWeekInput2Test.java
@@ -14,12 +14,12 @@
*/
package org.htmlunit.html;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF_ESR;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF_ESR;
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/HtmlWeekInputTest.java b/src/test/java/org/htmlunit/html/HtmlWeekInputTest.java
index ac54144d6a4..fa0b58c014d 100644
--- a/src/test/java/org/htmlunit/html/HtmlWeekInputTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlWeekInputTest.java
@@ -14,13 +14,13 @@
*/
package org.htmlunit.html;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF_ESR;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF_ESR;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/HtmlWordBreakTest.java b/src/test/java/org/htmlunit/html/HtmlWordBreakTest.java
index aba1e474a5f..3b57cad5228 100644
--- a/src/test/java/org/htmlunit/html/HtmlWordBreakTest.java
+++ b/src/test/java/org/htmlunit/html/HtmlWordBreakTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/IEConditionalCommentExpressionEvaluatorTest.java b/src/test/java/org/htmlunit/html/IEConditionalCommentExpressionEvaluatorTest.java
index 1bc51c7843e..619e53fccc1 100644
--- a/src/test/java/org/htmlunit/html/IEConditionalCommentExpressionEvaluatorTest.java
+++ b/src/test/java/org/htmlunit/html/IEConditionalCommentExpressionEvaluatorTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/IEConditionalCommentsTest.java b/src/test/java/org/htmlunit/html/IEConditionalCommentsTest.java
index a75d66f16e2..938131a4d13 100644
--- a/src/test/java/org/htmlunit/html/IEConditionalCommentsTest.java
+++ b/src/test/java/org/htmlunit/html/IEConditionalCommentsTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/XHtmlPage2Test.java b/src/test/java/org/htmlunit/html/XHtmlPage2Test.java
index 3b077e22426..f2ac03245a8 100644
--- a/src/test/java/org/htmlunit/html/XHtmlPage2Test.java
+++ b/src/test/java/org/htmlunit/html/XHtmlPage2Test.java
@@ -18,8 +18,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/parser/HTMLParser2Test.java b/src/test/java/org/htmlunit/html/parser/HTMLParser2Test.java
index 1dfce08c327..288e18ba3e2 100644
--- a/src/test/java/org/htmlunit/html/parser/HTMLParser2Test.java
+++ b/src/test/java/org/htmlunit/html/parser/HTMLParser2Test.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/parser/HTMLParser4Test.java b/src/test/java/org/htmlunit/html/parser/HTMLParser4Test.java
index d6111d66828..0c734736516 100644
--- a/src/test/java/org/htmlunit/html/parser/HTMLParser4Test.java
+++ b/src/test/java/org/htmlunit/html/parser/HTMLParser4Test.java
@@ -17,9 +17,9 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/html/parser/HTMLParser5Test.java b/src/test/java/org/htmlunit/html/parser/HTMLParser5Test.java
index 031f417c852..7bc816a6df8 100644
--- a/src/test/java/org/htmlunit/html/parser/HTMLParser5Test.java
+++ b/src/test/java/org/htmlunit/html/parser/HTMLParser5Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.JavascriptExecutor;
diff --git a/src/test/java/org/htmlunit/html/parser/HTMLParser6Test.java b/src/test/java/org/htmlunit/html/parser/HTMLParser6Test.java
index fa7125f7332..6282c45a381 100644
--- a/src/test/java/org/htmlunit/html/parser/HTMLParser6Test.java
+++ b/src/test/java/org/htmlunit/html/parser/HTMLParser6Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/parser/MalformedHtmlTest.java b/src/test/java/org/htmlunit/html/parser/MalformedHtmlTest.java
index 58b6a07769e..1820ffe1cf8 100644
--- a/src/test/java/org/htmlunit/html/parser/MalformedHtmlTest.java
+++ b/src/test/java/org/htmlunit/html/parser/MalformedHtmlTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/html/serializer/HtmlSerializerInnerOuterText2Test.java b/src/test/java/org/htmlunit/html/serializer/HtmlSerializerInnerOuterText2Test.java
index 49596687e19..7f843e1da51 100644
--- a/src/test/java/org/htmlunit/html/serializer/HtmlSerializerInnerOuterText2Test.java
+++ b/src/test/java/org/htmlunit/html/serializer/HtmlSerializerInnerOuterText2Test.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
@@ -1316,7 +1316,6 @@ public void getInnerTextWhiteSpaceOrderedListPreWrap() throws Exception {
@Test
@Alerts(DEFAULT = "\n\nfirst item\n\n\nA B C D\nEF\nG\nH\nI"
+ "\n\n\nthird item\n4. item\n\nsome text\n\nlast item\n\n",
- FF = "first item\nA B C D\nEF\nG\nH\nI\nthird item\n4. item\nsome text\n\nlast item",
FF_ESR = "first item\nA B C D\nEFGH\nI\nthird item\n4. item\nsome text\nlast item")
@HtmlUnitNYI(CHROME = "first item\n\n\n A B C D\nEF\nG\nH\n I"
+ "\n\n\nthird item\n4. item\n\nsome text\n\nlast item\n\n",
@@ -1425,7 +1424,6 @@ public void getInnerTextWhiteSpaceUnorderedListPreWrap() throws Exception {
@Test
@Alerts(DEFAULT = "\n\nfirst item\n\n\nA B C D\nEF\nG\nH\nI\n"
+ "\n\nthird item\n4. item\n\nsome text\n\nlast item\n\n",
- FF = "first item\nA B C D\nEF\nG\nH\nI\nthird item\n4. item\nsome text\n\nlast item",
FF_ESR = "first item\nA B C D\nEFGH\nI\nthird item\n4. item\nsome text\nlast item")
@HtmlUnitNYI(CHROME = "first item\n\n\n A B C D\nEF\nG\nH\n I"
+ "\n\n\nthird item\n4. item\n\nsome text\n\nlast item\n\n",
diff --git a/src/test/java/org/htmlunit/html/serializer/HtmlSerializerNormalizedText2Test.java b/src/test/java/org/htmlunit/html/serializer/HtmlSerializerNormalizedText2Test.java
index e56f194051c..dbb494166f9 100644
--- a/src/test/java/org/htmlunit/html/serializer/HtmlSerializerNormalizedText2Test.java
+++ b/src/test/java/org/htmlunit/html/serializer/HtmlSerializerNormalizedText2Test.java
@@ -22,7 +22,7 @@
import org.htmlunit.html.HtmlTable;
import org.htmlunit.html.HtmlTableCell;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/html/serializer/HtmlSerializerVisibleText2Test.java b/src/test/java/org/htmlunit/html/serializer/HtmlSerializerVisibleText2Test.java
index 7aab1dc7367..bec3f3a5545 100644
--- a/src/test/java/org/htmlunit/html/serializer/HtmlSerializerVisibleText2Test.java
+++ b/src/test/java/org/htmlunit/html/serializer/HtmlSerializerVisibleText2Test.java
@@ -21,8 +21,8 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.serializer.HtmlSerializerVisibleText.HtmlSerializerTextBuilder;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.xml.XmlPage;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -799,9 +799,9 @@ private void getVisibleTextWhiteSpaceTitle(final String whiteSpace) throws Excep
* @throws Exception if the test fails
*/
@Test
- @Alerts(DEFAULT = "A B C D EF G H I\nSecond",
- CHROME = " A B C D EF G H\nI\n Second\n ",
- EDGE = " A B C D EF G H\nI\n Second\n ")
+ @Alerts(DEFAULT = " A B C D EF G H I\n Second\n ",
+ FF = "A B C D EF G H I\nSecond",
+ FF_ESR = "A B C D EF G H I\nSecond")
@HtmlUnitNYI(CHROME = "A B C D EF G H I\nSecond",
EDGE = "A B C D EF G H I\nSecond")
public void getVisibleTextWhiteSpaceSelect() throws Exception {
@@ -813,11 +813,7 @@ public void getVisibleTextWhiteSpaceSelect() throws Exception {
* @throws Exception if the test fails
*/
@Test
- @Alerts(DEFAULT = "A B C D EF G H\nI\nSecond",
- FF = "A B C D EF G H I\nSecond",
- FF_ESR = "A B C D EF G H I\nSecond")
- @HtmlUnitNYI(CHROME = "A B C D EF G H I\nSecond",
- EDGE = "A B C D EF G H I\nSecond")
+ @Alerts("A B C D EF G H I\nSecond")
public void getVisibleTextWhiteSpaceSelectNormal() throws Exception {
getVisibleTextWhiteSpaceSelect("normal");
}
@@ -827,11 +823,7 @@ public void getVisibleTextWhiteSpaceSelectNormal() throws Exception {
* @throws Exception if the test fails
*/
@Test
- @Alerts(DEFAULT = "A B C D EF G H\nI\nSecond",
- FF = "A B C D EF G H I\nSecond",
- FF_ESR = "A B C D EF G H I\nSecond")
- @HtmlUnitNYI(CHROME = "A B C D EF G H I\nSecond",
- EDGE = "A B C D EF G H I\nSecond")
+ @Alerts("A B C D EF G H I\nSecond")
public void getVisibleTextWhiteSpaceSelectNowrap() throws Exception {
getVisibleTextWhiteSpaceSelect("nowrap");
}
@@ -841,7 +833,7 @@ public void getVisibleTextWhiteSpaceSelectNowrap() throws Exception {
* @throws Exception if the test fails
*/
@Test
- @Alerts(DEFAULT = " A B C D EF G H\nI\n Second\n ",
+ @Alerts(DEFAULT = " A B C D EF G H I\n Second\n ",
FF = "A B C D EF G H I\nSecond",
FF_ESR = "A B C D EF G H I\nSecond")
@HtmlUnitNYI(CHROME = " A B C D \nEF\nG \n H I \n Second\n ",
@@ -857,7 +849,7 @@ public void getVisibleTextWhiteSpaceSelectPre() throws Exception {
* @throws Exception if the test fails
*/
@Test
- @Alerts(DEFAULT = " A B C D EF G H\nI\n Second\n ",
+ @Alerts(DEFAULT = " A B C D EF G H I\n Second\n ",
FF = "A B C D EF G H I\nSecond",
FF_ESR = "A B C D EF G H I\nSecond")
@HtmlUnitNYI(CHROME = " A B C D \nEF\nG \n H I \n Second\n ",
@@ -873,9 +865,7 @@ public void getVisibleTextWhiteSpaceSelectPreWrap() throws Exception {
* @throws Exception if the test fails
*/
@Test
- @Alerts(DEFAULT = "A B C D EF G H\nI\nSecond",
- FF = "A B C D EF G H I\nSecond",
- FF_ESR = "A B C D EF G H I\nSecond")
+ @Alerts("A B C D EF G H I\nSecond")
@HtmlUnitNYI(CHROME = "A B C D \nEF\nG \n H I\n Second",
EDGE = "A B C D \nEF\nG \n H I\n Second",
FF = "A B C D \nEF\nG \n H I\n Second",
diff --git a/src/test/java/org/htmlunit/html/xpath/HtmlUnitXPath2Test.java b/src/test/java/org/htmlunit/html/xpath/HtmlUnitXPath2Test.java
index 5e7b5b4beb6..f2968a4e618 100644
--- a/src/test/java/org/htmlunit/html/xpath/HtmlUnitXPath2Test.java
+++ b/src/test/java/org/htmlunit/html/xpath/HtmlUnitXPath2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/ArgumentsTest.java b/src/test/java/org/htmlunit/javascript/ArgumentsTest.java
index 18793e6cfef..4b3161c8501 100644
--- a/src/test/java/org/htmlunit/javascript/ArgumentsTest.java
+++ b/src/test/java/org/htmlunit/javascript/ArgumentsTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/FunctionsRestParametersTest.java b/src/test/java/org/htmlunit/javascript/FunctionsRestParametersTest.java
index f260b803b2f..d691ef4d51f 100644
--- a/src/test/java/org/htmlunit/javascript/FunctionsRestParametersTest.java
+++ b/src/test/java/org/htmlunit/javascript/FunctionsRestParametersTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/FunctionsTest.java b/src/test/java/org/htmlunit/javascript/FunctionsTest.java
index a6050f92a79..ed8c9ad6bf4 100644
--- a/src/test/java/org/htmlunit/javascript/FunctionsTest.java
+++ b/src/test/java/org/htmlunit/javascript/FunctionsTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/FunctionsWrapper2Test.java b/src/test/java/org/htmlunit/javascript/FunctionsWrapper2Test.java
index cc5311f897e..fc601c11061 100644
--- a/src/test/java/org/htmlunit/javascript/FunctionsWrapper2Test.java
+++ b/src/test/java/org/htmlunit/javascript/FunctionsWrapper2Test.java
@@ -18,7 +18,7 @@
import org.htmlunit.Page;
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/FunctionsWrapperTest.java b/src/test/java/org/htmlunit/javascript/FunctionsWrapperTest.java
index c89e2c63859..3af3a524505 100644
--- a/src/test/java/org/htmlunit/javascript/FunctionsWrapperTest.java
+++ b/src/test/java/org/htmlunit/javascript/FunctionsWrapperTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/GlobalFunctionsTest.java b/src/test/java/org/htmlunit/javascript/GlobalFunctionsTest.java
index f7d524f8ed1..6df102bfea2 100644
--- a/src/test/java/org/htmlunit/javascript/GlobalFunctionsTest.java
+++ b/src/test/java/org/htmlunit/javascript/GlobalFunctionsTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/javascript/HtmlUnitScriptable2Test.java b/src/test/java/org/htmlunit/javascript/HtmlUnitScriptable2Test.java
index 3150df7c2a3..24817952297 100644
--- a/src/test/java/org/htmlunit/javascript/HtmlUnitScriptable2Test.java
+++ b/src/test/java/org/htmlunit/javascript/HtmlUnitScriptable2Test.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/HtmlUnitScriptableTest.java b/src/test/java/org/htmlunit/javascript/HtmlUnitScriptableTest.java
index 3e6b37b9372..678b4d62b69 100644
--- a/src/test/java/org/htmlunit/javascript/HtmlUnitScriptableTest.java
+++ b/src/test/java/org/htmlunit/javascript/HtmlUnitScriptableTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.html.HtmlPage;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/IEConditionalCompilationTest.java b/src/test/java/org/htmlunit/javascript/IEConditionalCompilationTest.java
index b2da952f84f..8a3374adc44 100644
--- a/src/test/java/org/htmlunit/javascript/IEConditionalCompilationTest.java
+++ b/src/test/java/org/htmlunit/javascript/IEConditionalCompilationTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/IteratorTest.java b/src/test/java/org/htmlunit/javascript/IteratorTest.java
index 00c92bff6da..6ea50fb0cf5 100644
--- a/src/test/java/org/htmlunit/javascript/IteratorTest.java
+++ b/src/test/java/org/htmlunit/javascript/IteratorTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/JavaScriptEngine2Test.java b/src/test/java/org/htmlunit/javascript/JavaScriptEngine2Test.java
index 6da8ed135c3..09acb93a062 100644
--- a/src/test/java/org/htmlunit/javascript/JavaScriptEngine2Test.java
+++ b/src/test/java/org/htmlunit/javascript/JavaScriptEngine2Test.java
@@ -18,9 +18,9 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/JavaScriptEngineTest.java b/src/test/java/org/htmlunit/javascript/JavaScriptEngineTest.java
index 59eded705db..e13b18de8b9 100644
--- a/src/test/java/org/htmlunit/javascript/JavaScriptEngineTest.java
+++ b/src/test/java/org/htmlunit/javascript/JavaScriptEngineTest.java
@@ -50,8 +50,8 @@
import org.htmlunit.html.HtmlScript;
import org.htmlunit.html.HtmlTextInput;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.Retry;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.Retry;
import org.htmlunit.util.NameValuePair;
import org.htmlunit.util.UrlUtils;
import org.junit.Test;
@@ -1184,7 +1184,7 @@ public void shutdownShouldKill() throws Exception {
try (WebClient webClient = getWebClient()) {
// there is no way to kill a thread in later JDK's
// to make the test running we need a final timeout for js stuff
- webClient.setJavaScriptTimeout(DEFAULT_WAIT_TIME * 20);
+ webClient.setJavaScriptTimeout(DEFAULT_WAIT_TIME * 10);
final List collectedAlerts = new ArrayList<>();
webClient.setAlertHandler(new CollectingAlertHandler(collectedAlerts));
@@ -1195,7 +1195,13 @@ public void shutdownShouldKill() throws Exception {
}
Thread.sleep(400);
- assertTrue(getJavaScriptThreads().isEmpty());
+ try {
+ assertTrue(getJavaScriptThreads().isEmpty());
+ }
+ catch (final AssertionError e) {
+ Thread.sleep(DEFAULT_WAIT_TIME * 10);
+ assertTrue(getJavaScriptThreads().isEmpty());
+ }
}
/**
diff --git a/src/test/java/org/htmlunit/javascript/NativeArrayTest.java b/src/test/java/org/htmlunit/javascript/NativeArrayTest.java
index 68254f82dab..420e95a4ffe 100644
--- a/src/test/java/org/htmlunit/javascript/NativeArrayTest.java
+++ b/src/test/java/org/htmlunit/javascript/NativeArrayTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/NativeBigIntTest.java b/src/test/java/org/htmlunit/javascript/NativeBigIntTest.java
new file mode 100644
index 00000000000..8875af661b7
--- /dev/null
+++ b/src/test/java/org/htmlunit/javascript/NativeBigIntTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2002-2025 Gargoyle Software Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.htmlunit.javascript;
+
+import org.htmlunit.WebDriverTestCase;
+import org.htmlunit.junit.BrowserRunner;
+import org.htmlunit.junit.annotation.Alerts;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Some test for BigInt support.
+ *
+ * @author Ronald Brill
+ */
+@RunWith(BrowserRunner.class)
+public class NativeBigIntTest extends WebDriverTestCase {
+
+ /**
+ * @throws Exception if the test fails
+ */
+ @Test
+ @Alerts({"bigint", "bigint"})
+ public void typeof() throws Exception {
+ final String html
+ = ""
+ + "\n"
+ + "\n"
+ + "";
+
+ loadPageVerifyTitle2(html);
+ }
+}
diff --git a/src/test/java/org/htmlunit/javascript/NativeDate2Test.java b/src/test/java/org/htmlunit/javascript/NativeDate2Test.java
index 4143dc1f1bf..64840aa22e9 100644
--- a/src/test/java/org/htmlunit/javascript/NativeDate2Test.java
+++ b/src/test/java/org/htmlunit/javascript/NativeDate2Test.java
@@ -19,9 +19,9 @@
import org.htmlunit.BrowserVersion;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -545,7 +545,7 @@ public void toTimeStringUTC() throws Exception {
}
@Test
- @Alerts("17:23:00 GMT-0500 (GMT-05:00)")
+ @Alerts("17:23:00 GMT-0500 (Eastern Standard Time)")
@BuggyWebDriver(FF = "23:23:00 GMT+0100 (Central European Standard Time)",
FF_ESR = "23:23:00 GMT+0100 (Central European Standard Time)")
@HtmlUnitNYI(CHROME = "17:23:00 GMT-0500 (-05:00)",
diff --git a/src/test/java/org/htmlunit/javascript/NativeDateTest.java b/src/test/java/org/htmlunit/javascript/NativeDateTest.java
index 9c64a38d77b..005e8dc2777 100644
--- a/src/test/java/org/htmlunit/javascript/NativeDateTest.java
+++ b/src/test/java/org/htmlunit/javascript/NativeDateTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/NativeErrorTest.java b/src/test/java/org/htmlunit/javascript/NativeErrorTest.java
index 199d0e14236..2814cc2ce23 100644
--- a/src/test/java/org/htmlunit/javascript/NativeErrorTest.java
+++ b/src/test/java/org/htmlunit/javascript/NativeErrorTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/javascript/NativeFunctionTest.java b/src/test/java/org/htmlunit/javascript/NativeFunctionTest.java
index 24613764643..71517898d58 100644
--- a/src/test/java/org/htmlunit/javascript/NativeFunctionTest.java
+++ b/src/test/java/org/htmlunit/javascript/NativeFunctionTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/NativeGlobalTest.java b/src/test/java/org/htmlunit/javascript/NativeGlobalTest.java
index 379bfa1eb50..3cfdc37dc49 100644
--- a/src/test/java/org/htmlunit/javascript/NativeGlobalTest.java
+++ b/src/test/java/org/htmlunit/javascript/NativeGlobalTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/NativeJSONTest.java b/src/test/java/org/htmlunit/javascript/NativeJSONTest.java
index a4cd91edf04..311b29f96fd 100644
--- a/src/test/java/org/htmlunit/javascript/NativeJSONTest.java
+++ b/src/test/java/org/htmlunit/javascript/NativeJSONTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/NativeMapTest.java b/src/test/java/org/htmlunit/javascript/NativeMapTest.java
index 041b2517656..cf571495b65 100644
--- a/src/test/java/org/htmlunit/javascript/NativeMapTest.java
+++ b/src/test/java/org/htmlunit/javascript/NativeMapTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/NativeNumberTest.java b/src/test/java/org/htmlunit/javascript/NativeNumberTest.java
index a45f86426e1..58e2c4b8e90 100644
--- a/src/test/java/org/htmlunit/javascript/NativeNumberTest.java
+++ b/src/test/java/org/htmlunit/javascript/NativeNumberTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/NativeObjectTest.java b/src/test/java/org/htmlunit/javascript/NativeObjectTest.java
index 314db3efd51..877f2766a12 100644
--- a/src/test/java/org/htmlunit/javascript/NativeObjectTest.java
+++ b/src/test/java/org/htmlunit/javascript/NativeObjectTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/NativeRegExpTest.java b/src/test/java/org/htmlunit/javascript/NativeRegExpTest.java
index 4c86b45507b..774d39ed184 100644
--- a/src/test/java/org/htmlunit/javascript/NativeRegExpTest.java
+++ b/src/test/java/org/htmlunit/javascript/NativeRegExpTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/NativeStringTest.java b/src/test/java/org/htmlunit/javascript/NativeStringTest.java
index 78e7d4caa48..94db5c3470a 100644
--- a/src/test/java/org/htmlunit/javascript/NativeStringTest.java
+++ b/src/test/java/org/htmlunit/javascript/NativeStringTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/NativeTypedArrayTest.java b/src/test/java/org/htmlunit/javascript/NativeTypedArrayTest.java
index 4e601057204..bd90ddcc354 100644
--- a/src/test/java/org/htmlunit/javascript/NativeTypedArrayTest.java
+++ b/src/test/java/org/htmlunit/javascript/NativeTypedArrayTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/PostponedActionTest.java b/src/test/java/org/htmlunit/javascript/PostponedActionTest.java
index 5310e522cdc..bf0a72519d3 100644
--- a/src/test/java/org/htmlunit/javascript/PostponedActionTest.java
+++ b/src/test/java/org/htmlunit/javascript/PostponedActionTest.java
@@ -19,7 +19,7 @@
import org.htmlunit.MockWebConnection;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/javascript/RhinoTest.java b/src/test/java/org/htmlunit/javascript/RhinoTest.java
index d734871bba1..27901e953d5 100644
--- a/src/test/java/org/htmlunit/javascript/RhinoTest.java
+++ b/src/test/java/org/htmlunit/javascript/RhinoTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/ScriptRuntimeTest.java b/src/test/java/org/htmlunit/javascript/ScriptRuntimeTest.java
index 10f7c5a2910..71d96c11451 100644
--- a/src/test/java/org/htmlunit/javascript/ScriptRuntimeTest.java
+++ b/src/test/java/org/htmlunit/javascript/ScriptRuntimeTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/ScriptableObjectTest.java b/src/test/java/org/htmlunit/javascript/ScriptableObjectTest.java
index 6ec3be85590..fc5f91a269a 100644
--- a/src/test/java/org/htmlunit/javascript/ScriptableObjectTest.java
+++ b/src/test/java/org/htmlunit/javascript/ScriptableObjectTest.java
@@ -16,9 +16,9 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/ActiveXObject2Test.java b/src/test/java/org/htmlunit/javascript/host/ActiveXObject2Test.java
index be7e0fc9b1b..157268a2c15 100644
--- a/src/test/java/org/htmlunit/javascript/host/ActiveXObject2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/ActiveXObject2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/ApplicationCacheTest.java b/src/test/java/org/htmlunit/javascript/host/ApplicationCacheTest.java
index 6c17b747987..ac5266cc892 100644
--- a/src/test/java/org/htmlunit/javascript/host/ApplicationCacheTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/ApplicationCacheTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/BoxObjectTest.java b/src/test/java/org/htmlunit/javascript/host/BoxObjectTest.java
index 6bd88f762fc..2ba15278349 100644
--- a/src/test/java/org/htmlunit/javascript/host/BoxObjectTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/BoxObjectTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/ClientRectListTest.java b/src/test/java/org/htmlunit/javascript/host/ClientRectListTest.java
index 988f2b2a7b6..c7cb84792bb 100644
--- a/src/test/java/org/htmlunit/javascript/host/ClientRectListTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/ClientRectListTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/ClientRectTest.java b/src/test/java/org/htmlunit/javascript/host/ClientRectTest.java
index 63bd453127b..521272ecef8 100644
--- a/src/test/java/org/htmlunit/javascript/host/ClientRectTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/ClientRectTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/Console2Test.java b/src/test/java/org/htmlunit/javascript/host/Console2Test.java
index 49c813b4b4e..efac15ad0f8 100644
--- a/src/test/java/org/htmlunit/javascript/host/Console2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/Console2Test.java
@@ -22,7 +22,7 @@
import org.htmlunit.WebConsole;
import org.htmlunit.WebConsole.Logger;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/ConsoleTest.java b/src/test/java/org/htmlunit/javascript/host/ConsoleTest.java
index 8cea25c91f3..3fff6ccee83 100644
--- a/src/test/java/org/htmlunit/javascript/host/ConsoleTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/ConsoleTest.java
@@ -18,8 +18,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/javascript/host/ElementTest.java b/src/test/java/org/htmlunit/javascript/host/ElementTest.java
index a572958b911..37fbbc39877 100644
--- a/src/test/java/org/htmlunit/javascript/host/ElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/ElementTest.java
@@ -18,8 +18,8 @@
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.javascript.host.xml.XMLDocumentTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/ExternalTest.java b/src/test/java/org/htmlunit/javascript/host/ExternalTest.java
index f553b3e9a90..52ea2cd5884 100644
--- a/src/test/java/org/htmlunit/javascript/host/ExternalTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/ExternalTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/FontFaceSetTest.java b/src/test/java/org/htmlunit/javascript/host/FontFaceSetTest.java
index 802a872f1e2..c516af48c97 100644
--- a/src/test/java/org/htmlunit/javascript/host/FontFaceSetTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/FontFaceSetTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/FontFaceTest.java b/src/test/java/org/htmlunit/javascript/host/FontFaceTest.java
index df4113755d4..ff01ccbce29 100644
--- a/src/test/java/org/htmlunit/javascript/host/FontFaceTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/FontFaceTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/History2Test.java b/src/test/java/org/htmlunit/javascript/host/History2Test.java
index 15a5535f08e..14d7b3fe6c9 100644
--- a/src/test/java/org/htmlunit/javascript/host/History2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/History2Test.java
@@ -22,8 +22,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.NameValuePair;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/InstallTriggerTest.java b/src/test/java/org/htmlunit/javascript/host/InstallTriggerTest.java
index 0376edec62c..e902ca76736 100644
--- a/src/test/java/org/htmlunit/javascript/host/InstallTriggerTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/InstallTriggerTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/Location2Test.java b/src/test/java/org/htmlunit/javascript/host/Location2Test.java
index 6a9c2faa23d..19c9a4f9765 100644
--- a/src/test/java/org/htmlunit/javascript/host/Location2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/Location2Test.java
@@ -23,9 +23,9 @@
import org.htmlunit.MockWebConnection;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/javascript/host/LocationTest.java b/src/test/java/org/htmlunit/javascript/host/LocationTest.java
index 7e3531c5d2a..3037d842a7e 100644
--- a/src/test/java/org/htmlunit/javascript/host/LocationTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/LocationTest.java
@@ -25,7 +25,7 @@
import org.htmlunit.html.HtmlAnchor;
import org.htmlunit.html.HtmlPage;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/MapTest.java b/src/test/java/org/htmlunit/javascript/host/MapTest.java
index 9d8a0303be2..b084733c06b 100644
--- a/src/test/java/org/htmlunit/javascript/host/MapTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/MapTest.java
@@ -19,7 +19,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/MessageChannelTest.java b/src/test/java/org/htmlunit/javascript/host/MessageChannelTest.java
index 9bfe01118ba..ae0a921a715 100644
--- a/src/test/java/org/htmlunit/javascript/host/MessageChannelTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/MessageChannelTest.java
@@ -19,7 +19,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/MimeTypeTest.java b/src/test/java/org/htmlunit/javascript/host/MimeTypeTest.java
index 49ff67777bd..a41184d3aab 100644
--- a/src/test/java/org/htmlunit/javascript/host/MimeTypeTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/MimeTypeTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/NamedNodeMapTest.java b/src/test/java/org/htmlunit/javascript/host/NamedNodeMapTest.java
index a04da015134..203400c263f 100644
--- a/src/test/java/org/htmlunit/javascript/host/NamedNodeMapTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/NamedNodeMapTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.javascript.host.xml.XMLDocumentTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/NamespaceTest.java b/src/test/java/org/htmlunit/javascript/host/NamespaceTest.java
index ca4f48dfb2d..7eac2df6440 100644
--- a/src/test/java/org/htmlunit/javascript/host/NamespaceTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/NamespaceTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/NavigatorTest.java b/src/test/java/org/htmlunit/javascript/host/NavigatorTest.java
index e32e450a94b..076ace7ca09 100644
--- a/src/test/java/org/htmlunit/javascript/host/NavigatorTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/NavigatorTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/NetscapeTest.java b/src/test/java/org/htmlunit/javascript/host/NetscapeTest.java
index 24dcbea4d7f..505b2830efe 100644
--- a/src/test/java/org/htmlunit/javascript/host/NetscapeTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/NetscapeTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/NotificationTest.java b/src/test/java/org/htmlunit/javascript/host/NotificationTest.java
index c46a978a92c..1ba683cf981 100644
--- a/src/test/java/org/htmlunit/javascript/host/NotificationTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/NotificationTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/PluginTest.java b/src/test/java/org/htmlunit/javascript/host/PluginTest.java
index 45651ca95fc..f544e021396 100644
--- a/src/test/java/org/htmlunit/javascript/host/PluginTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/PluginTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/Popup2Test.java b/src/test/java/org/htmlunit/javascript/host/Popup2Test.java
index 382d81a1955..ada9d4a8f97 100644
--- a/src/test/java/org/htmlunit/javascript/host/Popup2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/Popup2Test.java
@@ -18,7 +18,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/PopupTest.java b/src/test/java/org/htmlunit/javascript/host/PopupTest.java
index d9d23c7f95b..7705c90d21a 100644
--- a/src/test/java/org/htmlunit/javascript/host/PopupTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/PopupTest.java
@@ -23,7 +23,7 @@
import org.htmlunit.html.HtmlElement;
import org.htmlunit.html.HtmlPage;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/PromiseTest.java b/src/test/java/org/htmlunit/javascript/host/PromiseTest.java
index 18fe3ceaea2..8d6fe493b0e 100644
--- a/src/test/java/org/htmlunit/javascript/host/PromiseTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/PromiseTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.corejs.javascript.NativePromise;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/ReflectTest.java b/src/test/java/org/htmlunit/javascript/host/ReflectTest.java
index 9cd0a1d0569..20c63d4880f 100644
--- a/src/test/java/org/htmlunit/javascript/host/ReflectTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/ReflectTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/ScreenTest.java b/src/test/java/org/htmlunit/javascript/host/ScreenTest.java
index 1b54d39f243..110ae69672a 100644
--- a/src/test/java/org/htmlunit/javascript/host/ScreenTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/ScreenTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/SetTest.java b/src/test/java/org/htmlunit/javascript/host/SetTest.java
index d1d9ecaf095..63bb6b57c4d 100644
--- a/src/test/java/org/htmlunit/javascript/host/SetTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/SetTest.java
@@ -19,7 +19,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/StorageTest.java b/src/test/java/org/htmlunit/javascript/host/StorageTest.java
index aad2949a739..160672e5a20 100644
--- a/src/test/java/org/htmlunit/javascript/host/StorageTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/StorageTest.java
@@ -18,10 +18,10 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/javascript/host/SymbolTest.java b/src/test/java/org/htmlunit/javascript/host/SymbolTest.java
index 47a36f9cf14..5c20b592b52 100644
--- a/src/test/java/org/htmlunit/javascript/host/SymbolTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/SymbolTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/TextDecoderTest.java b/src/test/java/org/htmlunit/javascript/host/TextDecoderTest.java
index dbadf7f76c0..3bf22f762a0 100644
--- a/src/test/java/org/htmlunit/javascript/host/TextDecoderTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/TextDecoderTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/TextEncoderTest.java b/src/test/java/org/htmlunit/javascript/host/TextEncoderTest.java
index 41fb23c82b2..d65c4b5291a 100644
--- a/src/test/java/org/htmlunit/javascript/host/TextEncoderTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/TextEncoderTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/URLSearchParamsTest.java b/src/test/java/org/htmlunit/javascript/host/URLSearchParamsTest.java
index de0304b8ae8..0825f00284c 100644
--- a/src/test/java/org/htmlunit/javascript/host/URLSearchParamsTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/URLSearchParamsTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/URLTest.java b/src/test/java/org/htmlunit/javascript/host/URLTest.java
index 69f627674b0..2d8b7195bf7 100644
--- a/src/test/java/org/htmlunit/javascript/host/URLTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/URLTest.java
@@ -22,8 +22,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/WeakMapTest.java b/src/test/java/org/htmlunit/javascript/host/WeakMapTest.java
index a60584dc3c2..e374bd47d14 100644
--- a/src/test/java/org/htmlunit/javascript/host/WeakMapTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/WeakMapTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/WeakSetTest.java b/src/test/java/org/htmlunit/javascript/host/WeakSetTest.java
index 9ced340dfde..b90b9d83eef 100644
--- a/src/test/java/org/htmlunit/javascript/host/WeakSetTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/WeakSetTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/WebSocketTest.java b/src/test/java/org/htmlunit/javascript/host/WebSocketTest.java
index 6e06f4e1b9b..641311e6d9d 100644
--- a/src/test/java/org/htmlunit/javascript/host/WebSocketTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/WebSocketTest.java
@@ -15,8 +15,8 @@
package org.htmlunit.javascript.host;
import static java.nio.charset.StandardCharsets.UTF_16LE;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF_ESR;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF_ESR;
import java.io.IOException;
import java.nio.ByteBuffer;
@@ -33,9 +33,9 @@
import org.htmlunit.HttpHeader;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/Window2Test.java b/src/test/java/org/htmlunit/javascript/host/Window2Test.java
index a1855b32dd0..76fa974f05a 100644
--- a/src/test/java/org/htmlunit/javascript/host/Window2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/Window2Test.java
@@ -14,8 +14,8 @@
*/
package org.htmlunit.javascript.host;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF_ESR;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF_ESR;
import java.io.ByteArrayOutputStream;
import java.io.File;
@@ -28,9 +28,9 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/Window3Test.java b/src/test/java/org/htmlunit/javascript/host/Window3Test.java
index 359b4647036..5151c2eb5bd 100644
--- a/src/test/java/org/htmlunit/javascript/host/Window3Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/Window3Test.java
@@ -29,8 +29,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/WindowConcurrency2Test.java b/src/test/java/org/htmlunit/javascript/host/WindowConcurrency2Test.java
index 8a86b1b411f..a747bd630e9 100644
--- a/src/test/java/org/htmlunit/javascript/host/WindowConcurrency2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/WindowConcurrency2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/WindowPostMessageTest.java b/src/test/java/org/htmlunit/javascript/host/WindowPostMessageTest.java
index fe44421c607..fa4b4e19b16 100644
--- a/src/test/java/org/htmlunit/javascript/host/WindowPostMessageTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/WindowPostMessageTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/WindowTest.java b/src/test/java/org/htmlunit/javascript/host/WindowTest.java
index 8c3e51b2e32..e84211fbbfc 100644
--- a/src/test/java/org/htmlunit/javascript/host/WindowTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/WindowTest.java
@@ -47,8 +47,8 @@
import org.htmlunit.html.HtmlInput;
import org.htmlunit.html.HtmlPage;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/arrays/ArrayBufferTest.java b/src/test/java/org/htmlunit/javascript/host/arrays/ArrayBufferTest.java
index 5b420607031..25bdeac53c6 100644
--- a/src/test/java/org/htmlunit/javascript/host/arrays/ArrayBufferTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/arrays/ArrayBufferTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/arrays/ArrayBufferViewTest.java b/src/test/java/org/htmlunit/javascript/host/arrays/ArrayBufferViewTest.java
index ed5570bb95c..b27ad1f2101 100644
--- a/src/test/java/org/htmlunit/javascript/host/arrays/ArrayBufferViewTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/arrays/ArrayBufferViewTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/arrays/DataViewTest.java b/src/test/java/org/htmlunit/javascript/host/arrays/DataViewTest.java
index bd274f424cb..47228fe6dc8 100644
--- a/src/test/java/org/htmlunit/javascript/host/arrays/DataViewTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/arrays/DataViewTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/arrays/Float32ArrayTest.java b/src/test/java/org/htmlunit/javascript/host/arrays/Float32ArrayTest.java
index 642c1393151..4f0a32cf628 100644
--- a/src/test/java/org/htmlunit/javascript/host/arrays/Float32ArrayTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/arrays/Float32ArrayTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/arrays/Float64ArrayTest.java b/src/test/java/org/htmlunit/javascript/host/arrays/Float64ArrayTest.java
index aaf7ddc1d91..002a6bc4185 100644
--- a/src/test/java/org/htmlunit/javascript/host/arrays/Float64ArrayTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/arrays/Float64ArrayTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/arrays/Int16ArrayTest.java b/src/test/java/org/htmlunit/javascript/host/arrays/Int16ArrayTest.java
index 6cec806d9ea..1bf3ad61881 100644
--- a/src/test/java/org/htmlunit/javascript/host/arrays/Int16ArrayTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/arrays/Int16ArrayTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/arrays/Int32ArrayTest.java b/src/test/java/org/htmlunit/javascript/host/arrays/Int32ArrayTest.java
index 224367e10cf..7789db9530e 100644
--- a/src/test/java/org/htmlunit/javascript/host/arrays/Int32ArrayTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/arrays/Int32ArrayTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/arrays/Int8ArrayTest.java b/src/test/java/org/htmlunit/javascript/host/arrays/Int8ArrayTest.java
index 44b97c02a39..ddd93d5eabb 100644
--- a/src/test/java/org/htmlunit/javascript/host/arrays/Int8ArrayTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/arrays/Int8ArrayTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/arrays/SharedArrayBufferTest.java b/src/test/java/org/htmlunit/javascript/host/arrays/SharedArrayBufferTest.java
index 7255f25981e..a2cb5256b63 100644
--- a/src/test/java/org/htmlunit/javascript/host/arrays/SharedArrayBufferTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/arrays/SharedArrayBufferTest.java
@@ -14,13 +14,13 @@
*/
package org.htmlunit.javascript.host.arrays;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.CHROME;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.EDGE;
+import static org.htmlunit.junit.annotation.TestedBrowser.CHROME;
+import static org.htmlunit.junit.annotation.TestedBrowser.EDGE;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/arrays/Uint16ArrayTest.java b/src/test/java/org/htmlunit/javascript/host/arrays/Uint16ArrayTest.java
index 7fd4af09419..9237a635b26 100644
--- a/src/test/java/org/htmlunit/javascript/host/arrays/Uint16ArrayTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/arrays/Uint16ArrayTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/arrays/Uint32ArrayTest.java b/src/test/java/org/htmlunit/javascript/host/arrays/Uint32ArrayTest.java
index 9566a4443fa..e60ff09e4ce 100644
--- a/src/test/java/org/htmlunit/javascript/host/arrays/Uint32ArrayTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/arrays/Uint32ArrayTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/arrays/Uint8ArrayTest.java b/src/test/java/org/htmlunit/javascript/host/arrays/Uint8ArrayTest.java
index 1ad98eb2f25..57f85f55eaa 100644
--- a/src/test/java/org/htmlunit/javascript/host/arrays/Uint8ArrayTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/arrays/Uint8ArrayTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/arrays/Uint8ClampedArrayTest.java b/src/test/java/org/htmlunit/javascript/host/arrays/Uint8ClampedArrayTest.java
index 64696202015..5dc1cc20a57 100644
--- a/src/test/java/org/htmlunit/javascript/host/arrays/Uint8ClampedArrayTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/arrays/Uint8ClampedArrayTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/canvas/CanvasGradientTest.java b/src/test/java/org/htmlunit/javascript/host/canvas/CanvasGradientTest.java
index 3c399bb7c8d..d14a34e17b7 100644
--- a/src/test/java/org/htmlunit/javascript/host/canvas/CanvasGradientTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/canvas/CanvasGradientTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/canvas/CanvasRenderingContext2DTest.java b/src/test/java/org/htmlunit/javascript/host/canvas/CanvasRenderingContext2DTest.java
index 9ba8dd9644e..2cbd7789c50 100644
--- a/src/test/java/org/htmlunit/javascript/host/canvas/CanvasRenderingContext2DTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/canvas/CanvasRenderingContext2DTest.java
@@ -14,8 +14,8 @@
*/
package org.htmlunit.javascript.host.canvas;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.CHROME;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.EDGE;
+import static org.htmlunit.junit.annotation.TestedBrowser.CHROME;
+import static org.htmlunit.junit.annotation.TestedBrowser.EDGE;
import java.io.InputStream;
import java.util.Collections;
@@ -23,9 +23,9 @@
import org.apache.commons.io.IOUtils;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -834,12 +834,12 @@ private void draw(final String canvasSetup, final String drawJS) throws Exceptio
*/
@Test
@Alerts(DEFAULT = "data:image/png;base64,"
- + "iVBORw0KGgoAAAANSUhEUgAAACoAAAAqCAYAAADFw8lbAAAAAXNSR0IArs4c6QAAAVpJREFUWEft1L1KHVEUxfHffQTJC4iN"
- + "dgFbrQSNBNLEwuKa2qCVYCepQjpBSBGwlVhoYSlYWNqm1s4XSG2rW+bCOOj9gK02e6qZc2avs/b/rHN6nj6z+IyD1nC/eT/G"
- + "Mv7hf6eu+/kBW9jHd5zjpvkp5n5h7wWddm34uYva3gRGz7CLP69stG1pZ9DkJEZD4C8OcYpVrDSq2/iBT1jE9ZhEQ+ML1hud"
- + "du0VLnGB/nNGT/CxQ3oDbaJz+IboeL4xGRGJ8aWG+jhbH0Zn8BMLw2onIdo1Oo3I7WCBWGyQ8aMJiN4+ZD/oDa19C6NfW9Ri"
- + "o9qNxS68itG4DYLkb0yNSTTMRd1mE6fHzDUHcpTROLxrkeEu0RG3zvtNl9Fs9kW0iGYTyNarjBbRbALZepXRIppNIFuvMlpE"
- + "swlk61VGi2g2gWy9ymgRzSaQrVcZLaLZBLL1KqNFNJtAtt49X4NjZWyu/AkAAAAASUVORK5CYII=",
+ + "iVBORw0KGgoAAAANSUhEUgAAACoAAAAqCAYAAADFw8lbAAAAAXNSR0IArs4c6QAAAVlJREFUWEftlK1OA0EUhb9a3qCGBIvA"
+ + "gKgqQdQBCsFPQusJCkENlh9N6+tIsOAJaLA8AIYH4AXYQ+4mw4Syu8lta+4mm+zO7D1z5rtntsXvax0YAKfJ8Lk93wCHwBPw"
+ + "mdXlr23gGjgBroAJ8GYfae4OOJiik9ZuAF+qbTUwOgZ0D2dsNLV0W26yiVEJiNKzGT4Ceqa6D4yAZWAXeK1J9Ni6tGY6ae0j"
+ + "cA98AJ2/jL4ASxlpUUyJqiVnhaHtwviWmewAGt8z6nVaL6OrQL9o785/tU2I5ka1gHJbLqDFyoxfNiD6XtQ9VNXOw6gOVElN"
+ + "jUo3poM6E6PKzQpwAeh01iEqc6rbtDj9ZM4OZJVRdVFR6uZEK/46i5sOo97sg2gQ9SbgrRcZDaLeBLz1IqNB1JuAt15kNIh6"
+ + "E/DWi4wGUW8C3nqR0SDqTcBbLzIaRL0JeOtFRoOoNwFvvW9NqWN35u+ZcQAAAABJRU5ErkJggg==",
FF = "data:image/png;base64,"
+ "iVBORw0KGgoAAAANSUhEUgAAACoAAAAqCAYAAADFw8lbAAABPUlEQVRYR+2UMW7CUBBE7WOEMs4doKUxNwhNCiQacoGUKVKG"
+ "C8ABUiQ3QEKi4BpA6WuQWWmNNl82YDESKcbS6n9j7zD/7ch59vcqcfuBGoSfP33/hvUbNU562m5neDD09y/pNmnE/izvYHTd"
@@ -1974,11 +1974,11 @@ public void clipWindingEvenOdd() throws Exception {
*/
@Test
@Alerts(DEFAULT = "data:image/png;base64,"
- + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAO5JREFUOE/t1K9KREEUx/HP1C2CCIIg"
- + "GxbBJhiFxSb6Dgb/sAbBIBpkLSLYfIbV4isYhX0Cg8lkMG/VYLg66ywOV1gvF+P9lQPDme/85pwzE3CB9a8YNUyxdghpZ4RG"
- + "TWIDrF6BrIY7i9yMsIEVbBPuclTx3bwzbKb1/cAgzykDP3CMFq5wToiHjJWAB+ihjSOcBt4mOWXgw4+rIoLvCc8lYCe6KpiL"
- + "MFxOA1Zx+CcwDfbWDIfvrHZYmGd3wO1rXp8e7WVmT3hconXN2h7DEdHIWPHKGbD7Qv+pek9/Z06pYT1s8/Sa36bG5Pz72HwC"
- + "6OxElc5l3LEAAAAASUVORK5CYII=",
+ + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAOpJREFUOE/t1KFOA0EQxvHfiiIIqAYB"
+ + "ElECJAheAEMdBIFCUF4A0YSkbYLBkdaSoHF9AzyiEoHlBUg9CnP0kr2wOZJyuSBvzJfszvwz++3sBtzhaKF5vEStLSFW5tA8"
+ + "Cm2A1R1IPBx0GK+ii1xHhHGKyjiNPh/G9WFgkuaUgVs4wTqmuCB8FAUR2MfZYn8Ht+gFPoucMvDtp6vsAU+E1xJwN+8qYxP3"
+ + "uF4GrNLhn8A42JdtblbY26bVYjhl8p76M6Czz8YVswPWHjk+53nOV3rkBNid05tVv9PfmUs8rIdtnl7z29SYnH8fm2/FgECV"
+ + "q9xRJAAAAABJRU5ErkJggg==",
FF = "data:image/png;base64,"
+ "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAA40lEQVQ4T2NkYGBoAGJ7IGYE4gNATBEAGQIC9VADQYZTBEa2"
+ "gZNNGRhyvgIDMAwaiJnAeJqBHKD/GRiygPwEIAaqBYMeYJiVIqtBCkOwgUZAQ6QgCv4D9TPC5CEiUAOBgmZAtgpQ6DCQLYnP"
diff --git a/src/test/java/org/htmlunit/javascript/host/canvas/ImageDataTest.java b/src/test/java/org/htmlunit/javascript/host/canvas/ImageDataTest.java
index f4e76f6394b..5eff0110aef 100644
--- a/src/test/java/org/htmlunit/javascript/host/canvas/ImageDataTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/canvas/ImageDataTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/canvas/IntersectionObserverTest.java b/src/test/java/org/htmlunit/javascript/host/canvas/IntersectionObserverTest.java
index 56cc12ab57b..66cb62ffd84 100644
--- a/src/test/java/org/htmlunit/javascript/host/canvas/IntersectionObserverTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/canvas/IntersectionObserverTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/crypto/CryptoTest.java b/src/test/java/org/htmlunit/javascript/host/crypto/CryptoTest.java
index 7b3658018c7..8e91ca1f983 100644
--- a/src/test/java/org/htmlunit/javascript/host/crypto/CryptoTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/crypto/CryptoTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/javascript/host/crypto/SubtleCryptoTest.java b/src/test/java/org/htmlunit/javascript/host/crypto/SubtleCryptoTest.java
index b22ba62c8d6..1a5c71e0b02 100644
--- a/src/test/java/org/htmlunit/javascript/host/crypto/SubtleCryptoTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/crypto/SubtleCryptoTest.java
@@ -16,9 +16,9 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/css/CSSCharsetRuleTest.java b/src/test/java/org/htmlunit/javascript/host/css/CSSCharsetRuleTest.java
index 24a22dd7375..0e3647a20d0 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/CSSCharsetRuleTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/CSSCharsetRuleTest.java
@@ -19,7 +19,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.cssparser.dom.CSSCharsetRuleImpl;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/css/CSSFontFaceRuleTest.java b/src/test/java/org/htmlunit/javascript/host/css/CSSFontFaceRuleTest.java
index 8d723a2f594..4688b0e17f0 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/CSSFontFaceRuleTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/CSSFontFaceRuleTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/css/CSSImportRuleTest.java b/src/test/java/org/htmlunit/javascript/host/css/CSSImportRuleTest.java
index f973def88cd..5e6e79d6e8a 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/CSSImportRuleTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/CSSImportRuleTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/css/CSSKeyframesRuleTest.java b/src/test/java/org/htmlunit/javascript/host/css/CSSKeyframesRuleTest.java
index 42f97e03b5b..fdefbadb3ef 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/CSSKeyframesRuleTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/CSSKeyframesRuleTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/css/CSSMediaRuleTest.java b/src/test/java/org/htmlunit/javascript/host/css/CSSMediaRuleTest.java
index 5156990b1c1..98334f4d9b8 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/CSSMediaRuleTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/CSSMediaRuleTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/css/CSSPageRuleTest.java b/src/test/java/org/htmlunit/javascript/host/css/CSSPageRuleTest.java
index ef45ee309c0..31603f78a74 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/CSSPageRuleTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/CSSPageRuleTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/css/CSSRuleListTest.java b/src/test/java/org/htmlunit/javascript/host/css/CSSRuleListTest.java
index 003ba14cec0..e80b9362eee 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/CSSRuleListTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/CSSRuleListTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/css/CSSSelector2Test.java b/src/test/java/org/htmlunit/javascript/host/css/CSSSelector2Test.java
index 255ee69420a..e8645b3ccee 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/CSSSelector2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/CSSSelector2Test.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/css/CSSSelectorTest.java b/src/test/java/org/htmlunit/javascript/host/css/CSSSelectorTest.java
index 9b313656ef4..b17ee276469 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/CSSSelectorTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/CSSSelectorTest.java
@@ -19,8 +19,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.UrlUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/css/CSSStyleDeclaration2Test.java b/src/test/java/org/htmlunit/javascript/host/css/CSSStyleDeclaration2Test.java
index 357b051d73d..2a14a9e6b9c 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/CSSStyleDeclaration2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/CSSStyleDeclaration2Test.java
@@ -18,7 +18,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
@@ -157,7 +158,7 @@ public void width_like_properties_heightWidth() throws Exception {
"success",
"success",
"wordSpacing 42% - 42em"},
- FF = {"success", "letterSpacing 42% - 42em",
+ FF = {"success", "success",
"outlineWidth 42.0 - ; 42.7 - ; 42 - ; 42% - 42em",
"success",
"success",
@@ -167,6 +168,11 @@ public void width_like_properties_heightWidth() throws Exception {
"success",
"success",
"success"})
+ @HtmlUnitNYI(FF = {"success", "letterSpacing 42% - 42em",
+ "outlineWidth 42.0 - ; 42.7 - ; 42 - ; 42% - 42em",
+ "success",
+ "success",
+ "success"})
public void width_like_properties_font() throws Exception {
width_like_properties("fontSize", "letterSpacing", "outlineWidth", "textIndent",
"verticalAlign", "wordSpacing");
diff --git a/src/test/java/org/htmlunit/javascript/host/css/CSSStyleDeclaration3Test.java b/src/test/java/org/htmlunit/javascript/host/css/CSSStyleDeclaration3Test.java
index 42393bafa9e..b91546a86e7 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/CSSStyleDeclaration3Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/CSSStyleDeclaration3Test.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/css/CSSStyleDeclarationTest.java b/src/test/java/org/htmlunit/javascript/host/css/CSSStyleDeclarationTest.java
index 04717ec83c4..10fa291a1f2 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/CSSStyleDeclarationTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/CSSStyleDeclarationTest.java
@@ -32,9 +32,9 @@
import org.htmlunit.javascript.configuration.ClassConfiguration;
import org.htmlunit.javascript.configuration.ClassConfiguration.PropertyInfo;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
@@ -2699,8 +2699,12 @@ public void setWordSpacing() throws Exception {
* @throws Exception if an error occurs
*/
@Test
- @Alerts({"4px", "5px", "6em", "17px", "17px", "initial", "inherit",
- "17px", "17px", "17px", "", "17px", "", "17px", "17px", "17px"})
+ @Alerts(DEFAULT = {"4px", "5px", "6em", "17px", "17px", "initial", "inherit",
+ "17px", "17px", "17px", "", "17px", "", "17px", "17px", "17px"},
+ FF = {"4px", "5px", "6em", "17px", "7%", "initial", "inherit",
+ "17px", "17px", "17px", "", "17px", "", "17px", "17px", "17px"})
+ @HtmlUnitNYI(FF = {"4px", "5px", "6em", "17px", "17px", "initial", "inherit",
+ "17px", "17px", "17px", "", "17px", "", "17px", "17px", "17px"})
public void setLetterSpacingProperty() throws Exception {
setLengthProperty("letter-spacing", "letterSpacing");
}
@@ -2709,8 +2713,12 @@ public void setLetterSpacingProperty() throws Exception {
* @throws Exception if an error occurs
*/
@Test
- @Alerts({"4px", "5px", "6em", "17px", "17px", "initial", "inherit",
- "17px", "17px", "17px", "", "17px", "", "17px", "17px", "17px"})
+ @Alerts(DEFAULT = {"4px", "5px", "6em", "17px", "17px", "initial", "inherit",
+ "17px", "17px", "17px", "", "17px", "", "17px", "17px", "17px"},
+ FF = {"4px", "5px", "6em", "17px", "70%", "initial", "inherit",
+ "17px", "17px", "17px", "", "17px", "", "17px", "17px", "17px"})
+ @HtmlUnitNYI(FF = {"4px", "5px", "6em", "17px", "17px", "initial", "inherit",
+ "17px", "17px", "17px", "", "17px", "", "17px", "17px", "17px"})
public void setLetterSpacing() throws Exception {
setLength("letter-spacing", "letterSpacing");
}
diff --git a/src/test/java/org/htmlunit/javascript/host/css/CSSStyleRuleTest.java b/src/test/java/org/htmlunit/javascript/host/css/CSSStyleRuleTest.java
index ebf2d286f26..d928cabf2af 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/CSSStyleRuleTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/CSSStyleRuleTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/css/CSSStyleSheet2Test.java b/src/test/java/org/htmlunit/javascript/host/css/CSSStyleSheet2Test.java
index 0f24116ea27..77c69d3af09 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/CSSStyleSheet2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/CSSStyleSheet2Test.java
@@ -34,7 +34,7 @@
import org.htmlunit.html.HtmlStyle;
import org.htmlunit.javascript.host.html.HTMLStyleElement;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.w3c.dom.NodeList;
diff --git a/src/test/java/org/htmlunit/javascript/host/css/CSSStyleSheetTest.java b/src/test/java/org/htmlunit/javascript/host/css/CSSStyleSheetTest.java
index abd39ea7de6..b8cade4df11 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/CSSStyleSheetTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/CSSStyleSheetTest.java
@@ -24,7 +24,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/javascript/host/css/CSSTest.java b/src/test/java/org/htmlunit/javascript/host/css/CSSTest.java
index 21ab5d14a2b..52e3be49f2c 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/CSSTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/CSSTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/css/ComputedCSSStyleDeclarationTest.java b/src/test/java/org/htmlunit/javascript/host/css/ComputedCSSStyleDeclarationTest.java
index 987218961a5..331c303992c 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/ComputedCSSStyleDeclarationTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/ComputedCSSStyleDeclarationTest.java
@@ -14,8 +14,8 @@
*/
package org.htmlunit.javascript.host.css;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF_ESR;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF_ESR;
import java.io.InputStream;
import java.net.URL;
@@ -25,9 +25,9 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
@@ -132,7 +132,7 @@ public void stringProperties() throws Exception {
final WebDriver driver = loadPage2(html);
final String expected = loadExpectation("ComputedCSSStyleDeclarationTest.properties", ".txt");
- final String actual = driver.findElement(By.id("myTextarea")).getAttribute("value");
+ final String actual = driver.findElement(By.id("myTextarea")).getDomProperty("value");
assertEquals(expected, actual);
}
diff --git a/src/test/java/org/htmlunit/javascript/host/css/ComputedFontTest.java b/src/test/java/org/htmlunit/javascript/host/css/ComputedFontTest.java
index 992f44b4940..183f49ec20d 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/ComputedFontTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/ComputedFontTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/css/MediaQueryListTest.java b/src/test/java/org/htmlunit/javascript/host/css/MediaQueryListTest.java
index 6051f35cb8f..45e2a2488a3 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/MediaQueryListTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/MediaQueryListTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/css/StyleMediaTest.java b/src/test/java/org/htmlunit/javascript/host/css/StyleMediaTest.java
index 2ba6cc383d5..e84c98b122f 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/StyleMediaTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/StyleMediaTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/css/StyleSheetListTest.java b/src/test/java/org/htmlunit/javascript/host/css/StyleSheetListTest.java
index f9f08cd66e1..4ac52bd5913 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/StyleSheetListTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/StyleSheetListTest.java
@@ -20,8 +20,8 @@
import org.htmlunit.HttpHeader;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/javascript/host/css/property/ElementClientHeightTest.java b/src/test/java/org/htmlunit/javascript/host/css/property/ElementClientHeightTest.java
index 1706e4ead9c..b951ca673f2 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/property/ElementClientHeightTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/property/ElementClientHeightTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -1195,9 +1195,7 @@ public void nolayer() throws Exception {
@Test
@Alerts("0")
@HtmlUnitNYI(CHROME = "18",
- EDGE = "18",
- FF = "0",
- FF_ESR = "0")
+ EDGE = "18")
public void noscript() throws Exception {
loadPageVerifyTitle2(test("noscript"));
}
diff --git a/src/test/java/org/htmlunit/javascript/host/css/property/ElementClientWidthTest.java b/src/test/java/org/htmlunit/javascript/host/css/property/ElementClientWidthTest.java
index 8a0843ee825..80ad6ba93a0 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/property/ElementClientWidthTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/property/ElementClientWidthTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/css/property/ElementOffsetHeightTest.java b/src/test/java/org/htmlunit/javascript/host/css/property/ElementOffsetHeightTest.java
index d1d83f710d3..779cead9170 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/property/ElementOffsetHeightTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/property/ElementOffsetHeightTest.java
@@ -16,9 +16,9 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/css/property/ElementOffsetWidthTest.java b/src/test/java/org/htmlunit/javascript/host/css/property/ElementOffsetWidthTest.java
index 22d373c6f3b..90ec476657b 100644
--- a/src/test/java/org/htmlunit/javascript/host/css/property/ElementOffsetWidthTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/css/property/ElementOffsetWidthTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/AbstractRangeTest.java b/src/test/java/org/htmlunit/javascript/host/dom/AbstractRangeTest.java
index 49433a6ea78..264a996e53b 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/AbstractRangeTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/AbstractRangeTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/AttrTest.java b/src/test/java/org/htmlunit/javascript/host/dom/AttrTest.java
index 69ff5e8e3bf..5e20636513a 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/AttrTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/AttrTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/CDATASectionTest.java b/src/test/java/org/htmlunit/javascript/host/dom/CDATASectionTest.java
index c4ce4bb0c0b..45d66d98fe5 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/CDATASectionTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/CDATASectionTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/CharacterDataTest.java b/src/test/java/org/htmlunit/javascript/host/dom/CharacterDataTest.java
index b9d77112353..b7a25a07af9 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/CharacterDataTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/CharacterDataTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/CommentTest.java b/src/test/java/org/htmlunit/javascript/host/dom/CommentTest.java
index 1e0abb2b5bf..f57ece94b3a 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/CommentTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/CommentTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/DOMExceptionTest.java b/src/test/java/org/htmlunit/javascript/host/dom/DOMExceptionTest.java
index 73456a410b0..bcf31699401 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/DOMExceptionTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/DOMExceptionTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/DOMImplementationTest.java b/src/test/java/org/htmlunit/javascript/host/dom/DOMImplementationTest.java
index f289426ec65..460da7c3f9c 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/DOMImplementationTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/DOMImplementationTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/DOMMatrixTest.java b/src/test/java/org/htmlunit/javascript/host/dom/DOMMatrixTest.java
index 3b5545ddc49..ea40f25f527 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/DOMMatrixTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/DOMMatrixTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/DOMParserTest.java b/src/test/java/org/htmlunit/javascript/host/dom/DOMParserTest.java
index dda9b8311e8..d1ec6ef44a3 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/DOMParserTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/DOMParserTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/DOMStringMapTest.java b/src/test/java/org/htmlunit/javascript/host/dom/DOMStringMapTest.java
index 304b161ef20..fe695aa2eb2 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/DOMStringMapTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/DOMStringMapTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/DOMTokenListTest.java b/src/test/java/org/htmlunit/javascript/host/dom/DOMTokenListTest.java
index 2218302771a..0f32a0bd772 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/DOMTokenListTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/DOMTokenListTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/Document2Test.java b/src/test/java/org/htmlunit/javascript/host/dom/Document2Test.java
index 5e72ac847bb..68b291c8b8c 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/Document2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/Document2Test.java
@@ -14,16 +14,16 @@
*/
package org.htmlunit.javascript.host.dom;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF_ESR;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF_ESR;
import java.net.URL;
import org.htmlunit.MockWebConnection;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/DocumentFragmentTest.java b/src/test/java/org/htmlunit/javascript/host/dom/DocumentFragmentTest.java
index e7e5c66c5c1..bfd61b471d4 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/DocumentFragmentTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/DocumentFragmentTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/DocumentTest.java b/src/test/java/org/htmlunit/javascript/host/dom/DocumentTest.java
index 1aec3dd15e7..22885157644 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/DocumentTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/DocumentTest.java
@@ -22,10 +22,10 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
-import org.htmlunit.junit.Retry;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
+import org.htmlunit.junit.annotation.Retry;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/DocumentTypeTest.java b/src/test/java/org/htmlunit/javascript/host/dom/DocumentTypeTest.java
index 7fa0848c010..a58fe43058a 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/DocumentTypeTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/DocumentTypeTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/EventNodeTest.java b/src/test/java/org/htmlunit/javascript/host/dom/EventNodeTest.java
index 288872b889d..e1efa8e45f6 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/EventNodeTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/EventNodeTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/MutationObserverTest.java b/src/test/java/org/htmlunit/javascript/host/dom/MutationObserverTest.java
index c8dfe307e50..0a928f41695 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/MutationObserverTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/MutationObserverTest.java
@@ -19,8 +19,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/NodeFilterTest.java b/src/test/java/org/htmlunit/javascript/host/dom/NodeFilterTest.java
index 532dfaf46a4..f0eb344e772 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/NodeFilterTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/NodeFilterTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/NodeIteratorTest.java b/src/test/java/org/htmlunit/javascript/host/dom/NodeIteratorTest.java
index 2b42851457c..6b6b12fabe5 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/NodeIteratorTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/NodeIteratorTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/NodeListTest.java b/src/test/java/org/htmlunit/javascript/host/dom/NodeListTest.java
index cce6be53e1c..3e860df389d 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/NodeListTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/NodeListTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/NodeTest.java b/src/test/java/org/htmlunit/javascript/host/dom/NodeTest.java
index d015daacca7..db3918a5dc6 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/NodeTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/NodeTest.java
@@ -23,8 +23,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/RadioNodeListTest.java b/src/test/java/org/htmlunit/javascript/host/dom/RadioNodeListTest.java
index 36c8b495c86..6865610b6d3 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/RadioNodeListTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/RadioNodeListTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/RangeTest.java b/src/test/java/org/htmlunit/javascript/host/dom/RangeTest.java
index 828d2179e60..01959478c80 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/RangeTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/RangeTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/Selection2Test.java b/src/test/java/org/htmlunit/javascript/host/dom/Selection2Test.java
index 7b3edaa7c42..812903a96b8 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/Selection2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/Selection2Test.java
@@ -14,8 +14,8 @@
*/
package org.htmlunit.javascript.host.dom;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.CHROME;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.EDGE;
+import static org.htmlunit.junit.annotation.TestedBrowser.CHROME;
+import static org.htmlunit.junit.annotation.TestedBrowser.EDGE;
import java.util.ArrayList;
import java.util.List;
@@ -30,8 +30,8 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.impl.SimpleRange;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/SelectionTest.java b/src/test/java/org/htmlunit/javascript/host/dom/SelectionTest.java
index 3dabf45423e..12f94604927 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/SelectionTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/SelectionTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/TextRangeTest.java b/src/test/java/org/htmlunit/javascript/host/dom/TextRangeTest.java
index 034cd2a03cd..5bb8c20e3e5 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/TextRangeTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/TextRangeTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/TextTest.java b/src/test/java/org/htmlunit/javascript/host/dom/TextTest.java
index da30d01e13a..517dafcc261 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/TextTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/TextTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/TreeWalkerTest.java b/src/test/java/org/htmlunit/javascript/host/dom/TreeWalkerTest.java
index 4b93b730259..c8f9704eb98 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/TreeWalkerTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/TreeWalkerTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/XPathEvaluatorTest.java b/src/test/java/org/htmlunit/javascript/host/dom/XPathEvaluatorTest.java
index c47b2ee0f5a..d3673c0544b 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/XPathEvaluatorTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/XPathEvaluatorTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/XPathExpressionTest.java b/src/test/java/org/htmlunit/javascript/host/dom/XPathExpressionTest.java
index 6ac6007c9c5..099531d64dd 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/XPathExpressionTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/XPathExpressionTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/XPathResultTest.java b/src/test/java/org/htmlunit/javascript/host/dom/XPathResultTest.java
index 17eaf301a69..aee54932aec 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/XPathResultTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/XPathResultTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/draganddrop/DataTransferItemListTest.java b/src/test/java/org/htmlunit/javascript/host/draganddrop/DataTransferItemListTest.java
index 50a4bd50111..ab16c904f21 100644
--- a/src/test/java/org/htmlunit/javascript/host/draganddrop/DataTransferItemListTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/draganddrop/DataTransferItemListTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/draganddrop/DataTransferItemTest.java b/src/test/java/org/htmlunit/javascript/host/draganddrop/DataTransferItemTest.java
index 4b98307198e..3033f3fca50 100644
--- a/src/test/java/org/htmlunit/javascript/host/draganddrop/DataTransferItemTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/draganddrop/DataTransferItemTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/draganddrop/DataTransferTest.java b/src/test/java/org/htmlunit/javascript/host/draganddrop/DataTransferTest.java
index 393b14571f0..af3803ebf50 100644
--- a/src/test/java/org/htmlunit/javascript/host/draganddrop/DataTransferTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/draganddrop/DataTransferTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/AnimationEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/AnimationEventTest.java
index f3e9379b32c..17b4a8d5639 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/AnimationEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/AnimationEventTest.java
@@ -18,8 +18,8 @@
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.javascript.host.animations.AnimationEvent;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/AudioProcessingEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/AudioProcessingEventTest.java
index b29349181f2..14f7b46066d 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/AudioProcessingEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/AudioProcessingEventTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/BeforeInstallPromptEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/BeforeInstallPromptEventTest.java
index 7debe2e0218..83f197f04a1 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/BeforeInstallPromptEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/BeforeInstallPromptEventTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/BeforeUnloadEvent2Test.java b/src/test/java/org/htmlunit/javascript/host/event/BeforeUnloadEvent2Test.java
index 2fc9e195d25..6c6f62af499 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/BeforeUnloadEvent2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/BeforeUnloadEvent2Test.java
@@ -20,7 +20,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/BeforeUnloadEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/BeforeUnloadEventTest.java
index 12fe58a27ed..055bf70d977 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/BeforeUnloadEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/BeforeUnloadEventTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/BlobEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/BlobEventTest.java
index e2e3234a9f9..4063ba3a547 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/BlobEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/BlobEventTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/CloseEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/CloseEventTest.java
index cbc6f019b4d..0373fc0b07e 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/CloseEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/CloseEventTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/CompositionEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/CompositionEventTest.java
index c4798423b52..b0c243f0f6d 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/CompositionEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/CompositionEventTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/CustomEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/CustomEventTest.java
index 7af638123da..535dececff5 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/CustomEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/CustomEventTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/DeviceMotionEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/DeviceMotionEventTest.java
index 4ffda90db68..d01afb9e197 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/DeviceMotionEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/DeviceMotionEventTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/DeviceOrientationEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/DeviceOrientationEventTest.java
index 96161a89910..8013ab183c4 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/DeviceOrientationEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/DeviceOrientationEventTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/DragEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/DragEventTest.java
index 9721b14a035..f47002d3766 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/DragEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/DragEventTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/ErrorEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/ErrorEventTest.java
index 5fdd087a769..1a509ce66be 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/ErrorEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/ErrorEventTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/Event2Test.java b/src/test/java/org/htmlunit/javascript/host/event/Event2Test.java
index e5400ca339a..7eb73b17c4f 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/Event2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/Event2Test.java
@@ -17,9 +17,9 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/Event3Test.java b/src/test/java/org/htmlunit/javascript/host/event/Event3Test.java
index 4fc2db1fe03..e29c1beb640 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/Event3Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/Event3Test.java
@@ -26,8 +26,8 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.Keyboard;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/EventHandlerTest.java b/src/test/java/org/htmlunit/javascript/host/event/EventHandlerTest.java
index 5373081786c..97bf73b31d9 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/EventHandlerTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/EventHandlerTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/EventListenersContainerTest.java b/src/test/java/org/htmlunit/javascript/host/event/EventListenersContainerTest.java
index 932625141f8..c1e2e1f5d0e 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/EventListenersContainerTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/EventListenersContainerTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/EventTargetTest.java b/src/test/java/org/htmlunit/javascript/host/event/EventTargetTest.java
index 69b3772a30a..cb821233b81 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/EventTargetTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/EventTargetTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/EventTest.java b/src/test/java/org/htmlunit/javascript/host/event/EventTest.java
index dc7e211b056..e64e201c964 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/EventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/EventTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/FocusEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/FocusEventTest.java
index 6eb7f24771e..88f7cf20d15 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/FocusEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/FocusEventTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/GamepadEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/GamepadEventTest.java
index 3a444b5b7d9..3364fbb4441 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/GamepadEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/GamepadEventTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/HashChangeEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/HashChangeEventTest.java
index 811aa058131..ca789e607ad 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/HashChangeEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/HashChangeEventTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/InputEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/InputEventTest.java
index cded8378a2c..dba97c3cda7 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/InputEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/InputEventTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/KeyboardEvent2Test.java b/src/test/java/org/htmlunit/javascript/host/event/KeyboardEvent2Test.java
index aadad026bb7..e4e57b82028 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/KeyboardEvent2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/KeyboardEvent2Test.java
@@ -17,7 +17,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.html.HtmlPage;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/KeyboardEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/KeyboardEventTest.java
index c7834919f7e..27dbb9ed27c 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/KeyboardEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/KeyboardEventTest.java
@@ -19,9 +19,9 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/MessageEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/MessageEventTest.java
index 7a23955a581..031ea543277 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/MessageEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/MessageEventTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/MouseEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/MouseEventTest.java
index a7c061f0eb5..e9dc2fffa0a 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/MouseEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/MouseEventTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/MutationEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/MutationEventTest.java
index 170ee8afca3..2d9c1675c35 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/MutationEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/MutationEventTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/OfflineAudioCompletionEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/OfflineAudioCompletionEventTest.java
index eecbbb32a13..94be609960a 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/OfflineAudioCompletionEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/OfflineAudioCompletionEventTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/PageTransitionEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/PageTransitionEventTest.java
index b4517820a9a..d3fb3912ae6 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/PageTransitionEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/PageTransitionEventTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/PointerEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/PointerEventTest.java
index c9198c2db28..f3950082ce8 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/PointerEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/PointerEventTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/PopStateEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/PopStateEventTest.java
index b39c354999c..920bede4499 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/PopStateEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/PopStateEventTest.java
@@ -14,14 +14,14 @@
*/
package org.htmlunit.javascript.host.event;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.CHROME;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.EDGE;
+import static org.htmlunit.junit.annotation.TestedBrowser.CHROME;
+import static org.htmlunit.junit.annotation.TestedBrowser.EDGE;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/ProgressEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/ProgressEventTest.java
index e70db3aca08..0de54e878c5 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/ProgressEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/ProgressEventTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/StorageEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/StorageEventTest.java
index b702afb3429..127f4774bcc 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/StorageEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/StorageEventTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/SubmitEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/SubmitEventTest.java
index 600597109ea..72936c45b2c 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/SubmitEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/SubmitEventTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/TextEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/TextEventTest.java
index 3d5a8a2e511..22db974c167 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/TextEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/TextEventTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/TimeEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/TimeEventTest.java
index affa7944490..e2c5843cc4a 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/TimeEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/TimeEventTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/TouchEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/TouchEventTest.java
index 4602b9d24f0..e4eb7ff3a85 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/TouchEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/TouchEventTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/TrackEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/TrackEventTest.java
index 05fbc5d3db3..98d638dbef9 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/TrackEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/TrackEventTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/TransitionEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/TransitionEventTest.java
index f51916b3ced..686009829ce 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/TransitionEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/TransitionEventTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/UIEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/UIEventTest.java
index 8204468d676..78ed51ea55a 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/UIEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/UIEventTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/WebGLContextEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/WebGLContextEventTest.java
index 429c26b94b9..ad1fc361e22 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/WebGLContextEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/WebGLContextEventTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/event/WheelEventTest.java b/src/test/java/org/htmlunit/javascript/host/event/WheelEventTest.java
index cddb72e7e11..409ff420ea9 100644
--- a/src/test/java/org/htmlunit/javascript/host/event/WheelEventTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/event/WheelEventTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/file/BlobTest.java b/src/test/java/org/htmlunit/javascript/host/file/BlobTest.java
index f041f1543e3..dc9e5d41a13 100644
--- a/src/test/java/org/htmlunit/javascript/host/file/BlobTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/file/BlobTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/file/FileListTest.java b/src/test/java/org/htmlunit/javascript/host/file/FileListTest.java
index 4900cf96303..cc070b14b55 100644
--- a/src/test/java/org/htmlunit/javascript/host/file/FileListTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/file/FileListTest.java
@@ -22,7 +22,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/file/FileReaderTest.java b/src/test/java/org/htmlunit/javascript/host/file/FileReaderTest.java
index e857875740e..402b6f23dce 100644
--- a/src/test/java/org/htmlunit/javascript/host/file/FileReaderTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/file/FileReaderTest.java
@@ -23,7 +23,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/file/FileTest.java b/src/test/java/org/htmlunit/javascript/host/file/FileTest.java
index 0f20db72f3a..749a9e8505b 100644
--- a/src/test/java/org/htmlunit/javascript/host/file/FileTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/file/FileTest.java
@@ -25,7 +25,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/geo/GeolocationTest.java b/src/test/java/org/htmlunit/javascript/host/geo/GeolocationTest.java
index e057e1e9499..d7b705d7915 100644
--- a/src/test/java/org/htmlunit/javascript/host/geo/GeolocationTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/geo/GeolocationTest.java
@@ -20,7 +20,7 @@
import org.htmlunit.WebClientOptions;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/EnumeratorTest.java b/src/test/java/org/htmlunit/javascript/host/html/EnumeratorTest.java
index 98da9fc879a..f5938ba7b22 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/EnumeratorTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/EnumeratorTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/FormChildTest.java b/src/test/java/org/htmlunit/javascript/host/html/FormChildTest.java
index 494dd469536..f889b6c4af9 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/FormChildTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/FormChildTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLAllCollectionTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLAllCollectionTest.java
index e9ebc6fcb86..a983913f98c 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLAllCollectionTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLAllCollectionTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLAnchorElement2Test.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLAnchorElement2Test.java
index e8a6659e258..ff50e3b558e 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLAnchorElement2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLAnchorElement2Test.java
@@ -36,9 +36,9 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.UrlUtils;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLAreaElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLAreaElementTest.java
index 2ced7203041..43a337e3d2a 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLAreaElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLAreaElementTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLAudioElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLAudioElementTest.java
index 1b61a19dcd8..407cbc1e476 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLAudioElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLAudioElementTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLBRElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLBRElementTest.java
index 88f8520757e..7b758afa1b8 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLBRElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLBRElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLBaseElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLBaseElementTest.java
index 06a4b12e5e7..d9ed5196c12 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLBaseElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLBaseElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLBaseFontElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLBaseFontElementTest.java
index 0e2b56fd1df..a8d371f57f2 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLBaseFontElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLBaseFontElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLBodyElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLBodyElementTest.java
index d8b59039962..d0e74b36aee 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLBodyElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLBodyElementTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLButtonElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLButtonElementTest.java
index 5a230d74600..41d250c0263 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLButtonElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLButtonElementTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLCanvasElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLCanvasElementTest.java
index 7e6b1d56e94..80b83bb3959 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLCanvasElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLCanvasElementTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLCollection2Test.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLCollection2Test.java
index 96b6ea1bbe3..6f59d6fc0f1 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLCollection2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLCollection2Test.java
@@ -25,7 +25,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.WebClient;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLCollectionTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLCollectionTest.java
index ce7d04cb4e0..62e0d5d1158 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLCollectionTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLCollectionTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLDDElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLDDElementTest.java
index 4c65b442c5b..4b5e351611f 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLDDElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLDDElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLDListElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLDListElementTest.java
index d3a8472a1b5..b743b140539 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLDListElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLDListElementTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlDefinitionList;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLDTElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLDTElementTest.java
index 43054550a72..25e937435a1 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLDTElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLDTElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLDataElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLDataElementTest.java
index 77e37453b5f..ee627215c3c 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLDataElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLDataElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLDetailsElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLDetailsElementTest.java
index 3a09f720df3..9da0f01b32c 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLDetailsElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLDetailsElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLDialogElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLDialogElementTest.java
index 2ce99e625ff..6fe7200f511 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLDialogElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLDialogElementTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLDirectoryElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLDirectoryElementTest.java
index f963b530812..b618837db9c 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLDirectoryElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLDirectoryElementTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlDirectory;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLDivElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLDivElementTest.java
index 122c74072eb..cad370a77a0 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLDivElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLDivElementTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLDocument2Test.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLDocument2Test.java
index c2c72082853..f492f4c9f69 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLDocument2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLDocument2Test.java
@@ -27,7 +27,7 @@
import org.htmlunit.WebClient;
import org.htmlunit.html.HtmlPage;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.Cookie;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLDocumentTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLDocumentTest.java
index f73dc2be644..7d31caad0a0 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLDocumentTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLDocumentTest.java
@@ -34,9 +34,9 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLDocumentWrite2Test.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLDocumentWrite2Test.java
index e8ff70acfa6..06b37953f8a 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLDocumentWrite2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLDocumentWrite2Test.java
@@ -24,9 +24,9 @@
import org.htmlunit.MockWebConnection;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLDocumentWriteTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLDocumentWriteTest.java
index 2f47ad0741a..de2aa16d625 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLDocumentWriteTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLDocumentWriteTest.java
@@ -22,7 +22,7 @@
import org.htmlunit.html.FrameWindow;
import org.htmlunit.html.HtmlPage;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLElement2Test.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLElement2Test.java
index 5d0e579db9a..fdd518c826c 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLElement2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLElement2Test.java
@@ -14,15 +14,15 @@
*/
package org.htmlunit.javascript.host.html;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.CHROME;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.EDGE;
+import static org.htmlunit.junit.annotation.TestedBrowser.CHROME;
+import static org.htmlunit.junit.annotation.TestedBrowser.EDGE;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLElement3Test.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLElement3Test.java
index 77cee47d46a..1391ee5014b 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLElement3Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLElement3Test.java
@@ -26,7 +26,7 @@
import org.htmlunit.html.HtmlElement;
import org.htmlunit.html.HtmlPage;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLElementTest.java
index f284fefb429..c3cf6b1b30a 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLElementTest.java
@@ -14,17 +14,17 @@
*/
package org.htmlunit.javascript.host.html;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF_ESR;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF_ESR;
import java.net.URL;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -5366,11 +5366,7 @@ public void clickAnElementThatDisappears() throws Exception {
* @throws Exception if the test fails
*/
@Test
- @Alerts(DEFAULT = "Two ",
- FF = "Two ",
- FF_ESR = "Two ")
- @HtmlUnitNYI(CHROME = "Two ",
- EDGE = "Two ")
+ @Alerts("Two ")
public void innerHTML() throws Exception {
final String html =
HtmlPageTest.STANDARDS_MODE_PREFIX_
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLEmbedElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLEmbedElementTest.java
index 247b869ef7b..949d5139600 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLEmbedElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLEmbedElementTest.java
@@ -14,13 +14,13 @@
*/
package org.htmlunit.javascript.host.html;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF_ESR;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF_ESR;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLFieldSetElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLFieldSetElementTest.java
index 419f0808fef..906f3afdb88 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLFieldSetElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLFieldSetElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLFormControlsCollectionTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLFormControlsCollectionTest.java
index 8f97ac79edc..125d09f0c64 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLFormControlsCollectionTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLFormControlsCollectionTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLFormElement2Test.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLFormElement2Test.java
index 3fe6b743e8d..8f7e0501794 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLFormElement2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLFormElement2Test.java
@@ -25,7 +25,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlSubmitInput;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLFormElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLFormElementTest.java
index d5523521e52..83a621d8821 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLFormElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLFormElementTest.java
@@ -28,8 +28,8 @@
import org.htmlunit.MockWebConnection;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLFrameElement2Test.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLFrameElement2Test.java
index d5daf9be118..cd20ab18909 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLFrameElement2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLFrameElement2Test.java
@@ -21,8 +21,8 @@
import org.apache.commons.lang3.ArrayUtils;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLFrameElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLFrameElementTest.java
index 4c7c6205491..1280da5472e 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLFrameElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLFrameElementTest.java
@@ -20,7 +20,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.html.HtmlPage;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLFrameSetElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLFrameSetElementTest.java
index 24b14682994..6bac81a56f6 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLFrameSetElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLFrameSetElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLHRElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLHRElementTest.java
index d5f7f9a4dd2..1b8a86437dc 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLHRElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLHRElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLHeadingElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLHeadingElementTest.java
index a686f59e30d..888b6a668eb 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLHeadingElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLHeadingElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLHtmlElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLHtmlElementTest.java
index 92c9c951c1e..1760e3944fb 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLHtmlElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLHtmlElementTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlHtml;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLIFrameElement2Test.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLIFrameElement2Test.java
index 5e96dfaa81e..e3d462214d9 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLIFrameElement2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLIFrameElement2Test.java
@@ -18,8 +18,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLIFrameElement3Test.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLIFrameElement3Test.java
index 198c383e432..2f1154866f2 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLIFrameElement3Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLIFrameElement3Test.java
@@ -26,8 +26,8 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.junit.Ignore;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLImageElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLImageElementTest.java
index 41f843a061e..59e4e22fc23 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLImageElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLImageElementTest.java
@@ -14,8 +14,8 @@
*/
package org.htmlunit.javascript.host.html;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF_ESR;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF_ESR;
import java.io.File;
import java.io.FileInputStream;
@@ -30,10 +30,10 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLInputElement2Test.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLInputElement2Test.java
index 79188a0e3c6..889ef79c12a 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLInputElement2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLInputElement2Test.java
@@ -21,7 +21,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlTextInput;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLInputElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLInputElementTest.java
index 7ef5dd54d6c..d0ce852bed5 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLInputElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLInputElementTest.java
@@ -22,8 +22,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLIsIndexElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLIsIndexElementTest.java
index 3139174095d..3b49dfa75ce 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLIsIndexElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLIsIndexElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLLabelElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLLabelElementTest.java
index 565750c1ffc..ed28c48ad33 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLLabelElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLLabelElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLLegendElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLLegendElementTest.java
index 851d5eb8cab..2ab919bcfeb 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLLegendElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLLegendElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLLinkElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLLinkElementTest.java
index d9f23a2fc6b..4cc246f0b34 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLLinkElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLLinkElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLMapElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLMapElementTest.java
index f3096424341..5f0c4be4671 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLMapElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLMapElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLMarqueeElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLMarqueeElementTest.java
index 83c4310db7f..baad77d5b8b 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLMarqueeElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLMarqueeElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLMediaElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLMediaElementTest.java
index a4e49c39c2b..6f61580e767 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLMediaElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLMediaElementTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLMenuElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLMenuElementTest.java
index 2e6cb80a259..b986500b5ec 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLMenuElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLMenuElementTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlMenu;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLMetaElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLMetaElementTest.java
index ceee3369786..a00fb71fcf6 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLMetaElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLMetaElementTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.HttpHeader;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLMeterElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLMeterElementTest.java
index 050e2dcc613..68f8e7dcf7f 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLMeterElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLMeterElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLOListElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLOListElementTest.java
index ead2bb094b3..2ad18dff025 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLOListElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLOListElementTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlOrderedList;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLObjectElement2Test.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLObjectElement2Test.java
index cf9efa9c05d..3c50bae6a7a 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLObjectElement2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLObjectElement2Test.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLObjectElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLObjectElementTest.java
index d8c0628a165..1233ff9d299 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLObjectElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLObjectElementTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLOptGroupElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLOptGroupElementTest.java
index e6864ca25cb..f48b252f30f 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLOptGroupElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLOptGroupElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLOptionElement2Test.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLOptionElement2Test.java
index bf0924120a8..582b119f27d 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLOptionElement2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLOptionElement2Test.java
@@ -14,8 +14,8 @@
*/
package org.htmlunit.javascript.host.html;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF_ESR;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF_ESR;
import java.util.LinkedList;
import java.util.List;
@@ -23,10 +23,10 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLOptionElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLOptionElementTest.java
index 63676ce21bf..63155d4126a 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLOptionElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLOptionElementTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlSelect;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLOptionsCollectionTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLOptionsCollectionTest.java
index 35c3bd3537a..29b769b22e6 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLOptionsCollectionTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLOptionsCollectionTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLOutputElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLOutputElementTest.java
index a9f08124ab6..b352f085a52 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLOutputElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLOutputElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLParagraphElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLParagraphElementTest.java
index 10ce900798c..e5b365c9138 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLParagraphElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLParagraphElementTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlParagraph;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLParamElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLParamElementTest.java
index dc4e1edf806..67ee54cbcfd 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLParamElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLParamElementTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLPhraseElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLPhraseElementTest.java
index fe74cfa3866..3fc5126ed9b 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLPhraseElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLPhraseElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLPreElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLPreElementTest.java
index 5e3c7cb91d9..22f9836f16b 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLPreElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLPreElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLProgressElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLProgressElementTest.java
index 29129b0e0a1..4dbce163df4 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLProgressElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLProgressElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLQuoteElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLQuoteElementTest.java
index 84fcbc4a2c0..183e44f25cf 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLQuoteElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLQuoteElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLScriptElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLScriptElementTest.java
index 41a1fbac4a2..dc257908088 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLScriptElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLScriptElementTest.java
@@ -19,8 +19,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLSelectElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLSelectElementTest.java
index c840ca87df2..071fb1ee76e 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLSelectElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLSelectElementTest.java
@@ -20,8 +20,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLSpanElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLSpanElementTest.java
index b43ca48ee89..e481a1a2065 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLSpanElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLSpanElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLStyleElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLStyleElementTest.java
index 5e8db81e896..b6ca8e00831 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLStyleElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLStyleElementTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLTableCaptionElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLTableCaptionElementTest.java
index 3e09ce14a28..2c7e297ad9d 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLTableCaptionElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLTableCaptionElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLTableCellElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLTableCellElementTest.java
index 3dedf954458..fa1fd8305d1 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLTableCellElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLTableCellElementTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLTableColElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLTableColElementTest.java
index 3cbb305a894..401e3fce754 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLTableColElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLTableColElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLTableElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLTableElementTest.java
index bd3c9e3cab7..3f360aeb98a 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLTableElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLTableElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLTableRowElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLTableRowElementTest.java
index 82efb5a1c03..15ae53dad91 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLTableRowElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLTableRowElementTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLTableSectionElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLTableSectionElementTest.java
index 7e028260e56..bacc6f64b4e 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLTableSectionElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLTableSectionElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLTemplateElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLTemplateElementTest.java
index 49f8f87cfc3..e03d4863a35 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLTemplateElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLTemplateElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLTextAreaElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLTextAreaElementTest.java
index 639569a8726..08664c13630 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLTextAreaElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLTextAreaElementTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLTextElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLTextElementTest.java
index 9e7c2a61b3b..4f5ef5adf50 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLTextElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLTextElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLTimeElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLTimeElementTest.java
index 67e468038ce..8589f656d44 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLTimeElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLTimeElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLTitleElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLTitleElementTest.java
index 56492dc4add..bf550b9186a 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLTitleElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLTitleElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLUListElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLUListElementTest.java
index 8726c40c6b0..64ef13ecfc6 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLUListElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLUListElementTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlUnorderedList;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/html/HTMLVideoElementTest.java b/src/test/java/org/htmlunit/javascript/host/html/HTMLVideoElementTest.java
index 9f85a668559..7d3018033c1 100644
--- a/src/test/java/org/htmlunit/javascript/host/html/HTMLVideoElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/html/HTMLVideoElementTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/intl/CollatorTest.java b/src/test/java/org/htmlunit/javascript/host/intl/CollatorTest.java
index cc9b1d518c7..3bf97af90ea 100644
--- a/src/test/java/org/htmlunit/javascript/host/intl/CollatorTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/intl/CollatorTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/intl/DateTimeFormat2Test.java b/src/test/java/org/htmlunit/javascript/host/intl/DateTimeFormat2Test.java
index fde3c020e1a..0a5da391b40 100644
--- a/src/test/java/org/htmlunit/javascript/host/intl/DateTimeFormat2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/intl/DateTimeFormat2Test.java
@@ -14,17 +14,17 @@
*/
package org.htmlunit.javascript.host.intl;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.CHROME;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.EDGE;
+import static org.htmlunit.junit.annotation.TestedBrowser.CHROME;
+import static org.htmlunit.junit.annotation.TestedBrowser.EDGE;
import org.apache.commons.lang3.CharUtils;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.ComparisonFailure;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/intl/DateTimeFormatTest.java b/src/test/java/org/htmlunit/javascript/host/intl/DateTimeFormatTest.java
index 20cb59df54b..f3626c1f6f1 100644
--- a/src/test/java/org/htmlunit/javascript/host/intl/DateTimeFormatTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/intl/DateTimeFormatTest.java
@@ -21,9 +21,9 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/intl/IntlTest.java b/src/test/java/org/htmlunit/javascript/host/intl/IntlTest.java
index 15d3c0d5399..44cf427d386 100644
--- a/src/test/java/org/htmlunit/javascript/host/intl/IntlTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/intl/IntlTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/intl/NumberFormat2Test.java b/src/test/java/org/htmlunit/javascript/host/intl/NumberFormat2Test.java
index b4a9ee0dae3..387cb41471b 100644
--- a/src/test/java/org/htmlunit/javascript/host/intl/NumberFormat2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/intl/NumberFormat2Test.java
@@ -18,7 +18,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.ComparisonFailure;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/intl/NumberFormatTest.java b/src/test/java/org/htmlunit/javascript/host/intl/NumberFormatTest.java
index 90cb3fc9d39..4ec0020c52d 100644
--- a/src/test/java/org/htmlunit/javascript/host/intl/NumberFormatTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/intl/NumberFormatTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/intl/V8BreakIteratorTest.java b/src/test/java/org/htmlunit/javascript/host/intl/V8BreakIteratorTest.java
index 3a7c96b60e8..6ee1a9c6da8 100644
--- a/src/test/java/org/htmlunit/javascript/host/intl/V8BreakIteratorTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/intl/V8BreakIteratorTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/media/AudioContextTest.java b/src/test/java/org/htmlunit/javascript/host/media/AudioContextTest.java
index 0c6eeb60a39..e9ae58dd8d7 100644
--- a/src/test/java/org/htmlunit/javascript/host/media/AudioContextTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/media/AudioContextTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/media/AudioParamTest.java b/src/test/java/org/htmlunit/javascript/host/media/AudioParamTest.java
index 906a247cd44..d88bb3323c5 100644
--- a/src/test/java/org/htmlunit/javascript/host/media/AudioParamTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/media/AudioParamTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/media/BaseAudioContextTest.java b/src/test/java/org/htmlunit/javascript/host/media/BaseAudioContextTest.java
index 4b5c4fcd51d..7face56e0aa 100644
--- a/src/test/java/org/htmlunit/javascript/host/media/BaseAudioContextTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/media/BaseAudioContextTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/media/GainNodeTest.java b/src/test/java/org/htmlunit/javascript/host/media/GainNodeTest.java
index 5b434db83c3..d7ecf5f92a9 100644
--- a/src/test/java/org/htmlunit/javascript/host/media/GainNodeTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/media/GainNodeTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/media/MediaDevicesTest.java b/src/test/java/org/htmlunit/javascript/host/media/MediaDevicesTest.java
index 14429bff779..657f222afdd 100644
--- a/src/test/java/org/htmlunit/javascript/host/media/MediaDevicesTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/media/MediaDevicesTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/media/MediaSourceTest.java b/src/test/java/org/htmlunit/javascript/host/media/MediaSourceTest.java
index 91b9f567079..107e3ea98c2 100644
--- a/src/test/java/org/htmlunit/javascript/host/media/MediaSourceTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/media/MediaSourceTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/media/MediaStreamTest.java b/src/test/java/org/htmlunit/javascript/host/media/MediaStreamTest.java
index 9f3f7b3dd4a..dea1b1bacdb 100644
--- a/src/test/java/org/htmlunit/javascript/host/media/MediaStreamTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/media/MediaStreamTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/media/OfflineAudioContextTest.java b/src/test/java/org/htmlunit/javascript/host/media/OfflineAudioContextTest.java
index 0a638afa44e..fb94db33ce9 100644
--- a/src/test/java/org/htmlunit/javascript/host/media/OfflineAudioContextTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/media/OfflineAudioContextTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/media/PeriodicSyncManagerTest.java b/src/test/java/org/htmlunit/javascript/host/media/PeriodicSyncManagerTest.java
index 522e1eff963..c3b76953015 100644
--- a/src/test/java/org/htmlunit/javascript/host/media/PeriodicSyncManagerTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/media/PeriodicSyncManagerTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/media/rtc/RTCPeerConnectionTest.java b/src/test/java/org/htmlunit/javascript/host/media/rtc/RTCPeerConnectionTest.java
index a1767b87628..da8975e38c1 100644
--- a/src/test/java/org/htmlunit/javascript/host/media/rtc/RTCPeerConnectionTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/media/rtc/RTCPeerConnectionTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/network/NetworkInformationTest.java b/src/test/java/org/htmlunit/javascript/host/network/NetworkInformationTest.java
index 8006516658d..e80022d01f5 100644
--- a/src/test/java/org/htmlunit/javascript/host/network/NetworkInformationTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/network/NetworkInformationTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/performance/PerformanceNavigationTest.java b/src/test/java/org/htmlunit/javascript/host/performance/PerformanceNavigationTest.java
index a8689dfe04c..cc7337f31df 100644
--- a/src/test/java/org/htmlunit/javascript/host/performance/PerformanceNavigationTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/performance/PerformanceNavigationTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/javascript/host/performance/PerformanceTest.java b/src/test/java/org/htmlunit/javascript/host/performance/PerformanceTest.java
index a664324fef1..74ef261a670 100644
--- a/src/test/java/org/htmlunit/javascript/host/performance/PerformanceTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/performance/PerformanceTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/javascript/host/performance/PerformanceTimingTest.java b/src/test/java/org/htmlunit/javascript/host/performance/PerformanceTimingTest.java
index d0eb3ac7483..33c09bb101f 100644
--- a/src/test/java/org/htmlunit/javascript/host/performance/PerformanceTimingTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/performance/PerformanceTimingTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/host/svg/SVGAngleTest.java b/src/test/java/org/htmlunit/javascript/host/svg/SVGAngleTest.java
index 0a8d633560e..f91e7131b04 100644
--- a/src/test/java/org/htmlunit/javascript/host/svg/SVGAngleTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/svg/SVGAngleTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/svg/SVGPathElementTest.java b/src/test/java/org/htmlunit/javascript/host/svg/SVGPathElementTest.java
index c7bb7636f09..b11a22fad29 100644
--- a/src/test/java/org/htmlunit/javascript/host/svg/SVGPathElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/svg/SVGPathElementTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/svg/SVGSVGElementTest.java b/src/test/java/org/htmlunit/javascript/host/svg/SVGSVGElementTest.java
index c93340efd26..9c4e4b9f06b 100644
--- a/src/test/java/org/htmlunit/javascript/host/svg/SVGSVGElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/svg/SVGSVGElementTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/svg/SVGTSpanElementTest.java b/src/test/java/org/htmlunit/javascript/host/svg/SVGTSpanElementTest.java
index d55a4f19df7..4a66fa12005 100644
--- a/src/test/java/org/htmlunit/javascript/host/svg/SVGTSpanElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/svg/SVGTSpanElementTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/svg/SVGTest.java b/src/test/java/org/htmlunit/javascript/host/svg/SVGTest.java
index 7641df4e9f5..d3c5f7d5991 100644
--- a/src/test/java/org/htmlunit/javascript/host/svg/SVGTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/svg/SVGTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/svg/SVGTextContentElementTest.java b/src/test/java/org/htmlunit/javascript/host/svg/SVGTextContentElementTest.java
index 40e974cb737..679011662d2 100644
--- a/src/test/java/org/htmlunit/javascript/host/svg/SVGTextContentElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/svg/SVGTextContentElementTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/svg/SVGTextElementTest.java b/src/test/java/org/htmlunit/javascript/host/svg/SVGTextElementTest.java
index c988ffd3290..662f64706d6 100644
--- a/src/test/java/org/htmlunit/javascript/host/svg/SVGTextElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/svg/SVGTextElementTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/svg/SVGTextPathElementTest.java b/src/test/java/org/htmlunit/javascript/host/svg/SVGTextPathElementTest.java
index 3b0cdee3143..33b3219b81a 100644
--- a/src/test/java/org/htmlunit/javascript/host/svg/SVGTextPathElementTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/svg/SVGTextPathElementTest.java
@@ -17,8 +17,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/worker/DedicatedWorkerGlobalScopeTest.java b/src/test/java/org/htmlunit/javascript/host/worker/DedicatedWorkerGlobalScopeTest.java
index 418701f1038..fda0c8de35a 100644
--- a/src/test/java/org/htmlunit/javascript/host/worker/DedicatedWorkerGlobalScopeTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/worker/DedicatedWorkerGlobalScopeTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/worker/WorkerLocationTest.java b/src/test/java/org/htmlunit/javascript/host/worker/WorkerLocationTest.java
index 60d70343047..d8608b30cfd 100644
--- a/src/test/java/org/htmlunit/javascript/host/worker/WorkerLocationTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/worker/WorkerLocationTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/worker/WorkerNavigatorTest.java b/src/test/java/org/htmlunit/javascript/host/worker/WorkerNavigatorTest.java
index d3bb5e0fa41..400ead61093 100644
--- a/src/test/java/org/htmlunit/javascript/host/worker/WorkerNavigatorTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/worker/WorkerNavigatorTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -82,9 +82,9 @@ public void appName() throws Exception {
*/
@Test
@Alerts(CHROME = "5.0\\s(Windows\\sNT\\s10.0;\\sWin64;\\sx64)\\sAppleWebKit/537.36\\s"
- + "(KHTML,\\slike\\sGecko)\\sChrome/131.0.0.0\\sSafari/537.36",
+ + "(KHTML,\\slike\\sGecko)\\sChrome/132.0.0.0\\sSafari/537.36",
EDGE = "5.0\\s(Windows\\sNT\\s10.0;\\sWin64;\\sx64)\\sAppleWebKit/537.36\\s"
- + "(KHTML,\\slike\\sGecko)\\sChrome/131.0.0.0\\sSafari/537.36\\sEdg/131.0.0.0",
+ + "(KHTML,\\slike\\sGecko)\\sChrome/132.0.0.0\\sSafari/537.36\\sEdg/132.0.0.0",
FF = "5.0\\s(Windows)",
FF_ESR = "5.0\\s(Windows)")
public void appVersion() throws Exception {
@@ -161,10 +161,10 @@ public void product() throws Exception {
*/
@Test
@Alerts(CHROME = "Mozilla/5.0\\s(Windows\\sNT\\s10.0;\\sWin64;\\sx64)\\sAppleWebKit/537.36\\s"
- + "(KHTML,\\slike\\sGecko)\\sChrome/131.0.0.0\\sSafari/537.36",
+ + "(KHTML,\\slike\\sGecko)\\sChrome/132.0.0.0\\sSafari/537.36",
EDGE = "Mozilla/5.0\\s(Windows\\sNT\\s10.0;\\sWin64;\\sx64)\\sAppleWebKit/537.36\\s"
- + "(KHTML,\\slike\\sGecko)\\sChrome/131.0.0.0\\sSafari/537.36\\sEdg/131.0.0.0",
- FF = "Mozilla/5.0\\s(Windows\\sNT\\s10.0;\\sWin64;\\sx64;\\srv:133.0)\\sGecko/20100101\\sFirefox/133.0",
+ + "(KHTML,\\slike\\sGecko)\\sChrome/132.0.0.0\\sSafari/537.36\\sEdg/132.0.0.0",
+ FF = "Mozilla/5.0\\s(Windows\\sNT\\s10.0;\\sWin64;\\sx64;\\srv:134.0)\\sGecko/20100101\\sFirefox/134.0",
FF_ESR = "Mozilla/5.0\\s(Windows\\sNT\\s10.0;\\sWin64;\\sx64;\\srv:128.0)\\sGecko/20100101\\sFirefox/128.0")
public void userAgent() throws Exception {
final String workerJs = "postMessage(navigator.userAgent);\n";
diff --git a/src/test/java/org/htmlunit/javascript/host/worker/WorkerTest.java b/src/test/java/org/htmlunit/javascript/host/worker/WorkerTest.java
index 6b7c9ae276c..ea6297be5dc 100644
--- a/src/test/java/org/htmlunit/javascript/host/worker/WorkerTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/worker/WorkerTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/xml/FormDataTest.java b/src/test/java/org/htmlunit/javascript/host/xml/FormDataTest.java
index 38f36383027..66fb9c851b9 100644
--- a/src/test/java/org/htmlunit/javascript/host/xml/FormDataTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/xml/FormDataTest.java
@@ -38,8 +38,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/xml/XMLDocument2Test.java b/src/test/java/org/htmlunit/javascript/host/xml/XMLDocument2Test.java
index 22f4d499891..556d3490df6 100644
--- a/src/test/java/org/htmlunit/javascript/host/xml/XMLDocument2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/xml/XMLDocument2Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/xml/XMLDocument3Test.java b/src/test/java/org/htmlunit/javascript/host/xml/XMLDocument3Test.java
index f16cdea524e..b0c43cbd0e7 100644
--- a/src/test/java/org/htmlunit/javascript/host/xml/XMLDocument3Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/xml/XMLDocument3Test.java
@@ -25,7 +25,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/xml/XMLDocumentTest.java b/src/test/java/org/htmlunit/javascript/host/xml/XMLDocumentTest.java
index dbbbb07cb90..84906f522cc 100644
--- a/src/test/java/org/htmlunit/javascript/host/xml/XMLDocumentTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/xml/XMLDocumentTest.java
@@ -20,8 +20,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequest2Test.java b/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequest2Test.java
index 861fcd57e7f..894892fa65f 100644
--- a/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequest2Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequest2Test.java
@@ -45,8 +45,8 @@
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.javascript.host.xml.XMLHttpRequestTest.BasicAuthenticationServlet;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.junit.Ignore;
diff --git a/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequest3Test.java b/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequest3Test.java
index caec9f0d505..76a179f41d4 100644
--- a/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequest3Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequest3Test.java
@@ -45,8 +45,8 @@
import org.htmlunit.html.HtmlSubmitInput;
import org.htmlunit.javascript.host.xml.XMLHttpRequestTest.StreamingServlet;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequest4Test.java b/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequest4Test.java
index ce60e79a38f..36ce3de9d97 100644
--- a/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequest4Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequest4Test.java
@@ -22,7 +22,7 @@
import org.htmlunit.WebWindow;
import org.htmlunit.html.HtmlPage;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequest5Test.java b/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequest5Test.java
index 6f08291c039..c6846f56c58 100644
--- a/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequest5Test.java
+++ b/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequest5Test.java
@@ -25,8 +25,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.NameValuePair;
import org.junit.Assert;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequestCORSTest.java b/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequestCORSTest.java
index 7de355bee11..70182f89271 100644
--- a/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequestCORSTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequestCORSTest.java
@@ -33,7 +33,7 @@
import org.htmlunit.HttpHeader;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequestEventTargetTest.java b/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequestEventTargetTest.java
index 407bc21db96..c409b598901 100644
--- a/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequestEventTargetTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequestEventTargetTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequestLifeCycleTest.java b/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequestLifeCycleTest.java
index 3a9b542de2a..6bf7c3d9116 100644
--- a/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequestLifeCycleTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequestLifeCycleTest.java
@@ -38,8 +38,8 @@
import org.htmlunit.WebTestCase;
import org.htmlunit.http.HttpStatus;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.Retry;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.Retry;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.junit.After;
diff --git a/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequestTest.java b/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequestTest.java
index e646b5caa69..d61e266b0d0 100644
--- a/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequestTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/xml/XMLHttpRequestTest.java
@@ -39,10 +39,10 @@
import org.htmlunit.WebRequest;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
-import org.htmlunit.junit.BrowserRunner.Tries;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
+import org.htmlunit.junit.annotation.Tries;
import org.htmlunit.util.MimeType;
import org.htmlunit.util.NameValuePair;
import org.junit.ComparisonFailure;
diff --git a/src/test/java/org/htmlunit/javascript/host/xml/XMLSerializerTest.java b/src/test/java/org/htmlunit/javascript/host/xml/XMLSerializerTest.java
index 0b8ea40e654..9734d6a47d7 100644
--- a/src/test/java/org/htmlunit/javascript/host/xml/XMLSerializerTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/xml/XMLSerializerTest.java
@@ -19,8 +19,8 @@
import org.htmlunit.MockWebConnection;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/host/xml/XSLTProcessorTest.java b/src/test/java/org/htmlunit/javascript/host/xml/XSLTProcessorTest.java
index 1c059e5b239..2e276215964 100644
--- a/src/test/java/org/htmlunit/javascript/host/xml/XSLTProcessorTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/xml/XSLTProcessorTest.java
@@ -19,8 +19,8 @@
import org.htmlunit.MockWebConnection;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/polyfill/PolyfillTest.java b/src/test/java/org/htmlunit/javascript/polyfill/PolyfillTest.java
index 6792ccf720f..af8e0e23a23 100644
--- a/src/test/java/org/htmlunit/javascript/polyfill/PolyfillTest.java
+++ b/src/test/java/org/htmlunit/javascript/polyfill/PolyfillTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/HtmlUnitRegExpProxyGlobalPropertiesStringFunctionsTest.java b/src/test/java/org/htmlunit/javascript/regexp/HtmlUnitRegExpProxyGlobalPropertiesStringFunctionsTest.java
index 6d37c9ba432..f6509e14840 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/HtmlUnitRegExpProxyGlobalPropertiesStringFunctionsTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/HtmlUnitRegExpProxyGlobalPropertiesStringFunctionsTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/HtmlUnitRegExpProxyGlobalPropertiesTest.java b/src/test/java/org/htmlunit/javascript/regexp/HtmlUnitRegExpProxyGlobalPropertiesTest.java
index 85a117924b6..8b2927d5630 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/HtmlUnitRegExpProxyGlobalPropertiesTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/HtmlUnitRegExpProxyGlobalPropertiesTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/HtmlUnitRegExpProxyInstancePropertiesTest.java b/src/test/java/org/htmlunit/javascript/regexp/HtmlUnitRegExpProxyInstancePropertiesTest.java
index b072f25639e..1e4a7529a3f 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/HtmlUnitRegExpProxyInstancePropertiesTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/HtmlUnitRegExpProxyInstancePropertiesTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/HtmlUnitRegExpProxyTest.java b/src/test/java/org/htmlunit/javascript/regexp/HtmlUnitRegExpProxyTest.java
index 3166de39d9d..e6ceedf10ab 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/HtmlUnitRegExpProxyTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/HtmlUnitRegExpProxyTest.java
@@ -19,7 +19,7 @@
import org.apache.commons.io.IOUtils;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/RegExpJsToJavaConverter2Test.java b/src/test/java/org/htmlunit/javascript/regexp/RegExpJsToJavaConverter2Test.java
index 45b4cf37bf9..a203edcb771 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/RegExpJsToJavaConverter2Test.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/RegExpJsToJavaConverter2Test.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlTextInput;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/RegExpTest.java b/src/test/java/org/htmlunit/javascript/regexp/RegExpTest.java
index b556bb52f3c..6f66d452e90 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/RegExpTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/RegExpTest.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/AlphanumericTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/AlphanumericTest.java
index f25fe64e41f..6b81d55b8b5 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/AlphanumericTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/AlphanumericTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/AsteriskTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/AsteriskTest.java
index e64c3f0ef0e..696914b41a4 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/AsteriskTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/AsteriskTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/BackslashTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/BackslashTest.java
index 0e8cafcb5eb..3e8f6ce555d 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/BackslashTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/BackslashTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/BackspaceTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/BackspaceTest.java
index e61ee246cbc..e6466436521 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/BackspaceTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/BackspaceTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/BeginLineTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/BeginLineTest.java
index abc48585b22..eb170d4c7ea 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/BeginLineTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/BeginLineTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/CharacterClassTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/CharacterClassTest.java
index 69c8d8299e7..2df6fd8ce9a 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/CharacterClassTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/CharacterClassTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/CompileTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/CompileTest.java
index a836d3797c0..91231a5811c 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/CompileTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/CompileTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/DigitTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/DigitTest.java
index dbb6646300e..9c43e5544bf 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/DigitTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/DigitTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/DotTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/DotTest.java
index 9e0ede27b49..6e333950648 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/DotTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/DotTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/EndLineTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/EndLineTest.java
index 444b6ae37f7..9280f4d12cc 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/EndLineTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/EndLineTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/EverythingTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/EverythingTest.java
index 1c39c93e2f2..3d6dbb520a1 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/EverythingTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/EverythingTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/ExecTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/ExecTest.java
index 81963ef9a12..8055824d7ab 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/ExecTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/ExecTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/FlagsTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/FlagsTest.java
index 4355a80ae47..b456f4f1577 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/FlagsTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/FlagsTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/GlobalTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/GlobalTest.java
index 3b2d487466f..a8efa4436b3 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/GlobalTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/GlobalTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/HexadecimalTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/HexadecimalTest.java
index 0d9d176c306..804473a551e 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/HexadecimalTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/HexadecimalTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/IgnoreCaseTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/IgnoreCaseTest.java
index e3332319d94..db6a30441da 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/IgnoreCaseTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/IgnoreCaseTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/IntervalTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/IntervalTest.java
index 317bfbaa5d7..5a61b05de86 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/IntervalTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/IntervalTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/OctalTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/OctalTest.java
index 9e8457f0fdf..0c846b05571 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/OctalTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/OctalTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/ParenthesesTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/ParenthesesTest.java
index 93de058dfa2..17c69b665fa 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/ParenthesesTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/ParenthesesTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/PlusTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/PlusTest.java
index 164b54c237d..458cddf968c 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/PlusTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/PlusTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/QuestionMarkTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/QuestionMarkTest.java
index 323f0d999fc..f0b3441410e 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/QuestionMarkTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/QuestionMarkTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/SimpleFormTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/SimpleFormTest.java
index 162a795f8b3..0ab3969b996 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/SimpleFormTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/SimpleFormTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/SourceTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/SourceTest.java
index 750bb4af432..a9b4d53042b 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/SourceTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/SourceTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/StringReplaceTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/StringReplaceTest.java
index ab1509e74cc..0a424abec7c 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/StringReplaceTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/StringReplaceTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/StringSearchTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/StringSearchTest.java
index 5f6f39d58bd..5d56c0baa5b 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/StringSearchTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/StringSearchTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/StringSplitTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/StringSplitTest.java
index eefc24a9b0b..3c7da8ba3e6 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/StringSplitTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/StringSplitTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/TestTest.java b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/TestTest.java
index 301f0ec5936..16ba0fc4930 100644
--- a/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/TestTest.java
+++ b/src/test/java/org/htmlunit/javascript/regexp/mozilla/js1_2/TestTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/junit/BrowserParameterizedRunner.java b/src/test/java/org/htmlunit/junit/BrowserParameterizedRunner.java
index 79185380f44..d4f09020a8d 100644
--- a/src/test/java/org/htmlunit/junit/BrowserParameterizedRunner.java
+++ b/src/test/java/org/htmlunit/junit/BrowserParameterizedRunner.java
@@ -45,10 +45,10 @@
* It uses {@link org.junit.runners.Parameterized.Parameter} for field injection.
*
* You must define a single {@link Default} method, which has global
- * {@link org.htmlunit.junit.BrowserRunner.Alerts}.
+ * {@link org.htmlunit.junit.annotation.Alerts}.
* You can add other specific tests, which will not be parameterized, and they can have other
- * {@link org.htmlunit.junit.BrowserRunner.Alerts} or
- * {@link org.htmlunit.junit.BrowserRunner.NotYetImplemented}.
+ * {@link org.htmlunit.junit.annotation.Alerts} or
+ * {@link org.htmlunit.junit.annotation.NotYetImplemented}.
*
* The method name will start with underscore '_' and have the parameters joined by an underscore.
* If the method of a data entry already exists, then it will not be considered, as the actual method will override it.
diff --git a/src/test/java/org/htmlunit/junit/BrowserRunner.java b/src/test/java/org/htmlunit/junit/BrowserRunner.java
index e11fe32a97e..e47d137afbc 100644
--- a/src/test/java/org/htmlunit/junit/BrowserRunner.java
+++ b/src/test/java/org/htmlunit/junit/BrowserRunner.java
@@ -14,25 +14,14 @@
*/
package org.htmlunit.junit;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.CHROME;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.EDGE;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF_ESR;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import org.htmlunit.BrowserVersion;
-import org.htmlunit.SimpleWebTestCase;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.WebTestCase;
-import org.htmlunit.annotations.StandardsMode;
import org.junit.runner.Runner;
import org.junit.runner.manipulation.Filter;
import org.junit.runner.manipulation.Filterable;
@@ -162,250 +151,4 @@ protected List getChildren() {
*/
public static final String EMPTY_DEFAULT = "~InTerNal_To_BrowSeRRunNer#@$";
- /**
- * Browser under test.
- */
- public enum TestedBrowser {
- /** Latest version of Chrome. */
- CHROME,
-
- /** Edge. */
- EDGE,
-
- /** Firefox. */
- FF,
-
- /** Firefox ESR. */
- FF_ESR
- }
-
- /**
- * Allows to express the expected alerts (i.e. the messages passed to the
- * window.alert function) for the different browsers for a unit test.
- * Expected alerts can be retrieved within a unit test with {@link SimpleWebTestCase#getExpectedAlerts()}
- * (resp. {@link WebDriverTestCase#getExpectedAlerts}) to be compared with the actual alerts but most of the time
- * utility functions like {@link SimpleWebTestCase#loadPageWithAlerts(String)}
- * (resp. {@link WebDriverTestCase#loadPageWithAlerts2(String)}) are used which do it
- * after having loaded the page.
- */
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.METHOD)
- public @interface Alerts {
-
- /**
- * Alerts that is used for all browsers (if defined, the other values are ignored).
- * @return the alerts
- */
- String[] value() default { EMPTY_DEFAULT };
-
- /**
- * Alerts for latest Edge.
- * @return the alerts
- */
- String[] EDGE() default { EMPTY_DEFAULT };
-
- /**
- * Alerts for latest Firefox.
- * @return the alerts
- */
- String[] FF() default { EMPTY_DEFAULT };
-
- /**
- * Alerts for Firefox ESR.
- * @return the alerts
- */
- String[] FF_ESR() default { EMPTY_DEFAULT };
-
- /**
- * Alerts for latest Chrome.
- * @return the alerts
- */
- String[] CHROME() default { EMPTY_DEFAULT };
-
- /**
- * The default alerts, if nothing more specific is defined.
- * @return the alerts
- */
- String[] DEFAULT() default { EMPTY_DEFAULT };
- }
-
- /**
- * Same as {@link Alerts} but only in {@code Standards Mode}.
- *
- * It is typically used with {@link StandardsMode}.
- */
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.METHOD)
- public @interface AlertsStandards {
-
- /**
- * Alerts that is used for all browsers (if defined, the other values are ignored).
- * @return the alerts
- */
- String[] value() default { EMPTY_DEFAULT };
-
- /**
- * Alerts for latest Edge.
- * @return the alerts
- */
- String[] EDGE() default { EMPTY_DEFAULT };
-
- /**
- * Alerts for latest Firefox.
- * @return the alerts
- */
- String[] FF() default { EMPTY_DEFAULT };
-
- /**
- * Alerts for Firefox ESR.
- * @return the alerts
- */
- String[] FF_ESR() default { EMPTY_DEFAULT };
-
- /**
- * Alerts for latest Chrome.
- * @return the alerts
- */
- String[] CHROME() default { EMPTY_DEFAULT };
-
- /**
- * The default alerts, if nothing more specific is defined.
- * @return the alerts
- */
- String[] DEFAULT() default { EMPTY_DEFAULT };
- }
-
- /**
- * Marks the os.
- */
- public enum OS {
- /** Linux. */
- Linux,
-
- /** Windows. */
- Windows
- }
-
- /**
- * Marks a test as not yet working for a particular browser (default value is all).
- * This will cause a failure to be considered as success and a success as failure forcing
- * us to remove this annotation when a feature has been implemented even unintentionally.
- * @see TestedBrowser
- */
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.METHOD)
- public @interface NotYetImplemented {
-
- /**
- * The browsers with which the case is not yet implemented.
- * @return the browsers
- */
- TestedBrowser[] value() default {
- EDGE, FF_ESR, FF, CHROME
- };
-
- /**
- * The operating systems with which the case is not yet implemented.
- * @return the operating systems
- */
- OS[] os() default {};
- }
-
- /**
- * Indicates that the test runs manually in a real browser but not when using WebDriver to drive the browser.
- * @see TestedBrowser
- */
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.METHOD)
- public @interface BuggyWebDriver {
- /**
- * Alerts that is used for all browsers (if defined, the other values are ignored).
- * @return the alerts
- */
- String[] value() default { EMPTY_DEFAULT };
-
- /**
- * Alerts for latest Edge.
- * @return the alerts
- */
- String[] EDGE() default { EMPTY_DEFAULT };
-
- /**
- * Alerts for latest Firefox.
- * @return the alerts
- */
- String[] FF() default { EMPTY_DEFAULT };
-
- /**
- * Alerts for Firefox ESR.
- * @return the alerts
- */
- String[] FF_ESR() default { EMPTY_DEFAULT };
-
- /**
- * Alerts for latest Chrome.
- * @return the alerts
- */
- String[] CHROME() default { EMPTY_DEFAULT };
-
- /**
- * The default alerts, if nothing more specific is defined.
- * @return the alerts
- */
- String[] DEFAULT() default { EMPTY_DEFAULT };
- }
-
- /**
- * Indicates that the test produces different result when running with HtmlUnit.
- * @see TestedBrowser
- */
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.METHOD)
- public @interface HtmlUnitNYI {
- /**
- * Alerts that is used for all browsers (if defined, the other values are ignored).
- * @return the alerts
- */
- String[] value() default { EMPTY_DEFAULT };
-
- /**
- * Alerts for latest Edge.
- * @return the alerts
- */
- String[] EDGE() default { EMPTY_DEFAULT };
-
- /**
- * Alerts for latest Firefox.
- * @return the alerts
- */
- String[] FF() default { EMPTY_DEFAULT };
-
- /**
- * Alerts for Firefox ESR.
- * @return the alerts
- */
- String[] FF_ESR() default { EMPTY_DEFAULT };
-
- /**
- * Alerts for latest Chrome.
- * @return the alerts
- */
- String[] CHROME() default { EMPTY_DEFAULT };
- }
-
- /**
- * The number of tries that test will be executed.
- * The test will fail if and only if all trials failed.
- */
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.METHOD)
- public @interface Tries {
-
- /**
- * The value.
- * @return the value
- */
- int value() default 1;
- }
-
}
diff --git a/src/test/java/org/htmlunit/junit/BrowserStatement.java b/src/test/java/org/htmlunit/junit/BrowserStatement.java
index f8d0b7b2d2a..210e8337c30 100644
--- a/src/test/java/org/htmlunit/junit/BrowserStatement.java
+++ b/src/test/java/org/htmlunit/junit/BrowserStatement.java
@@ -14,15 +14,8 @@
*/
package org.htmlunit.junit;
-import static org.junit.Assert.assertFalse;
-
-import java.util.Arrays;
-
import org.htmlunit.BrowserVersion;
import org.htmlunit.WebDriverTestCase;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.AlertsStandards;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;
@@ -75,98 +68,6 @@ public void evaluate() throws Throwable {
}
}
}
- assertAlerts();
- }
-
- private void assertAlerts() {
- final Alerts alerts = method_.getAnnotation(Alerts.class);
- if (alerts != null) {
- if (!BrowserVersionClassRunner.isDefined(alerts.value())) {
- assertFalse("Obsolete DEFAULT because all browser expectations are defined individually",
- BrowserVersionClassRunner.isDefined(alerts.DEFAULT())
- && BrowserVersionClassRunner.isDefined(alerts.CHROME())
- && BrowserVersionClassRunner.isDefined(alerts.FF())
- && BrowserVersionClassRunner.isDefined(alerts.FF_ESR())
- && BrowserVersionClassRunner.isDefined(alerts.EDGE()));
-
- assertFalse("Obsolete DEFAULT because all browser expectations are defined individually",
- BrowserVersionClassRunner.isDefined(alerts.DEFAULT())
- && BrowserVersionClassRunner.isDefined(alerts.CHROME())
- && BrowserVersionClassRunner.isDefined(alerts.FF())
- && BrowserVersionClassRunner.isDefined(alerts.FF_ESR())
- && BrowserVersionClassRunner.isDefined(alerts.EDGE()));
-
- assertNotEquals(BrowserVersion.EDGE, alerts.EDGE(), alerts.DEFAULT());
- assertNotEquals(BrowserVersion.CHROME, alerts.CHROME(), alerts.DEFAULT());
- assertNotEquals(BrowserVersion.FIREFOX, alerts.FF(), alerts.DEFAULT());
- assertNotEquals(BrowserVersion.FIREFOX_ESR, alerts.FF_ESR(), alerts.DEFAULT());
- }
-
- final HtmlUnitNYI nyiAlerts = method_.getAnnotation(HtmlUnitNYI.class);
- if (nyiAlerts != null) {
- if (BrowserVersionClassRunner.isDefined(alerts.CHROME())
- && BrowserVersionClassRunner.isDefined(nyiAlerts.CHROME())) {
- assertNotEquals(BrowserVersion.CHROME, alerts.CHROME(), nyiAlerts.CHROME());
- }
- else if (BrowserVersionClassRunner.isDefined(alerts.DEFAULT())
- && BrowserVersionClassRunner.isDefined(nyiAlerts.CHROME())) {
- assertNotEquals(BrowserVersion.CHROME, alerts.DEFAULT(), nyiAlerts.CHROME());
- }
-
- if (BrowserVersionClassRunner.isDefined(alerts.FF_ESR())
- && BrowserVersionClassRunner.isDefined(nyiAlerts.FF_ESR())) {
- assertNotEquals(BrowserVersion.FIREFOX_ESR, alerts.FF_ESR(), nyiAlerts.FF_ESR());
- }
- else if (BrowserVersionClassRunner.isDefined(alerts.DEFAULT())
- && BrowserVersionClassRunner.isDefined(nyiAlerts.FF_ESR())) {
- assertNotEquals(BrowserVersion.FIREFOX_ESR, alerts.DEFAULT(), nyiAlerts.FF_ESR());
- }
-
- if (BrowserVersionClassRunner.isDefined(alerts.FF())
- && BrowserVersionClassRunner.isDefined(nyiAlerts.FF())) {
- assertNotEquals(BrowserVersion.FIREFOX, alerts.FF(), nyiAlerts.FF());
- }
- else if (BrowserVersionClassRunner.isDefined(alerts.DEFAULT())
- && BrowserVersionClassRunner.isDefined(nyiAlerts.FF())) {
- assertNotEquals(BrowserVersion.FIREFOX, alerts.DEFAULT(), nyiAlerts.FF());
- }
-
- if (BrowserVersionClassRunner.isDefined(alerts.EDGE())
- && BrowserVersionClassRunner.isDefined(nyiAlerts.EDGE())) {
- assertNotEquals(BrowserVersion.EDGE, alerts.EDGE(), nyiAlerts.EDGE());
- }
- else if (BrowserVersionClassRunner.isDefined(alerts.DEFAULT())
- && BrowserVersionClassRunner.isDefined(nyiAlerts.EDGE())) {
- assertNotEquals(BrowserVersion.EDGE, alerts.DEFAULT(), nyiAlerts.EDGE());
- }
- }
- }
-
- final AlertsStandards alerts2 = method_.getAnnotation(AlertsStandards.class);
- if (alerts2 != null) {
- if (!BrowserVersionClassRunner.isDefined(alerts2.value())) {
- assertFalse("Obsolete DEFAULT because all browser expectations are defined individually",
- BrowserVersionClassRunner.isDefined(alerts2.DEFAULT())
- && BrowserVersionClassRunner.isDefined(alerts2.CHROME())
- && BrowserVersionClassRunner.isDefined(alerts2.FF())
- && BrowserVersionClassRunner.isDefined(alerts2.FF_ESR())
- && BrowserVersionClassRunner.isDefined(alerts2.EDGE()));
-
- assertNotEquals(BrowserVersion.EDGE, alerts2.EDGE(), alerts2.DEFAULT());
- assertNotEquals(BrowserVersion.CHROME, alerts2.CHROME(), alerts2.DEFAULT());
- assertNotEquals(BrowserVersion.FIREFOX, alerts2.FF(), alerts2.DEFAULT());
- assertNotEquals(BrowserVersion.FIREFOX_ESR, alerts2.FF_ESR(), alerts2.DEFAULT());
- }
- }
- }
-
- private void assertNotEquals(final BrowserVersion browser, final String[] value1, final String[] value2) {
- if (value1.length != 0 && !BrowserRunner.EMPTY_DEFAULT.equals(value1[0])
- && value1.length == value2.length
- && Arrays.asList(value1).toString().equals(Arrays.asList(value2).toString())) {
- throw new AssertionError("Redundant alert for " + browser.getNickname() + " in "
- + method_.getDeclaringClass().getSimpleName() + '.' + method_.getName() + "()");
- }
}
public void evaluateSolo() throws Throwable {
diff --git a/src/test/java/org/htmlunit/junit/BrowserVersionClassRunner.java b/src/test/java/org/htmlunit/junit/BrowserVersionClassRunner.java
index 9bcc207f300..3d5e35e32cd 100644
--- a/src/test/java/org/htmlunit/junit/BrowserVersionClassRunner.java
+++ b/src/test/java/org/htmlunit/junit/BrowserVersionClassRunner.java
@@ -26,14 +26,14 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.WebTestCase;
import org.htmlunit.annotations.StandardsMode;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.AlertsStandards;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
-import org.htmlunit.junit.BrowserRunner.OS;
-import org.htmlunit.junit.BrowserRunner.TestedBrowser;
-import org.htmlunit.junit.BrowserRunner.Tries;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.AlertsStandards;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.NotYetImplemented;
+import org.htmlunit.junit.annotation.OS;
+import org.htmlunit.junit.annotation.TestedBrowser;
+import org.htmlunit.junit.annotation.Tries;
import org.junit.Test;
import org.junit.internal.runners.model.ReflectiveCallable;
import org.junit.internal.runners.statements.Fail;
@@ -46,7 +46,7 @@
import org.junit.runners.model.TestClass;
/**
- * The runner for test methods that run with a specific browser ({@link BrowserRunner.TestedBrowser}).
+ * The runner for test methods that run with a specific browser ({@link TestedBrowser}).
*
* @author Ahmed Ashour
* @author Frank Danek
diff --git a/src/test/java/org/htmlunit/junit/RetryRule.java b/src/test/java/org/htmlunit/junit/RetryRule.java
index dc6016e0313..da141090662 100644
--- a/src/test/java/org/htmlunit/junit/RetryRule.java
+++ b/src/test/java/org/htmlunit/junit/RetryRule.java
@@ -16,6 +16,7 @@
import java.util.concurrent.atomic.AtomicInteger;
+import org.htmlunit.junit.annotation.Retry;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
diff --git a/src/test/java/org/htmlunit/junit/TestCaseCorrector.java b/src/test/java/org/htmlunit/junit/TestCaseCorrector.java
index 625bd2a85c5..7d0a838891d 100644
--- a/src/test/java/org/htmlunit/junit/TestCaseCorrector.java
+++ b/src/test/java/org/htmlunit/junit/TestCaseCorrector.java
@@ -37,7 +37,7 @@
/**
* This is meant to automatically correct the test case to put either the real browser expectations,
- * or the {@link org.htmlunit.junit.BrowserRunner.NotYetImplemented} annotation for HtmlUnit.
+ * or the {@link org.htmlunit.junit.annotation.NotYetImplemented} annotation for HtmlUnit.
*
* @author Ahmed Ashour
* @author Ronald Brill
diff --git a/src/test/java/org/htmlunit/junit/annotation/Alerts.java b/src/test/java/org/htmlunit/junit/annotation/Alerts.java
new file mode 100644
index 00000000000..83bc013c522
--- /dev/null
+++ b/src/test/java/org/htmlunit/junit/annotation/Alerts.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2002-2025 Gargoyle Software Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.htmlunit.junit.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.htmlunit.SimpleWebTestCase;
+import org.htmlunit.WebDriverTestCase;
+import org.htmlunit.junit.BrowserRunner;
+
+/**
+ * Allows to express the expected alerts (i.e. the messages passed to the
+ * window.alert function) for the different browsers for a unit test.
+ * Expected alerts can be retrieved within a unit test with {@link SimpleWebTestCase#getExpectedAlerts()}
+ * (resp. {@link WebDriverTestCase#getExpectedAlerts}) to be compared with the actual alerts but most of the time
+ * utility functions like {@link SimpleWebTestCase#loadPageWithAlerts(String)}
+ * (resp. {@link WebDriverTestCase#loadPageWithAlerts2(String)}) are used which do it
+ * after having loaded the page.
+ *
+ * @author Ahmed Ashour
+ * @author Frank Danek
+ * @author Ronald Brill
+ * @author cd alexndr
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface Alerts {
+
+ /**
+ * Alerts that is used for all browsers (if defined, the other values are ignored).
+ * @return the alerts
+ */
+ String[] value() default { BrowserRunner.EMPTY_DEFAULT };
+
+ /**
+ * Alerts for latest Edge.
+ * @return the alerts
+ */
+ String[] EDGE() default { BrowserRunner.EMPTY_DEFAULT };
+
+ /**
+ * Alerts for latest Firefox.
+ * @return the alerts
+ */
+ String[] FF() default { BrowserRunner.EMPTY_DEFAULT };
+
+ /**
+ * Alerts for Firefox ESR.
+ * @return the alerts
+ */
+ String[] FF_ESR() default { BrowserRunner.EMPTY_DEFAULT };
+
+ /**
+ * Alerts for latest Chrome.
+ * @return the alerts
+ */
+ String[] CHROME() default { BrowserRunner.EMPTY_DEFAULT };
+
+ /**
+ * The default alerts, if nothing more specific is defined.
+ * @return the alerts
+ */
+ String[] DEFAULT() default { BrowserRunner.EMPTY_DEFAULT };
+}
diff --git a/src/test/java/org/htmlunit/junit/annotation/AlertsStandards.java b/src/test/java/org/htmlunit/junit/annotation/AlertsStandards.java
new file mode 100644
index 00000000000..857f09bcb27
--- /dev/null
+++ b/src/test/java/org/htmlunit/junit/annotation/AlertsStandards.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2002-2025 Gargoyle Software Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.htmlunit.junit.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.htmlunit.annotations.StandardsMode;
+import org.htmlunit.junit.BrowserRunner;
+
+/**
+ * Same as {@link Alerts} but only in {@code Standards Mode}.
+ *
+ * It is typically used with {@link StandardsMode}.
+ *
+ * @author Ahmed Ashour
+ * @author Frank Danek
+ * @author Ronald Brill
+ * @author cd alexndr
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface AlertsStandards {
+
+ /**
+ * Alerts that is used for all browsers (if defined, the other values are ignored).
+ * @return the alerts
+ */
+ String[] value() default { BrowserRunner.EMPTY_DEFAULT };
+
+ /**
+ * Alerts for latest Edge.
+ * @return the alerts
+ */
+ String[] EDGE() default { BrowserRunner.EMPTY_DEFAULT };
+
+ /**
+ * Alerts for latest Firefox.
+ * @return the alerts
+ */
+ String[] FF() default { BrowserRunner.EMPTY_DEFAULT };
+
+ /**
+ * Alerts for Firefox ESR.
+ * @return the alerts
+ */
+ String[] FF_ESR() default { BrowserRunner.EMPTY_DEFAULT };
+
+ /**
+ * Alerts for latest Chrome.
+ * @return the alerts
+ */
+ String[] CHROME() default { BrowserRunner.EMPTY_DEFAULT };
+
+ /**
+ * The default alerts, if nothing more specific is defined.
+ * @return the alerts
+ */
+ String[] DEFAULT() default { BrowserRunner.EMPTY_DEFAULT };
+}
diff --git a/src/test/java/org/htmlunit/junit/annotation/AnnotationUtils.java b/src/test/java/org/htmlunit/junit/annotation/AnnotationUtils.java
new file mode 100644
index 00000000000..827a6bb7b17
--- /dev/null
+++ b/src/test/java/org/htmlunit/junit/annotation/AnnotationUtils.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (c) 2002-2025 Gargoyle Software Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.htmlunit.junit.annotation;
+
+import static org.junit.Assert.assertFalse;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+
+import org.htmlunit.BrowserVersion;
+import org.htmlunit.junit.BrowserRunner;
+import org.htmlunit.junit.BrowserVersionClassRunner;
+
+/**
+ * Utility functions for working with our annotations.
+ *
+ * @author Ahmed Ashour
+ * @author Ronald Brill
+ */
+public final class AnnotationUtils {
+
+ /**
+ * Disallow instantiation of this class.
+ */
+ private AnnotationUtils() {
+ // Empty.
+ }
+
+ /**
+ * Helper to validate defined annotations for various errors.
+ *
+ * @param method the method to validate
+ */
+ public static void assertAlerts(final Method method) {
+ final Alerts alerts = method.getAnnotation(Alerts.class);
+ if (alerts != null) {
+ if (!BrowserVersionClassRunner.isDefined(alerts.value())) {
+ assertFalse("Obsolete DEFAULT because all browser expectations defined individually",
+ BrowserVersionClassRunner.isDefined(alerts.DEFAULT())
+ && BrowserVersionClassRunner.isDefined(alerts.CHROME())
+ && BrowserVersionClassRunner.isDefined(alerts.FF())
+ && BrowserVersionClassRunner.isDefined(alerts.FF_ESR())
+ && BrowserVersionClassRunner.isDefined(alerts.EDGE()));
+
+ assertNotEquals("@Alerts", method, BrowserVersion.CHROME, alerts.CHROME(), alerts.DEFAULT());
+ assertNotEquals("@Alerts", method, BrowserVersion.FIREFOX, alerts.FF(), alerts.DEFAULT());
+ assertNotEquals("@Alerts", method, BrowserVersion.FIREFOX_ESR, alerts.FF_ESR(), alerts.DEFAULT());
+ assertNotEquals("@Alerts", method, BrowserVersion.EDGE, alerts.EDGE(), alerts.DEFAULT());
+ }
+
+ final HtmlUnitNYI nyiAlerts = method.getAnnotation(HtmlUnitNYI.class);
+ if (nyiAlerts != null) {
+ if (BrowserVersionClassRunner.isDefined(nyiAlerts.value())) {
+ if (BrowserVersionClassRunner.isDefined(alerts.CHROME())) {
+ assertNotEquals("@HtmlUnitNYI",
+ method, null, alerts.CHROME(), nyiAlerts.value());
+ }
+ else if (BrowserVersionClassRunner.isDefined(alerts.DEFAULT())) {
+ assertNotEquals("@HtmlUnitNYI",
+ method, null, alerts.DEFAULT(), nyiAlerts.value());
+ }
+ else if (BrowserVersionClassRunner.isDefined(alerts.value())) {
+ assertNotEquals("@HtmlUnitNYI",
+ method, null, alerts.value(), nyiAlerts.value());
+ }
+ }
+
+ if (BrowserVersionClassRunner.isDefined(nyiAlerts.CHROME())) {
+ if (BrowserVersionClassRunner.isDefined(alerts.CHROME())) {
+ assertNotEquals("@HtmlUnitNYI",
+ method, BrowserVersion.CHROME, alerts.CHROME(), nyiAlerts.CHROME());
+ }
+ else if (BrowserVersionClassRunner.isDefined(alerts.DEFAULT())) {
+ assertNotEquals("@HtmlUnitNYI",
+ method, BrowserVersion.CHROME, alerts.DEFAULT(), nyiAlerts.CHROME());
+ }
+ else if (BrowserVersionClassRunner.isDefined(alerts.value())) {
+ assertNotEquals("@HtmlUnitNYI",
+ method, BrowserVersion.CHROME, alerts.value(), nyiAlerts.CHROME());
+ }
+ }
+
+ if (BrowserVersionClassRunner.isDefined(nyiAlerts.FF_ESR())) {
+ if (BrowserVersionClassRunner.isDefined(alerts.FF_ESR())) {
+ assertNotEquals("@HtmlUnitNYI",
+ method, BrowserVersion.FIREFOX_ESR, alerts.FF_ESR(), nyiAlerts.FF_ESR());
+ }
+ else if (BrowserVersionClassRunner.isDefined(alerts.DEFAULT())) {
+ assertNotEquals("@HtmlUnitNYI",
+ method, BrowserVersion.FIREFOX_ESR, alerts.DEFAULT(), nyiAlerts.FF_ESR());
+ }
+ else if (BrowserVersionClassRunner.isDefined(alerts.value())) {
+ assertNotEquals("@HtmlUnitNYI",
+ method, BrowserVersion.FIREFOX_ESR, alerts.value(), nyiAlerts.FF_ESR());
+ }
+ }
+
+ if (BrowserVersionClassRunner.isDefined(nyiAlerts.FF())) {
+ if (BrowserVersionClassRunner.isDefined(alerts.FF())) {
+ assertNotEquals("@HtmlUnitNYI",
+ method, BrowserVersion.FIREFOX, alerts.FF(), nyiAlerts.FF());
+ }
+ else if (BrowserVersionClassRunner.isDefined(alerts.DEFAULT())) {
+ assertNotEquals("@HtmlUnitNYI",
+ method, BrowserVersion.FIREFOX, alerts.DEFAULT(), nyiAlerts.FF());
+ }
+ else if (BrowserVersionClassRunner.isDefined(alerts.value())) {
+ assertNotEquals("@HtmlUnitNYI",
+ method, BrowserVersion.FIREFOX, alerts.value(), nyiAlerts.FF());
+ }
+ }
+
+ if (BrowserVersionClassRunner.isDefined(nyiAlerts.EDGE())) {
+ if (BrowserVersionClassRunner.isDefined(alerts.EDGE())) {
+ assertNotEquals("@HtmlUnitNYI",
+ method, BrowserVersion.EDGE, alerts.EDGE(), nyiAlerts.EDGE());
+ }
+ else if (BrowserVersionClassRunner.isDefined(alerts.DEFAULT())) {
+ assertNotEquals("@HtmlUnitNYI",
+ method, BrowserVersion.EDGE, alerts.DEFAULT(), nyiAlerts.EDGE());
+ }
+ else if (BrowserVersionClassRunner.isDefined(alerts.value())) {
+ assertNotEquals("@HtmlUnitNYI",
+ method, BrowserVersion.EDGE, alerts.value(), nyiAlerts.EDGE());
+ }
+ }
+ }
+ }
+
+ final AlertsStandards alerts2 = method.getAnnotation(AlertsStandards.class);
+ if (alerts2 != null) {
+ if (!BrowserVersionClassRunner.isDefined(alerts2.value())) {
+ assertFalse("Obsolete DEFAULT because all browser expectations are defined individually",
+ BrowserVersionClassRunner.isDefined(alerts2.DEFAULT())
+ && BrowserVersionClassRunner.isDefined(alerts2.CHROME())
+ && BrowserVersionClassRunner.isDefined(alerts2.FF())
+ && BrowserVersionClassRunner.isDefined(alerts2.FF_ESR())
+ && BrowserVersionClassRunner.isDefined(alerts2.EDGE()));
+
+ assertNotEquals("@AlertsStandards", method, BrowserVersion.EDGE, alerts2.EDGE(), alerts2.DEFAULT());
+ assertNotEquals("@AlertsStandards", method, BrowserVersion.CHROME, alerts2.CHROME(), alerts2.DEFAULT());
+ assertNotEquals("@AlertsStandards", method, BrowserVersion.FIREFOX, alerts2.FF(), alerts2.DEFAULT());
+ assertNotEquals("@AlertsStandards",
+ method, BrowserVersion.FIREFOX_ESR, alerts2.FF_ESR(), alerts2.DEFAULT());
+ }
+ }
+ }
+
+ private static void assertNotEquals(final String annotation, final Method method, final BrowserVersion browser,
+ final String[] value1, final String[] value2) {
+ if (value1.length != 0 && !BrowserRunner.EMPTY_DEFAULT.equals(value1[0])
+ && value1.length == value2.length
+ && Arrays.asList(value1).toString().equals(Arrays.asList(value2).toString())) {
+ final String nickname = browser == null ? "DEFAULT" : browser.getNickname();
+ throw new AssertionError("Redundant " + annotation + " for " + nickname + " in "
+ + method.getDeclaringClass().getSimpleName() + '.' + method.getName() + "()");
+ }
+ }
+}
diff --git a/src/test/java/org/htmlunit/junit/annotation/AnnotationUtilsTest.java b/src/test/java/org/htmlunit/junit/annotation/AnnotationUtilsTest.java
new file mode 100644
index 00000000000..ea80f959c02
--- /dev/null
+++ b/src/test/java/org/htmlunit/junit/annotation/AnnotationUtilsTest.java
@@ -0,0 +1,245 @@
+/*
+ * Copyright (c) 2002-2025 Gargoyle Software Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.htmlunit.junit.annotation;
+
+import java.lang.reflect.Method;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Tests for {@link AnnotationUtils}.
+ *
+ * @author Ronald Brill
+ */
+public class AnnotationUtilsTest {
+
+ @Test
+ @Alerts(DEFAULT = "default",
+ CHROME = "chrome",
+ EDGE = "edge",
+ FF = "ff",
+ FF_ESR = "ff esr")
+ /**
+ * @throws Exception if something goes wrong
+ */
+ public void obsoleteDefaultBecauseAllBrowserExpectationsDefinedIndividually() throws Exception {
+ testFail("Obsolete DEFAULT because all browser expectations defined individually",
+ "obsoleteDefaultBecauseAllBrowserExpectationsDefinedIndividually");
+ }
+
+ @Test
+ @Alerts(DEFAULT = "redundant",
+ CHROME = "redundant")
+ /**
+ * @throws Exception if something goes wrong
+ */
+ public void redundantAlertChrome() throws Exception {
+ testFail("Redundant @Alerts for Chrome in AnnotationUtilsTest.redundantAlertChrome()",
+ "redundantAlertChrome");
+ }
+
+ @Test
+ @Alerts(DEFAULT = "redundant",
+ EDGE = "redundant")
+ /**
+ * @throws Exception if something goes wrong
+ */
+ public void redundantAlertEdge() throws Exception {
+ testFail("Redundant @Alerts for Edge in AnnotationUtilsTest.redundantAlertEdge()",
+ "redundantAlertEdge");
+ }
+
+ @Test
+ @Alerts(DEFAULT = "redundant",
+ FF = "redundant")
+ /**
+ * @throws Exception if something goes wrong
+ */
+ public void redundantAlertFf() throws Exception {
+ testFail("Redundant @Alerts for FF in AnnotationUtilsTest.redundantAlertFf()",
+ "redundantAlertFf");
+ }
+
+ @Test
+ @Alerts(DEFAULT = "redundant",
+ FF_ESR = "redundant")
+ /**
+ * @throws Exception if something goes wrong
+ */
+ public void redundantAlertFfEsr() throws Exception {
+ testFail("Redundant @Alerts for FF-ESR in AnnotationUtilsTest.redundantAlertFfEsr()",
+ "redundantAlertFfEsr");
+ }
+
+ @Test
+ @Alerts("redundant")
+ @HtmlUnitNYI("redundant")
+ /**
+ * @throws Exception if something goes wrong
+ */
+ public void redundantHtmlUnitNYI() throws Exception {
+ testFail("Redundant @HtmlUnitNYI for DEFAULT in AnnotationUtilsTest.redundantHtmlUnitNYI()",
+ "redundantHtmlUnitNYI");
+ }
+
+ @Test
+ @Alerts("redundant")
+ @HtmlUnitNYI(CHROME = "redundant")
+ /**
+ * @throws Exception if something goes wrong
+ */
+ public void redundantHtmlUnitNYIChrome() throws Exception {
+ testFail("Redundant @HtmlUnitNYI for Chrome in AnnotationUtilsTest.redundantHtmlUnitNYIChrome()",
+ "redundantHtmlUnitNYIChrome");
+ }
+
+ @Test
+ @Alerts("redundant")
+ @HtmlUnitNYI(EDGE = "redundant")
+ /**
+ * @throws Exception if something goes wrong
+ */
+ public void redundantHtmlUnitNYIEdge() throws Exception {
+ testFail("Redundant @HtmlUnitNYI for Edge in AnnotationUtilsTest.redundantHtmlUnitNYIEdge()",
+ "redundantHtmlUnitNYIEdge");
+ }
+
+ @Test
+ @Alerts("redundant")
+ @HtmlUnitNYI(FF = "redundant")
+ /**
+ * @throws Exception if something goes wrong
+ */
+ public void redundantHtmlUnitNYIFf() throws Exception {
+ testFail("Redundant @HtmlUnitNYI for FF in AnnotationUtilsTest.redundantHtmlUnitNYIFf()",
+ "redundantHtmlUnitNYIFf");
+ }
+
+ @Test
+ @Alerts("redundant")
+ @HtmlUnitNYI(FF_ESR = "redundant")
+ /**
+ * @throws Exception if something goes wrong
+ */
+ public void redundantHtmlUnitNYIFfEsr() throws Exception {
+ testFail("Redundant @HtmlUnitNYI for FF-ESR in AnnotationUtilsTest.redundantHtmlUnitNYIFfEsr()",
+ "redundantHtmlUnitNYIFfEsr");
+ }
+
+ @Test
+ @Alerts(DEFAULT = "",
+ CHROME = "redundant")
+ @HtmlUnitNYI(CHROME = "redundant")
+ /**
+ * @throws Exception if something goes wrong
+ */
+ public void redundantChromeHtmlUnitNYIChrome() throws Exception {
+ testFail("Redundant @HtmlUnitNYI for Chrome in AnnotationUtilsTest.redundantChromeHtmlUnitNYIChrome()",
+ "redundantChromeHtmlUnitNYIChrome");
+ }
+
+ @Test
+ @Alerts(DEFAULT = "",
+ EDGE = "redundant")
+ @HtmlUnitNYI(EDGE = "redundant")
+ /**
+ * @throws Exception if something goes wrong
+ */
+ public void redundantEdgeHtmlUnitNYIEdge() throws Exception {
+ testFail("Redundant @HtmlUnitNYI for Edge in AnnotationUtilsTest.redundantEdgeHtmlUnitNYIEdge()",
+ "redundantEdgeHtmlUnitNYIEdge");
+ }
+
+ @Test
+ @Alerts(DEFAULT = "",
+ FF = "redundant")
+ @HtmlUnitNYI(FF = "redundant")
+ /**
+ * @throws Exception if something goes wrong
+ */
+ public void redundantFfHtmlUnitNYIFf() throws Exception {
+ testFail("Redundant @HtmlUnitNYI for FF in AnnotationUtilsTest.redundantFfHtmlUnitNYIFf()",
+ "redundantFfHtmlUnitNYIFf");
+ }
+
+ @Test
+ @Alerts(DEFAULT = "",
+ FF_ESR = "redundant")
+ @HtmlUnitNYI(FF_ESR = "redundant")
+ /**
+ * @throws Exception if something goes wrong
+ */
+ public void redundantFfEsrHtmlUnitNYIFfEsr() throws Exception {
+ testFail("Redundant @HtmlUnitNYI for FF-ESR in AnnotationUtilsTest.redundantFfEsrHtmlUnitNYIFfEsr()",
+ "redundantFfEsrHtmlUnitNYIFfEsr");
+ }
+
+ @Test
+ @Alerts(CHROME = "redundant")
+ @HtmlUnitNYI(CHROME = "redundant")
+ /**
+ * @throws Exception if something goes wrong
+ */
+ public void redundantChrome2HtmlUnitNYIChrome() throws Exception {
+ testFail("Redundant @HtmlUnitNYI for Chrome in AnnotationUtilsTest.redundantChrome2HtmlUnitNYIChrome()",
+ "redundantChrome2HtmlUnitNYIChrome");
+ }
+
+ @Test
+ @Alerts(EDGE = "redundant")
+ @HtmlUnitNYI(EDGE = "redundant")
+ /**
+ * @throws Exception if something goes wrong
+ */
+ public void redundantEdge2HtmlUnitNYIEdge() throws Exception {
+ testFail("Redundant @HtmlUnitNYI for Edge in AnnotationUtilsTest.redundantEdge2HtmlUnitNYIEdge()",
+ "redundantEdge2HtmlUnitNYIEdge");
+ }
+
+ @Test
+ @Alerts(FF = "redundant")
+ @HtmlUnitNYI(FF = "redundant")
+ /**
+ * @throws Exception if something goes wrong
+ */
+ public void redundantFf2HtmlUnitNYIFf() throws Exception {
+ testFail("Redundant @HtmlUnitNYI for FF in AnnotationUtilsTest.redundantFf2HtmlUnitNYIFf()",
+ "redundantFf2HtmlUnitNYIFf");
+ }
+
+ @Test
+ @Alerts(FF_ESR = "redundant")
+ @HtmlUnitNYI(FF_ESR = "redundant")
+ /**
+ * @throws Exception if something goes wrong
+ */
+ public void redundantFfEsr2HtmlUnitNYIFfEsr() throws Exception {
+ testFail("Redundant @HtmlUnitNYI for FF-ESR in AnnotationUtilsTest.redundantFfEsr2HtmlUnitNYIFfEsr()",
+ "redundantFfEsr2HtmlUnitNYIFfEsr");
+ }
+
+ private void testFail(final String expectedMsg, final String methodName) throws Exception {
+ final Method method = getClass().getMethod(methodName, (Class[]) null);
+
+ try {
+ AnnotationUtils.assertAlerts(method);
+ Assert.fail("AssertionError expected");
+ }
+ catch (final AssertionError e) {
+ Assert.assertEquals(expectedMsg, e.getMessage());
+ }
+ }
+}
diff --git a/src/test/java/org/htmlunit/junit/annotation/BuggyWebDriver.java b/src/test/java/org/htmlunit/junit/annotation/BuggyWebDriver.java
new file mode 100644
index 00000000000..909e07a65f7
--- /dev/null
+++ b/src/test/java/org/htmlunit/junit/annotation/BuggyWebDriver.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2002-2025 Gargoyle Software Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.htmlunit.junit.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.htmlunit.junit.BrowserRunner;
+
+/**
+ * Indicates that the test runs manually in a real browser but not when using WebDriver to drive the browser.
+ * @see TestedBrowser
+ *
+ * @author Ahmed Ashour
+ * @author Frank Danek
+ * @author Ronald Brill
+ * @author cd alexndr
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface BuggyWebDriver {
+ /**
+ * Alerts that is used for all browsers (if defined, the other values are ignored).
+ * @return the alerts
+ */
+ String[] value() default { BrowserRunner.EMPTY_DEFAULT };
+
+ /**
+ * Alerts for latest Edge.
+ * @return the alerts
+ */
+ String[] EDGE() default { BrowserRunner.EMPTY_DEFAULT };
+
+ /**
+ * Alerts for latest Firefox.
+ * @return the alerts
+ */
+ String[] FF() default { BrowserRunner.EMPTY_DEFAULT };
+
+ /**
+ * Alerts for Firefox ESR.
+ * @return the alerts
+ */
+ String[] FF_ESR() default { BrowserRunner.EMPTY_DEFAULT };
+
+ /**
+ * Alerts for latest Chrome.
+ * @return the alerts
+ */
+ String[] CHROME() default { BrowserRunner.EMPTY_DEFAULT };
+
+ /**
+ * The default alerts, if nothing more specific is defined.
+ * @return the alerts
+ */
+ String[] DEFAULT() default { BrowserRunner.EMPTY_DEFAULT };
+}
diff --git a/src/test/java/org/htmlunit/junit/annotation/HtmlUnitNYI.java b/src/test/java/org/htmlunit/junit/annotation/HtmlUnitNYI.java
new file mode 100644
index 00000000000..d845c4bed21
--- /dev/null
+++ b/src/test/java/org/htmlunit/junit/annotation/HtmlUnitNYI.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2002-2025 Gargoyle Software Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.htmlunit.junit.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.htmlunit.junit.BrowserRunner;
+
+/**
+ * Indicates that the test produces different result when running with HtmlUnit.
+ * @see TestedBrowser
+ *
+ * @author Ahmed Ashour
+ * @author Frank Danek
+ * @author Ronald Brill
+ * @author cd alexndr
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface HtmlUnitNYI {
+ /**
+ * Alerts that is used for all browsers (if defined, the other values are ignored).
+ * @return the alerts
+ */
+ String[] value() default { BrowserRunner.EMPTY_DEFAULT };
+
+ /**
+ * Alerts for latest Edge.
+ * @return the alerts
+ */
+ String[] EDGE() default { BrowserRunner.EMPTY_DEFAULT };
+
+ /**
+ * Alerts for latest Firefox.
+ * @return the alerts
+ */
+ String[] FF() default { BrowserRunner.EMPTY_DEFAULT };
+
+ /**
+ * Alerts for Firefox ESR.
+ * @return the alerts
+ */
+ String[] FF_ESR() default { BrowserRunner.EMPTY_DEFAULT };
+
+ /**
+ * Alerts for latest Chrome.
+ * @return the alerts
+ */
+ String[] CHROME() default { BrowserRunner.EMPTY_DEFAULT };
+}
diff --git a/src/test/java/org/htmlunit/junit/annotation/NotYetImplemented.java b/src/test/java/org/htmlunit/junit/annotation/NotYetImplemented.java
new file mode 100644
index 00000000000..17dd61c2ce7
--- /dev/null
+++ b/src/test/java/org/htmlunit/junit/annotation/NotYetImplemented.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2002-2025 Gargoyle Software Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.htmlunit.junit.annotation;
+
+import static org.htmlunit.junit.annotation.TestedBrowser.CHROME;
+import static org.htmlunit.junit.annotation.TestedBrowser.EDGE;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF_ESR;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Marks a test as not yet working for a particular browser (default value is all).
+ * This will cause a failure to be considered as success and a success as failure forcing
+ * us to remove this annotation when a feature has been implemented even unintentionally.
+ * @see TestedBrowser
+ *
+ * @author Ahmed Ashour
+ * @author Frank Danek
+ * @author Ronald Brill
+ * @author cd alexndr
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface NotYetImplemented {
+
+ /**
+ * The browsers with which the case is not yet implemented.
+ * @return the browsers
+ */
+ TestedBrowser[] value() default {
+ EDGE, FF_ESR, FF, CHROME
+ };
+
+ /**
+ * The operating systems with which the case is not yet implemented.
+ * @return the operating systems
+ */
+ OS[] os() default {};
+}
diff --git a/src/test/java/org/htmlunit/junit/annotation/OS.java b/src/test/java/org/htmlunit/junit/annotation/OS.java
new file mode 100644
index 00000000000..a5cd4f0f3cc
--- /dev/null
+++ b/src/test/java/org/htmlunit/junit/annotation/OS.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2002-2025 Gargoyle Software Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.htmlunit.junit.annotation;
+
+/**
+ * Marks the os.
+ *
+ * @author Ahmed Ashour
+ * @author Frank Danek
+ * @author Ronald Brill
+ * @author cd alexndr
+ */
+public enum OS {
+ /** Linux. */
+ Linux,
+
+ /** Windows. */
+ Windows
+}
diff --git a/src/test/java/org/htmlunit/junit/Retry.java b/src/test/java/org/htmlunit/junit/annotation/Retry.java
similarity index 95%
rename from src/test/java/org/htmlunit/junit/Retry.java
rename to src/test/java/org/htmlunit/junit/annotation/Retry.java
index 541b88c99c6..06fe8b0a732 100644
--- a/src/test/java/org/htmlunit/junit/Retry.java
+++ b/src/test/java/org/htmlunit/junit/annotation/Retry.java
@@ -12,7 +12,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.htmlunit.junit;
+package org.htmlunit.junit.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
diff --git a/src/test/java/org/htmlunit/junit/annotation/TestedBrowser.java b/src/test/java/org/htmlunit/junit/annotation/TestedBrowser.java
new file mode 100644
index 00000000000..8d563570f6a
--- /dev/null
+++ b/src/test/java/org/htmlunit/junit/annotation/TestedBrowser.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2002-2025 Gargoyle Software Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.htmlunit.junit.annotation;
+
+/**
+ * Browser under test.
+ *
+ * @author Ahmed Ashour
+ * @author Frank Danek
+ * @author Ronald Brill
+ * @author cd alexndr
+ */
+public enum TestedBrowser {
+ /** Latest version of Chrome. */
+ CHROME,
+
+ /** Edge. */
+ EDGE,
+
+ /** Firefox. */
+ FF,
+
+ /** Firefox ESR. */
+ FF_ESR
+}
diff --git a/src/test/java/org/htmlunit/junit/annotation/Tries.java b/src/test/java/org/htmlunit/junit/annotation/Tries.java
new file mode 100644
index 00000000000..8b138b6438a
--- /dev/null
+++ b/src/test/java/org/htmlunit/junit/annotation/Tries.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2002-2025 Gargoyle Software Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.htmlunit.junit.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * The number of tries that test will be executed.
+ * The test will fail if and only if all trials failed.
+ *
+ * @author Ahmed Ashour
+ * @author Frank Danek
+ * @author Ronald Brill
+ * @author cd alexndr
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface Tries {
+
+ /**
+ * The value.
+ * @return the value
+ */
+ int value() default 1;
+}
diff --git a/src/test/java/org/htmlunit/libraries/BirdTest.java b/src/test/java/org/htmlunit/libraries/BirdTest.java
index 28b53c8a889..d1ebf0a5fb7 100644
--- a/src/test/java/org/htmlunit/libraries/BirdTest.java
+++ b/src/test/java/org/htmlunit/libraries/BirdTest.java
@@ -20,7 +20,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.WebServerTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/libraries/ExtJS22Test.java b/src/test/java/org/htmlunit/libraries/ExtJS22Test.java
index 1a779412574..05389ca6b1d 100644
--- a/src/test/java/org/htmlunit/libraries/ExtJS22Test.java
+++ b/src/test/java/org/htmlunit/libraries/ExtJS22Test.java
@@ -20,7 +20,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.WebServerTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/libraries/HtmxTest1x7x0.java b/src/test/java/org/htmlunit/libraries/HtmxTest1x7x0.java
index 160ff46a8dc..3d64f8f9014 100644
--- a/src/test/java/org/htmlunit/libraries/HtmxTest1x7x0.java
+++ b/src/test/java/org/htmlunit/libraries/HtmxTest1x7x0.java
@@ -15,8 +15,8 @@
package org.htmlunit.libraries;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/libraries/HtmxTest1x8x4.java b/src/test/java/org/htmlunit/libraries/HtmxTest1x8x4.java
index 027a95c1e71..07ec02128a7 100644
--- a/src/test/java/org/htmlunit/libraries/HtmxTest1x8x4.java
+++ b/src/test/java/org/htmlunit/libraries/HtmxTest1x8x4.java
@@ -15,8 +15,8 @@
package org.htmlunit.libraries;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/libraries/HtmxTest1x9x10.java b/src/test/java/org/htmlunit/libraries/HtmxTest1x9x10.java
index 3aa464f782d..c7d06fbf25c 100644
--- a/src/test/java/org/htmlunit/libraries/HtmxTest1x9x10.java
+++ b/src/test/java/org/htmlunit/libraries/HtmxTest1x9x10.java
@@ -16,8 +16,8 @@
import org.htmlunit.WebClient;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/libraries/HtmxTest1x9x12.java b/src/test/java/org/htmlunit/libraries/HtmxTest1x9x12.java
index a932bc90edb..41d7a9eccaf 100644
--- a/src/test/java/org/htmlunit/libraries/HtmxTest1x9x12.java
+++ b/src/test/java/org/htmlunit/libraries/HtmxTest1x9x12.java
@@ -15,8 +15,8 @@
package org.htmlunit.libraries;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/libraries/HtmxTest1x9x2.java b/src/test/java/org/htmlunit/libraries/HtmxTest1x9x2.java
index e94d9cdc578..ce1accdc544 100644
--- a/src/test/java/org/htmlunit/libraries/HtmxTest1x9x2.java
+++ b/src/test/java/org/htmlunit/libraries/HtmxTest1x9x2.java
@@ -15,8 +15,8 @@
package org.htmlunit.libraries;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.BuggyWebDriver;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.BuggyWebDriver;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/libraries/HtmxTest2x0x0.java b/src/test/java/org/htmlunit/libraries/HtmxTest2x0x0.java
index d27a2f68350..471e8590643 100644
--- a/src/test/java/org/htmlunit/libraries/HtmxTest2x0x0.java
+++ b/src/test/java/org/htmlunit/libraries/HtmxTest2x0x0.java
@@ -15,8 +15,8 @@
package org.htmlunit.libraries;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/libraries/HtmxTest2x0x2.java b/src/test/java/org/htmlunit/libraries/HtmxTest2x0x2.java
index 8919ff025b7..1540c020700 100644
--- a/src/test/java/org/htmlunit/libraries/HtmxTest2x0x2.java
+++ b/src/test/java/org/htmlunit/libraries/HtmxTest2x0x2.java
@@ -15,8 +15,8 @@
package org.htmlunit.libraries;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/libraries/JQuery1x11x3Test.java b/src/test/java/org/htmlunit/libraries/JQuery1x11x3Test.java
index 70806e47617..0c3ea69bd61 100644
--- a/src/test/java/org/htmlunit/libraries/JQuery1x11x3Test.java
+++ b/src/test/java/org/htmlunit/libraries/JQuery1x11x3Test.java
@@ -14,12 +14,12 @@
*/
package org.htmlunit.libraries;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.CHROME;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.EDGE;
+import static org.htmlunit.junit.annotation.TestedBrowser.CHROME;
+import static org.htmlunit.junit.annotation.TestedBrowser.EDGE;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/libraries/JQuery1x8x2Test.java b/src/test/java/org/htmlunit/libraries/JQuery1x8x2Test.java
index 73be8e352f5..28ace3a2892 100644
--- a/src/test/java/org/htmlunit/libraries/JQuery1x8x2Test.java
+++ b/src/test/java/org/htmlunit/libraries/JQuery1x8x2Test.java
@@ -14,12 +14,12 @@
*/
package org.htmlunit.libraries;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.CHROME;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.EDGE;
+import static org.htmlunit.junit.annotation.TestedBrowser.CHROME;
+import static org.htmlunit.junit.annotation.TestedBrowser.EDGE;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/libraries/JQuery3x3x1Test.java b/src/test/java/org/htmlunit/libraries/JQuery3x3x1Test.java
index adfdecd3239..a9c481c91d5 100644
--- a/src/test/java/org/htmlunit/libraries/JQuery3x3x1Test.java
+++ b/src/test/java/org/htmlunit/libraries/JQuery3x3x1Test.java
@@ -14,14 +14,14 @@
*/
package org.htmlunit.libraries;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.CHROME;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.EDGE;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF;
-import static org.htmlunit.junit.BrowserRunner.TestedBrowser.FF_ESR;
+import static org.htmlunit.junit.annotation.TestedBrowser.CHROME;
+import static org.htmlunit.junit.annotation.TestedBrowser.EDGE;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF;
+import static org.htmlunit.junit.annotation.TestedBrowser.FF_ESR;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/libraries/JQueryUsage3x7x1Test.java b/src/test/java/org/htmlunit/libraries/JQueryUsage3x7x1Test.java
index 085ed7620ce..5cb20e71cf5 100644
--- a/src/test/java/org/htmlunit/libraries/JQueryUsage3x7x1Test.java
+++ b/src/test/java/org/htmlunit/libraries/JQueryUsage3x7x1Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebClient;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/libraries/LibraryDependencyTest.java b/src/test/java/org/htmlunit/libraries/LibraryDependencyTest.java
index 42f78a90418..e5ec31ccb07 100644
--- a/src/test/java/org/htmlunit/libraries/LibraryDependencyTest.java
+++ b/src/test/java/org/htmlunit/libraries/LibraryDependencyTest.java
@@ -23,7 +23,7 @@
import org.htmlunit.MockWebConnection;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/libraries/MooTools121Test.java b/src/test/java/org/htmlunit/libraries/MooTools121Test.java
index 9f43bccaa9c..9bdfcf8104f 100644
--- a/src/test/java/org/htmlunit/libraries/MooTools121Test.java
+++ b/src/test/java/org/htmlunit/libraries/MooTools121Test.java
@@ -23,7 +23,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.WebServerTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/libraries/MyFacesTest.java b/src/test/java/org/htmlunit/libraries/MyFacesTest.java
index 59bc1aa99ee..fb53bec4087 100644
--- a/src/test/java/org/htmlunit/libraries/MyFacesTest.java
+++ b/src/test/java/org/htmlunit/libraries/MyFacesTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.WebServerTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/libraries/PolymerWebComponentsTest.java b/src/test/java/org/htmlunit/libraries/PolymerWebComponentsTest.java
index bc16ac4271a..8a2e465cd41 100644
--- a/src/test/java/org/htmlunit/libraries/PolymerWebComponentsTest.java
+++ b/src/test/java/org/htmlunit/libraries/PolymerWebComponentsTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/libraries/Prototype150rc1Test.java b/src/test/java/org/htmlunit/libraries/Prototype150rc1Test.java
index c1ce429112f..4062a636d2a 100644
--- a/src/test/java/org/htmlunit/libraries/Prototype150rc1Test.java
+++ b/src/test/java/org/htmlunit/libraries/Prototype150rc1Test.java
@@ -18,7 +18,7 @@
import org.htmlunit.WebServerTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/libraries/Prototype160Test.java b/src/test/java/org/htmlunit/libraries/Prototype160Test.java
index 94075dd0ed2..e4341c104b1 100644
--- a/src/test/java/org/htmlunit/libraries/Prototype160Test.java
+++ b/src/test/java/org/htmlunit/libraries/Prototype160Test.java
@@ -18,7 +18,7 @@
import org.htmlunit.WebServerTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/libraries/Prototype161Test.java b/src/test/java/org/htmlunit/libraries/Prototype161Test.java
index 0b66f023868..73596325d14 100644
--- a/src/test/java/org/htmlunit/libraries/Prototype161Test.java
+++ b/src/test/java/org/htmlunit/libraries/Prototype161Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebServerTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/libraries/Prototype171Test.java b/src/test/java/org/htmlunit/libraries/Prototype171Test.java
index c96ffda0cb9..e88ab3fef8c 100644
--- a/src/test/java/org/htmlunit/libraries/Prototype171Test.java
+++ b/src/test/java/org/htmlunit/libraries/Prototype171Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebServerTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/libraries/QuillTest.java b/src/test/java/org/htmlunit/libraries/QuillTest.java
new file mode 100644
index 00000000000..bfc0611661c
--- /dev/null
+++ b/src/test/java/org/htmlunit/libraries/QuillTest.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2002-2025 Gargoyle Software Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.htmlunit.libraries;
+
+import java.net.URL;
+
+import org.eclipse.jetty.server.Server;
+import org.htmlunit.WebDriverTestCase;
+import org.htmlunit.WebServerTestCase;
+import org.htmlunit.junit.BrowserRunner;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+/**
+ * Tests for https://github.com/slab/quill.
+ *
+ * @author Ronald Brill
+ */
+@RunWith(BrowserRunner.class)
+public class QuillTest extends WebDriverTestCase {
+
+ /** The server. */
+ protected static Server SERVER_;
+
+ /**
+ * @throws Exception if an error occurs
+ */
+ @BeforeClass
+ public static void startSesrver() throws Exception {
+ SERVER_ = WebServerTestCase.createWebServer("src/test/resources/libraries/quill/", null);
+ }
+
+ /**
+ * @throws Exception if an error occurs
+ */
+ @AfterClass
+ public static void stopServer() throws Exception {
+ if (SERVER_ != null) {
+ SERVER_.stop();
+ SERVER_.destroy();
+ SERVER_ = null;
+ }
+ }
+
+ /**
+ * @return the resource base URL
+ */
+ protected URL getBaseUrl() {
+ return URL_FIRST;
+ }
+
+ /**
+ * @throws Exception if the test fails
+ */
+ @Test
+ @Alerts("Bold Italic\\nHello World!\\nSome initial bold text")
+ @HtmlUnitNYI
+ public void basic() throws Exception {
+ // fails because the lib uses classes
+ doTest("QuillTest.html");
+ }
+
+ private void doTest(final String filename) throws Exception {
+ final WebDriver driver = getWebDriver();
+ driver.get(getBaseUrl() + filename);
+
+ String content = driver.findElement(By.tagName("body")).getText();
+ content = content.replace("\r", "").replace("\n", "\\n");
+ assertEquals(getExpectedAlerts()[0], content);
+ }
+}
diff --git a/src/test/java/org/htmlunit/libraries/Sarissa0993Test.java b/src/test/java/org/htmlunit/libraries/Sarissa0993Test.java
index e076c902e62..15aa5afd0f9 100644
--- a/src/test/java/org/htmlunit/libraries/Sarissa0993Test.java
+++ b/src/test/java/org/htmlunit/libraries/Sarissa0993Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/libraries/Sarissa0997Test.java b/src/test/java/org/htmlunit/libraries/Sarissa0997Test.java
index f4d0308d2bb..4c7756efb4a 100644
--- a/src/test/java/org/htmlunit/libraries/Sarissa0997Test.java
+++ b/src/test/java/org/htmlunit/libraries/Sarissa0997Test.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/libraries/TinyMceTest.java b/src/test/java/org/htmlunit/libraries/TinyMceTest.java
index 5459cdc5db8..6c41d121229 100644
--- a/src/test/java/org/htmlunit/libraries/TinyMceTest.java
+++ b/src/test/java/org/htmlunit/libraries/TinyMceTest.java
@@ -19,8 +19,8 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/libraries/VueTest.java b/src/test/java/org/htmlunit/libraries/VueTest.java
index d961e286ca7..da22b5f9cb2 100644
--- a/src/test/java/org/htmlunit/libraries/VueTest.java
+++ b/src/test/java/org/htmlunit/libraries/VueTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/libraries/YuiTest.java b/src/test/java/org/htmlunit/libraries/YuiTest.java
index 90667c021ad..1fba6433394 100644
--- a/src/test/java/org/htmlunit/libraries/YuiTest.java
+++ b/src/test/java/org/htmlunit/libraries/YuiTest.java
@@ -25,8 +25,8 @@
import org.apache.commons.logging.LogFactory;
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.NotYetImplemented;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
diff --git a/src/test/java/org/htmlunit/protocol/data/DataURLDecoderTest.java b/src/test/java/org/htmlunit/protocol/data/DataURLDecoderTest.java
index 64e67b95d60..bdad884b138 100644
--- a/src/test/java/org/htmlunit/protocol/data/DataURLDecoderTest.java
+++ b/src/test/java/org/htmlunit/protocol/data/DataURLDecoderTest.java
@@ -16,7 +16,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/selenium/TypingTest.java b/src/test/java/org/htmlunit/selenium/TypingTest.java
index 43c311cdc96..c2ddc16c291 100644
--- a/src/test/java/org/htmlunit/selenium/TypingTest.java
+++ b/src/test/java/org/htmlunit/selenium/TypingTest.java
@@ -15,8 +15,8 @@
package org.htmlunit.selenium;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
diff --git a/src/test/java/org/htmlunit/source/JQueryExtractor.java b/src/test/java/org/htmlunit/source/JQueryExtractor.java
index 8c59e07e4ed..b4f85af6002 100644
--- a/src/test/java/org/htmlunit/source/JQueryExtractor.java
+++ b/src/test/java/org/htmlunit/source/JQueryExtractor.java
@@ -39,8 +39,8 @@
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.reflect.MethodUtils;
import org.htmlunit.WebDriverTestCase;
-import org.htmlunit.junit.BrowserRunner.NotYetImplemented;
-import org.htmlunit.junit.BrowserRunner.TestedBrowser;
+import org.htmlunit.junit.annotation.NotYetImplemented;
+import org.htmlunit.junit.annotation.TestedBrowser;
import org.htmlunit.libraries.JQuery1x8x2Test;
/**
diff --git a/src/test/java/org/htmlunit/svg/SvgAltGlyphDefTest.java b/src/test/java/org/htmlunit/svg/SvgAltGlyphDefTest.java
index 7f23f992d01..267e0393c97 100644
--- a/src/test/java/org/htmlunit/svg/SvgAltGlyphDefTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgAltGlyphDefTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgAltGlyphItemTest.java b/src/test/java/org/htmlunit/svg/SvgAltGlyphItemTest.java
index 06510fb3a68..63f32d9c585 100644
--- a/src/test/java/org/htmlunit/svg/SvgAltGlyphItemTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgAltGlyphItemTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgAltGlyphTest.java b/src/test/java/org/htmlunit/svg/SvgAltGlyphTest.java
index 6dbe70161b7..442ed9f77ee 100644
--- a/src/test/java/org/htmlunit/svg/SvgAltGlyphTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgAltGlyphTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgAnchorTest.java b/src/test/java/org/htmlunit/svg/SvgAnchorTest.java
index feb51d87ced..d8b8d172035 100644
--- a/src/test/java/org/htmlunit/svg/SvgAnchorTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgAnchorTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgAnimateColorTest.java b/src/test/java/org/htmlunit/svg/SvgAnimateColorTest.java
index aec1637c8b9..8888150c925 100644
--- a/src/test/java/org/htmlunit/svg/SvgAnimateColorTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgAnimateColorTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgAnimateMotionTest.java b/src/test/java/org/htmlunit/svg/SvgAnimateMotionTest.java
index f0387472eec..728cef7ea08 100644
--- a/src/test/java/org/htmlunit/svg/SvgAnimateMotionTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgAnimateMotionTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgAnimateTest.java b/src/test/java/org/htmlunit/svg/SvgAnimateTest.java
index 9437ecf2f0f..2022f7b73e7 100644
--- a/src/test/java/org/htmlunit/svg/SvgAnimateTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgAnimateTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgAnimateTransformTest.java b/src/test/java/org/htmlunit/svg/SvgAnimateTransformTest.java
index fb679350875..32802861040 100644
--- a/src/test/java/org/htmlunit/svg/SvgAnimateTransformTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgAnimateTransformTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgCircleTest.java b/src/test/java/org/htmlunit/svg/SvgCircleTest.java
index b600834982f..825be47482e 100644
--- a/src/test/java/org/htmlunit/svg/SvgCircleTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgCircleTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgClipPathTest.java b/src/test/java/org/htmlunit/svg/SvgClipPathTest.java
index 2996e2a484c..dc2be65b450 100644
--- a/src/test/java/org/htmlunit/svg/SvgClipPathTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgClipPathTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgColorProfileTest.java b/src/test/java/org/htmlunit/svg/SvgColorProfileTest.java
index ff8b09a40df..c6e0f7b1b29 100644
--- a/src/test/java/org/htmlunit/svg/SvgColorProfileTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgColorProfileTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgCursorTest.java b/src/test/java/org/htmlunit/svg/SvgCursorTest.java
index 0c85f92d8de..d42e2520899 100644
--- a/src/test/java/org/htmlunit/svg/SvgCursorTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgCursorTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgDefsTest.java b/src/test/java/org/htmlunit/svg/SvgDefsTest.java
index 89635593394..246ef091ec7 100644
--- a/src/test/java/org/htmlunit/svg/SvgDefsTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgDefsTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgDescTest.java b/src/test/java/org/htmlunit/svg/SvgDescTest.java
index 1c9b2708d23..a13ad8032d2 100644
--- a/src/test/java/org/htmlunit/svg/SvgDescTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgDescTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgElementTest.java b/src/test/java/org/htmlunit/svg/SvgElementTest.java
index 8b2d96684a3..2d2f588fbbd 100644
--- a/src/test/java/org/htmlunit/svg/SvgElementTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgElementTest.java
@@ -19,7 +19,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgEllipseTest.java b/src/test/java/org/htmlunit/svg/SvgEllipseTest.java
index 9ea150c7a05..3d4e04a5d19 100644
--- a/src/test/java/org/htmlunit/svg/SvgEllipseTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgEllipseTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeBlendTest.java b/src/test/java/org/htmlunit/svg/SvgFeBlendTest.java
index 4e5ffe8cf16..0e6c612dfb6 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeBlendTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeBlendTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeColorMatrixTest.java b/src/test/java/org/htmlunit/svg/SvgFeColorMatrixTest.java
index d9f09d3a8e9..12be79d6aae 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeColorMatrixTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeColorMatrixTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeComponentTransferTest.java b/src/test/java/org/htmlunit/svg/SvgFeComponentTransferTest.java
index 431e18c1545..c323c82a2a5 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeComponentTransferTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeComponentTransferTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeCompositeTest.java b/src/test/java/org/htmlunit/svg/SvgFeCompositeTest.java
index 6b190ab4bdc..ce556f036ce 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeCompositeTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeCompositeTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeConvolveMatrixTest.java b/src/test/java/org/htmlunit/svg/SvgFeConvolveMatrixTest.java
index d544fa91ae0..f0956c4a866 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeConvolveMatrixTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeConvolveMatrixTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeDiffuseLightingTest.java b/src/test/java/org/htmlunit/svg/SvgFeDiffuseLightingTest.java
index c9ebf573d80..0eda310237b 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeDiffuseLightingTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeDiffuseLightingTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeDisplacementMapTest.java b/src/test/java/org/htmlunit/svg/SvgFeDisplacementMapTest.java
index 902f81f1809..495495ae682 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeDisplacementMapTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeDisplacementMapTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeDistantLightTest.java b/src/test/java/org/htmlunit/svg/SvgFeDistantLightTest.java
index 14e3e7d3609..625dc1bdc70 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeDistantLightTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeDistantLightTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeFloodTest.java b/src/test/java/org/htmlunit/svg/SvgFeFloodTest.java
index 03f2acef262..9fc59c3b885 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeFloodTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeFloodTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeFuncATest.java b/src/test/java/org/htmlunit/svg/SvgFeFuncATest.java
index d254137fe0a..919f0ab4507 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeFuncATest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeFuncATest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeFuncBTest.java b/src/test/java/org/htmlunit/svg/SvgFeFuncBTest.java
index 3c57e607ba3..63394af46e3 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeFuncBTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeFuncBTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeFuncGTest.java b/src/test/java/org/htmlunit/svg/SvgFeFuncGTest.java
index a8b6d889f3c..4dc6cf05418 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeFuncGTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeFuncGTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeFuncRTest.java b/src/test/java/org/htmlunit/svg/SvgFeFuncRTest.java
index 12683d7323d..4299182b6f5 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeFuncRTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeFuncRTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeGaussianBlurTest.java b/src/test/java/org/htmlunit/svg/SvgFeGaussianBlurTest.java
index aef9c61336d..14af2fdced5 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeGaussianBlurTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeGaussianBlurTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeImageTest.java b/src/test/java/org/htmlunit/svg/SvgFeImageTest.java
index d368165091f..f944042c37b 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeImageTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeImageTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeMergeNodeTest.java b/src/test/java/org/htmlunit/svg/SvgFeMergeNodeTest.java
index 9e8d0b7ed95..27a59d34f4c 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeMergeNodeTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeMergeNodeTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeMergeTest.java b/src/test/java/org/htmlunit/svg/SvgFeMergeTest.java
index f3a016bd37a..970fde36c01 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeMergeTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeMergeTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeMorphologyTest.java b/src/test/java/org/htmlunit/svg/SvgFeMorphologyTest.java
index 99039aa4d91..7c3fa3dd08f 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeMorphologyTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeMorphologyTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeOffsetTest.java b/src/test/java/org/htmlunit/svg/SvgFeOffsetTest.java
index 0a6924f5e1b..73b2d5c5765 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeOffsetTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeOffsetTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFePointLightTest.java b/src/test/java/org/htmlunit/svg/SvgFePointLightTest.java
index 151ce5cef93..fb624a17408 100644
--- a/src/test/java/org/htmlunit/svg/SvgFePointLightTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFePointLightTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeSpecularLightingTest.java b/src/test/java/org/htmlunit/svg/SvgFeSpecularLightingTest.java
index 54fbc97a9fe..609a7a1cbaa 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeSpecularLightingTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeSpecularLightingTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeSpotLightTest.java b/src/test/java/org/htmlunit/svg/SvgFeSpotLightTest.java
index d7047266319..b81897c105c 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeSpotLightTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeSpotLightTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeTileTest.java b/src/test/java/org/htmlunit/svg/SvgFeTileTest.java
index 6cb09ab9f43..e621b926e18 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeTileTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeTileTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFeTurbulenceTest.java b/src/test/java/org/htmlunit/svg/SvgFeTurbulenceTest.java
index 70e00cccfd2..7feb4a22562 100644
--- a/src/test/java/org/htmlunit/svg/SvgFeTurbulenceTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFeTurbulenceTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFilterTest.java b/src/test/java/org/htmlunit/svg/SvgFilterTest.java
index 0cdf03ffabc..9cdef14ca6e 100644
--- a/src/test/java/org/htmlunit/svg/SvgFilterTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFilterTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFontFaceFormatTest.java b/src/test/java/org/htmlunit/svg/SvgFontFaceFormatTest.java
index 70433b7c0f5..52c36ab17f6 100644
--- a/src/test/java/org/htmlunit/svg/SvgFontFaceFormatTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFontFaceFormatTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFontFaceNameTest.java b/src/test/java/org/htmlunit/svg/SvgFontFaceNameTest.java
index 621d27620aa..60bc64c87c3 100644
--- a/src/test/java/org/htmlunit/svg/SvgFontFaceNameTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFontFaceNameTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFontFaceSrcTest.java b/src/test/java/org/htmlunit/svg/SvgFontFaceSrcTest.java
index 86c603ec6b6..fcddd0dd384 100644
--- a/src/test/java/org/htmlunit/svg/SvgFontFaceSrcTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFontFaceSrcTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFontFaceTest.java b/src/test/java/org/htmlunit/svg/SvgFontFaceTest.java
index 41f7ed14acc..54362c50bf2 100644
--- a/src/test/java/org/htmlunit/svg/SvgFontFaceTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFontFaceTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFontFaceURITest.java b/src/test/java/org/htmlunit/svg/SvgFontFaceURITest.java
index 8134c77a35d..f1190e17448 100644
--- a/src/test/java/org/htmlunit/svg/SvgFontFaceURITest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFontFaceURITest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgFontTest.java b/src/test/java/org/htmlunit/svg/SvgFontTest.java
index de1b5fa03a3..643c21d5d67 100644
--- a/src/test/java/org/htmlunit/svg/SvgFontTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgFontTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgForeignObjectTest.java b/src/test/java/org/htmlunit/svg/SvgForeignObjectTest.java
index 36761457ed4..cd17b4708bf 100644
--- a/src/test/java/org/htmlunit/svg/SvgForeignObjectTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgForeignObjectTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgGlyphRefTest.java b/src/test/java/org/htmlunit/svg/SvgGlyphRefTest.java
index d1c2fbaecd3..dfc100c60cb 100644
--- a/src/test/java/org/htmlunit/svg/SvgGlyphRefTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgGlyphRefTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgGlyphTest.java b/src/test/java/org/htmlunit/svg/SvgGlyphTest.java
index b6c0672beaa..b5cc497ecc7 100644
--- a/src/test/java/org/htmlunit/svg/SvgGlyphTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgGlyphTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgGroupTest.java b/src/test/java/org/htmlunit/svg/SvgGroupTest.java
index 36d12de1c59..e9cc98acd70 100644
--- a/src/test/java/org/htmlunit/svg/SvgGroupTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgGroupTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgHKernTest.java b/src/test/java/org/htmlunit/svg/SvgHKernTest.java
index 73d4f5ade1c..22be577425a 100644
--- a/src/test/java/org/htmlunit/svg/SvgHKernTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgHKernTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgImageTest.java b/src/test/java/org/htmlunit/svg/SvgImageTest.java
index 7d5a1cb8082..8b2cf86d59f 100644
--- a/src/test/java/org/htmlunit/svg/SvgImageTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgImageTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgJavaScriptTest.java b/src/test/java/org/htmlunit/svg/SvgJavaScriptTest.java
index 40a9f65f944..f5063e8e6ac 100644
--- a/src/test/java/org/htmlunit/svg/SvgJavaScriptTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgJavaScriptTest.java
@@ -48,9 +48,9 @@ public void onclick() throws Exception {
final WebDriver driver = loadPage2(html, URL_FIRST, "image/svg+xml", ISO_8859_1);
final WebElement rect = driver.findElement(By.id("rect"));
- assertEquals("blue", rect.getAttribute("fill"));
+ assertEquals("blue", rect.getDomAttribute("fill"));
rect.click();
- assertEquals("green", rect.getAttribute("fill"));
+ assertEquals("green", rect.getDomAttribute("fill"));
}
}
diff --git a/src/test/java/org/htmlunit/svg/SvgLineTest.java b/src/test/java/org/htmlunit/svg/SvgLineTest.java
index 150f9ebf178..94a68946005 100644
--- a/src/test/java/org/htmlunit/svg/SvgLineTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgLineTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgLinearGradientTest.java b/src/test/java/org/htmlunit/svg/SvgLinearGradientTest.java
index 2c7147473ca..32503264d41 100644
--- a/src/test/java/org/htmlunit/svg/SvgLinearGradientTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgLinearGradientTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgMPathTest.java b/src/test/java/org/htmlunit/svg/SvgMPathTest.java
index efc755e1ad6..3c2c1b21715 100644
--- a/src/test/java/org/htmlunit/svg/SvgMPathTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgMPathTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgMarkerTest.java b/src/test/java/org/htmlunit/svg/SvgMarkerTest.java
index 720d777e486..0c69d8f222a 100644
--- a/src/test/java/org/htmlunit/svg/SvgMarkerTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgMarkerTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgMaskTest.java b/src/test/java/org/htmlunit/svg/SvgMaskTest.java
index 63f68371918..78dae61a8d2 100644
--- a/src/test/java/org/htmlunit/svg/SvgMaskTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgMaskTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgMatrixTest.java b/src/test/java/org/htmlunit/svg/SvgMatrixTest.java
index 88d70fde6dc..4faf2e74144 100644
--- a/src/test/java/org/htmlunit/svg/SvgMatrixTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgMatrixTest.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/java/org/htmlunit/svg/SvgMetadataTest.java b/src/test/java/org/htmlunit/svg/SvgMetadataTest.java
index ae480d17aea..043b82135a7 100644
--- a/src/test/java/org/htmlunit/svg/SvgMetadataTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgMetadataTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgMissingGlyphTest.java b/src/test/java/org/htmlunit/svg/SvgMissingGlyphTest.java
index ec98060dc17..354c1ae1fd6 100644
--- a/src/test/java/org/htmlunit/svg/SvgMissingGlyphTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgMissingGlyphTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgPathTest.java b/src/test/java/org/htmlunit/svg/SvgPathTest.java
index e839c7bc6ec..6cf1b884da4 100644
--- a/src/test/java/org/htmlunit/svg/SvgPathTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgPathTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgPatternTest.java b/src/test/java/org/htmlunit/svg/SvgPatternTest.java
index eb7ce1abccb..422ae9e587f 100644
--- a/src/test/java/org/htmlunit/svg/SvgPatternTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgPatternTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgPolygonTest.java b/src/test/java/org/htmlunit/svg/SvgPolygonTest.java
index c56ec50eb0c..113cb52b9c0 100644
--- a/src/test/java/org/htmlunit/svg/SvgPolygonTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgPolygonTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgPolylineTest.java b/src/test/java/org/htmlunit/svg/SvgPolylineTest.java
index 7fabd7073ed..e345bbb0523 100644
--- a/src/test/java/org/htmlunit/svg/SvgPolylineTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgPolylineTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgRadialGradientTest.java b/src/test/java/org/htmlunit/svg/SvgRadialGradientTest.java
index 9255f2e01fa..e1b6f080ddd 100644
--- a/src/test/java/org/htmlunit/svg/SvgRadialGradientTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgRadialGradientTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgRectTest.java b/src/test/java/org/htmlunit/svg/SvgRectTest.java
index b8bfd6100bc..1d32f7c8fd3 100644
--- a/src/test/java/org/htmlunit/svg/SvgRectTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgRectTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgScriptTest.java b/src/test/java/org/htmlunit/svg/SvgScriptTest.java
index 37f472220d6..779c52097e4 100644
--- a/src/test/java/org/htmlunit/svg/SvgScriptTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgScriptTest.java
@@ -20,8 +20,8 @@
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.html.HtmlScript;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
-import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
+import org.htmlunit.junit.annotation.Alerts;
+import org.htmlunit.junit.annotation.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgSetTest.java b/src/test/java/org/htmlunit/svg/SvgSetTest.java
index 65af4b95a61..4a3a6766ca6 100644
--- a/src/test/java/org/htmlunit/svg/SvgSetTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgSetTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgStopTest.java b/src/test/java/org/htmlunit/svg/SvgStopTest.java
index 63aab1fa4ba..58f1a6fe62b 100644
--- a/src/test/java/org/htmlunit/svg/SvgStopTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgStopTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgStyleTest.java b/src/test/java/org/htmlunit/svg/SvgStyleTest.java
index 9bfd1ae6b09..2ba83b469b4 100644
--- a/src/test/java/org/htmlunit/svg/SvgStyleTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgStyleTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgSwitchTest.java b/src/test/java/org/htmlunit/svg/SvgSwitchTest.java
index 0abca5df2b8..065c116bdbb 100644
--- a/src/test/java/org/htmlunit/svg/SvgSwitchTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgSwitchTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgSymbolTest.java b/src/test/java/org/htmlunit/svg/SvgSymbolTest.java
index 2067769bdfc..2305e0b1728 100644
--- a/src/test/java/org/htmlunit/svg/SvgSymbolTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgSymbolTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgTRefTest.java b/src/test/java/org/htmlunit/svg/SvgTRefTest.java
index a3be31ed78e..f45851abe28 100644
--- a/src/test/java/org/htmlunit/svg/SvgTRefTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgTRefTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgTSpanTest.java b/src/test/java/org/htmlunit/svg/SvgTSpanTest.java
index 3dbdb95a20f..cc756483159 100644
--- a/src/test/java/org/htmlunit/svg/SvgTSpanTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgTSpanTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgTextPathTest.java b/src/test/java/org/htmlunit/svg/SvgTextPathTest.java
index d770de1be7a..cbbbe6d2910 100644
--- a/src/test/java/org/htmlunit/svg/SvgTextPathTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgTextPathTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgTextTest.java b/src/test/java/org/htmlunit/svg/SvgTextTest.java
index f3176c95c73..05d1721cb79 100644
--- a/src/test/java/org/htmlunit/svg/SvgTextTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgTextTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgTitleTest.java b/src/test/java/org/htmlunit/svg/SvgTitleTest.java
index a89bff11923..6c825da816e 100644
--- a/src/test/java/org/htmlunit/svg/SvgTitleTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgTitleTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgUseTest.java b/src/test/java/org/htmlunit/svg/SvgUseTest.java
index 2db364844ba..87cd56f06fd 100644
--- a/src/test/java/org/htmlunit/svg/SvgUseTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgUseTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgVKernTest.java b/src/test/java/org/htmlunit/svg/SvgVKernTest.java
index d82f183ae9e..a40d2649d85 100644
--- a/src/test/java/org/htmlunit/svg/SvgVKernTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgVKernTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/svg/SvgViewTest.java b/src/test/java/org/htmlunit/svg/SvgViewTest.java
index 704f8fae78f..647c0c04444 100644
--- a/src/test/java/org/htmlunit/svg/SvgViewTest.java
+++ b/src/test/java/org/htmlunit/svg/SvgViewTest.java
@@ -18,7 +18,7 @@
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
diff --git a/src/test/java/org/htmlunit/xml/XmlPage2Test.java b/src/test/java/org/htmlunit/xml/XmlPage2Test.java
index 89150249da5..92dff1b0913 100644
--- a/src/test/java/org/htmlunit/xml/XmlPage2Test.java
+++ b/src/test/java/org/htmlunit/xml/XmlPage2Test.java
@@ -17,7 +17,7 @@
import org.htmlunit.WebDriverTestCase;
import org.htmlunit.javascript.host.xml.XMLDocumentTest;
import org.htmlunit.junit.BrowserRunner;
-import org.htmlunit.junit.BrowserRunner.Alerts;
+import org.htmlunit.junit.annotation.Alerts;
import org.htmlunit.util.MimeType;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/src/test/resources/libraries/quill/QuillTest.html b/src/test/resources/libraries/quill/QuillTest.html
new file mode 100644
index 00000000000..e8143ac940f
--- /dev/null
+++ b/src/test/resources/libraries/quill/QuillTest.html
@@ -0,0 +1,38 @@
+
+
+
+ Codestin Search App
+
+
+
+
+
+
+
+
+
+
+ Bold
+ Italic
+
+
+
+
+
Hello World!
+
Some initial bold text
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/resources/libraries/quill/quill.js b/src/test/resources/libraries/quill/quill.js
new file mode 100644
index 00000000000..aeddaa17729
--- /dev/null
+++ b/src/test/resources/libraries/quill/quill.js
@@ -0,0 +1,3 @@
+/*! For license information please see quill.js.LICENSE.txt */
+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Quill=e():t.Quill=e()}(self,(function(){return function(){var t={9698:function(t,e,n){"use strict";n.d(e,{Ay:function(){return c},Ji:function(){return d},mG:function(){return h},zo:function(){return u}});var r=n(6003),i=n(5232),s=n.n(i),o=n(3036),l=n(4850),a=n(5508);class c extends r.BlockBlot{cache={};delta(){return null==this.cache.delta&&(this.cache.delta=h(this)),this.cache.delta}deleteAt(t,e){super.deleteAt(t,e),this.cache={}}formatAt(t,e,n,i){e<=0||(this.scroll.query(n,r.Scope.BLOCK)?t+e===this.length()&&this.format(n,i):super.formatAt(t,Math.min(e,this.length()-t-1),n,i),this.cache={})}insertAt(t,e,n){if(null!=n)return super.insertAt(t,e,n),void(this.cache={});if(0===e.length)return;const r=e.split("\n"),i=r.shift();i.length>0&&(t(s=s.split(t,!0),s.insertAt(0,e),e.length)),t+i.length)}insertBefore(t,e){const{head:n}=this.children;super.insertBefore(t,e),n instanceof o.A&&n.remove(),this.cache={}}length(){return null==this.cache.length&&(this.cache.length=super.length()+1),this.cache.length}moveChildren(t,e){super.moveChildren(t,e),this.cache={}}optimize(t){super.optimize(t),this.cache={}}path(t){return super.path(t,!0)}removeChild(t){super.removeChild(t),this.cache={}}split(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(e&&(0===t||t>=this.length()-1)){const e=this.clone();return 0===t?(this.parent.insertBefore(e,this),this):(this.parent.insertBefore(e,this.next),e)}const n=super.split(t,e);return this.cache={},n}}c.blotName="block",c.tagName="P",c.defaultChild=o.A,c.allowedChildren=[o.A,l.A,r.EmbedBlot,a.A];class u extends r.EmbedBlot{attach(){super.attach(),this.attributes=new r.AttributorStore(this.domNode)}delta(){return(new(s())).insert(this.value(),{...this.formats(),...this.attributes.values()})}format(t,e){const n=this.scroll.query(t,r.Scope.BLOCK_ATTRIBUTE);null!=n&&this.attributes.attribute(n,e)}formatAt(t,e,n,r){this.format(n,r)}insertAt(t,e,n){if(null!=n)return void super.insertAt(t,e,n);const r=e.split("\n"),i=r.pop(),s=r.map((t=>{const e=this.scroll.create(c.blotName);return e.insertAt(0,t),e})),o=this.split(t);s.forEach((t=>{this.parent.insertBefore(t,o)})),i&&this.parent.insertBefore(this.scroll.create("text",i),o)}}function h(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return t.descendants(r.LeafBlot).reduce(((t,n)=>0===n.length()?t:t.insert(n.value(),d(n,{},e))),new(s())).insert("\n",d(t))}function d(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];return null==t?e:("formats"in t&&"function"==typeof t.formats&&(e={...e,...t.formats()},n&&delete e["code-token"]),null==t.parent||"scroll"===t.parent.statics.blotName||t.parent.statics.scope!==t.statics.scope?e:d(t.parent,e,n))}u.scope=r.Scope.BLOCK_BLOT},3036:function(t,e,n){"use strict";var r=n(6003);class i extends r.EmbedBlot{static value(){}optimize(){(this.prev||this.next)&&this.remove()}length(){return 0}value(){return""}}i.blotName="break",i.tagName="BR",e.A=i},580:function(t,e,n){"use strict";var r=n(6003);class i extends r.ContainerBlot{}e.A=i},4541:function(t,e,n){"use strict";var r=n(6003),i=n(5508);class s extends r.EmbedBlot{static blotName="cursor";static className="ql-cursor";static tagName="span";static CONTENTS="\ufeff";static value(){}constructor(t,e,n){super(t,e),this.selection=n,this.textNode=document.createTextNode(s.CONTENTS),this.domNode.appendChild(this.textNode),this.savedLength=0}detach(){null!=this.parent&&this.parent.removeChild(this)}format(t,e){if(0!==this.savedLength)return void super.format(t,e);let n=this,i=0;for(;null!=n&&n.statics.scope!==r.Scope.BLOCK_BLOT;)i+=n.offset(n.parent),n=n.parent;null!=n&&(this.savedLength=s.CONTENTS.length,n.optimize(),n.formatAt(i,s.CONTENTS.length,t,e),this.savedLength=0)}index(t,e){return t===this.textNode?0:super.index(t,e)}length(){return this.savedLength}position(){return[this.textNode,this.textNode.data.length]}remove(){super.remove(),this.parent=null}restore(){if(this.selection.composing||null==this.parent)return null;const t=this.selection.getNativeRange();for(;null!=this.domNode.lastChild&&this.domNode.lastChild!==this.textNode;)this.domNode.parentNode.insertBefore(this.domNode.lastChild,this.domNode);const e=this.prev instanceof i.A?this.prev:null,n=e?e.length():0,r=this.next instanceof i.A?this.next:null,o=r?r.text:"",{textNode:l}=this,a=l.data.split(s.CONTENTS).join("");let c;if(l.data=s.CONTENTS,e)c=e,(a||r)&&(e.insertAt(e.length(),a+o),r&&r.remove());else if(r)c=r,r.insertAt(0,a);else{const t=document.createTextNode(a);c=this.scroll.create(t),this.parent.insertBefore(c,this)}if(this.remove(),t){const i=(t,i)=>e&&t===e.domNode?i:t===l?n+i-1:r&&t===r.domNode?n+a.length+i:null,s=i(t.start.node,t.start.offset),o=i(t.end.node,t.end.offset);if(null!==s&&null!==o)return{startNode:c.domNode,startOffset:s,endNode:c.domNode,endOffset:o}}return null}update(t,e){if(t.some((t=>"characterData"===t.type&&t.target===this.textNode))){const t=this.restore();t&&(e.range=t)}}optimize(t){super.optimize(t);let{parent:e}=this;for(;e;){if("A"===e.domNode.tagName){this.savedLength=s.CONTENTS.length,e.isolate(this.offset(e),this.length()).unwrap(),this.savedLength=0;break}e=e.parent}}value(){return""}}e.A=s},746:function(t,e,n){"use strict";var r=n(6003),i=n(5508);const s="\ufeff";class o extends r.EmbedBlot{constructor(t,e){super(t,e),this.contentNode=document.createElement("span"),this.contentNode.setAttribute("contenteditable","false"),Array.from(this.domNode.childNodes).forEach((t=>{this.contentNode.appendChild(t)})),this.leftGuard=document.createTextNode(s),this.rightGuard=document.createTextNode(s),this.domNode.appendChild(this.leftGuard),this.domNode.appendChild(this.contentNode),this.domNode.appendChild(this.rightGuard)}index(t,e){return t===this.leftGuard?0:t===this.rightGuard?1:super.index(t,e)}restore(t){let e,n=null;const r=t.data.split(s).join("");if(t===this.leftGuard)if(this.prev instanceof i.A){const t=this.prev.length();this.prev.insertAt(t,r),n={startNode:this.prev.domNode,startOffset:t+r.length}}else e=document.createTextNode(r),this.parent.insertBefore(this.scroll.create(e),this),n={startNode:e,startOffset:r.length};else t===this.rightGuard&&(this.next instanceof i.A?(this.next.insertAt(0,r),n={startNode:this.next.domNode,startOffset:r.length}):(e=document.createTextNode(r),this.parent.insertBefore(this.scroll.create(e),this.next),n={startNode:e,startOffset:r.length}));return t.data=s,n}update(t,e){t.forEach((t=>{if("characterData"===t.type&&(t.target===this.leftGuard||t.target===this.rightGuard)){const n=this.restore(t.target);n&&(e.range=n)}}))}}e.A=o},4850:function(t,e,n){"use strict";var r=n(6003),i=n(3036),s=n(5508);class o extends r.InlineBlot{static allowedChildren=[o,i.A,r.EmbedBlot,s.A];static order=["cursor","inline","link","underline","strike","italic","bold","script","code"];static compare(t,e){const n=o.order.indexOf(t),r=o.order.indexOf(e);return n>=0||r>=0?n-r:t===e?0:t0){const t=this.parent.isolate(this.offset(),this.length());this.moveChildren(t),t.wrap(this)}}}e.A=o},5508:function(t,e,n){"use strict";n.d(e,{A:function(){return i},X:function(){return o}});var r=n(6003);class i extends r.TextBlot{}const s={"&":"&","<":"<",">":">",'"':""","'":"'"};function o(t){return t.replace(/[&<>"']/g,(t=>s[t]))}},3729:function(t,e,n){"use strict";n.d(e,{default:function(){return R}});var r=n(6142),i=n(9698),s=n(3036),o=n(580),l=n(4541),a=n(746),c=n(4850),u=n(6003),h=n(5232),d=n.n(h),f=n(5374);function p(t){return t instanceof i.Ay||t instanceof i.zo}function g(t){return"function"==typeof t.updateContent}class m extends u.ScrollBlot{static blotName="scroll";static className="ql-editor";static tagName="DIV";static defaultChild=i.Ay;static allowedChildren=[i.Ay,i.zo,o.A];constructor(t,e,n){let{emitter:r}=n;super(t,e),this.emitter=r,this.batch=!1,this.optimize(),this.enable(),this.domNode.addEventListener("dragstart",(t=>this.handleDragStart(t)))}batchStart(){Array.isArray(this.batch)||(this.batch=[])}batchEnd(){if(!this.batch)return;const t=this.batch;this.batch=!1,this.update(t)}emitMount(t){this.emitter.emit(f.A.events.SCROLL_BLOT_MOUNT,t)}emitUnmount(t){this.emitter.emit(f.A.events.SCROLL_BLOT_UNMOUNT,t)}emitEmbedUpdate(t,e){this.emitter.emit(f.A.events.SCROLL_EMBED_UPDATE,t,e)}deleteAt(t,e){const[n,r]=this.line(t),[o]=this.line(t+e);if(super.deleteAt(t,e),null!=o&&n!==o&&r>0){if(n instanceof i.zo||o instanceof i.zo)return void this.optimize();const t=o.children.head instanceof s.A?null:o.children.head;n.moveChildren(o,t),n.remove()}this.optimize()}enable(){let t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.domNode.setAttribute("contenteditable",t?"true":"false")}formatAt(t,e,n,r){super.formatAt(t,e,n,r),this.optimize()}insertAt(t,e,n){if(t>=this.length())if(null==n||null==this.scroll.query(e,u.Scope.BLOCK)){const t=this.scroll.create(this.statics.defaultChild.blotName);this.appendChild(t),null==n&&e.endsWith("\n")?t.insertAt(0,e.slice(0,-1),n):t.insertAt(0,e,n)}else{const t=this.scroll.create(e,n);this.appendChild(t)}else super.insertAt(t,e,n);this.optimize()}insertBefore(t,e){if(t.statics.scope===u.Scope.INLINE_BLOT){const n=this.scroll.create(this.statics.defaultChild.blotName);n.appendChild(t),super.insertBefore(n,e)}else super.insertBefore(t,e)}insertContents(t,e){const n=this.deltaToRenderBlocks(e.concat((new(d())).insert("\n"))),r=n.pop();if(null==r)return;this.batchStart();const s=n.shift();if(s){const e="block"===s.type&&(0===s.delta.length()||!this.descendant(i.zo,t)[0]&&t{this.formatAt(o-1,1,t,a[t])})),t=o}let[o,l]=this.children.find(t);n.length&&(o&&(o=o.split(l),l=0),n.forEach((t=>{if("block"===t.type)b(this.createBlock(t.attributes,o||void 0),0,t.delta);else{const e=this.create(t.key,t.value);this.insertBefore(e,o||void 0),Object.keys(t.attributes).forEach((n=>{e.format(n,t.attributes[n])}))}}))),"block"===r.type&&r.delta.length()&&b(this,o?o.offset(o.scroll)+l:this.length(),r.delta),this.batchEnd(),this.optimize()}isEnabled(){return"true"===this.domNode.getAttribute("contenteditable")}leaf(t){const e=this.path(t).pop();if(!e)return[null,-1];const[n,r]=e;return n instanceof u.LeafBlot?[n,r]:[null,-1]}line(t){return t===this.length()?this.line(t-1):this.descendant(p,t)}lines(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.MAX_VALUE;const n=(t,e,r)=>{let i=[],s=r;return t.children.forEachAt(e,r,((t,e,r)=>{p(t)?i.push(t):t instanceof u.ContainerBlot&&(i=i.concat(n(t,e,s))),s-=r})),i};return n(this,t,e)}optimize(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.batch||(super.optimize(t,e),t.length>0&&this.emitter.emit(f.A.events.SCROLL_OPTIMIZE,t,e))}path(t){return super.path(t).slice(1)}remove(){}update(t){if(this.batch)return void(Array.isArray(t)&&(this.batch=this.batch.concat(t)));let e=f.A.sources.USER;"string"==typeof t&&(e=t),Array.isArray(t)||(t=this.observer.takeRecords()),(t=t.filter((t=>{let{target:e}=t;const n=this.find(e,!0);return n&&!g(n)}))).length>0&&this.emitter.emit(f.A.events.SCROLL_BEFORE_UPDATE,e,t),super.update(t.concat([])),t.length>0&&this.emitter.emit(f.A.events.SCROLL_UPDATE,e,t)}updateEmbedAt(t,e,n){const[r]=this.descendant((t=>t instanceof i.zo),t);r&&r.statics.blotName===e&&g(r)&&r.updateContent(n)}handleDragStart(t){t.preventDefault()}deltaToRenderBlocks(t){const e=[];let n=new(d());return t.forEach((t=>{const r=t?.insert;if(r)if("string"==typeof r){const i=r.split("\n");i.slice(0,-1).forEach((r=>{n.insert(r,t.attributes),e.push({type:"block",delta:n,attributes:t.attributes??{}}),n=new(d())}));const s=i[i.length-1];s&&n.insert(s,t.attributes)}else{const i=Object.keys(r)[0];if(!i)return;this.query(i,u.Scope.INLINE)?n.push(t):(n.length()&&e.push({type:"block",delta:n,attributes:{}}),n=new(d()),e.push({type:"blockEmbed",key:i,value:r[i],attributes:t.attributes??{}}))}})),n.length()&&e.push({type:"block",delta:n,attributes:{}}),e}createBlock(t,e){let n;const r={};Object.entries(t).forEach((t=>{let[e,i]=t;null!=this.query(e,u.Scope.BLOCK&u.Scope.BLOT)?n=e:r[e]=i}));const i=this.create(n||this.statics.defaultChild.blotName,n?t[n]:void 0);this.insertBefore(i,e||void 0);const s=i.length();return Object.entries(r).forEach((t=>{let[e,n]=t;i.formatAt(0,s,e,n)})),i}}function b(t,e,n){n.reduce(((e,n)=>{const r=h.Op.length(n);let s=n.attributes||{};if(null!=n.insert)if("string"==typeof n.insert){const r=n.insert;t.insertAt(e,r);const[o]=t.descendant(u.LeafBlot,e),l=(0,i.Ji)(o);s=h.AttributeMap.diff(l,s)||{}}else if("object"==typeof n.insert){const r=Object.keys(n.insert)[0];if(null==r)return e;if(t.insertAt(e,r,n.insert[r]),null!=t.scroll.query(r,u.Scope.INLINE)){const[n]=t.descendant(u.LeafBlot,e),r=(0,i.Ji)(n);s=h.AttributeMap.diff(r,s)||{}}}return Object.keys(s).forEach((n=>{t.formatAt(e,r,n,s[n])})),e+r}),e)}var y=m,v=n(5508),A=n(584),x=n(4266);class N extends x.A{static DEFAULTS={delay:1e3,maxStack:100,userOnly:!1};lastRecorded=0;ignoreChange=!1;stack={undo:[],redo:[]};currentRange=null;constructor(t,e){super(t,e),this.quill.on(r.Ay.events.EDITOR_CHANGE,((t,e,n,i)=>{t===r.Ay.events.SELECTION_CHANGE?e&&i!==r.Ay.sources.SILENT&&(this.currentRange=e):t===r.Ay.events.TEXT_CHANGE&&(this.ignoreChange||(this.options.userOnly&&i!==r.Ay.sources.USER?this.transform(e):this.record(e,n)),this.currentRange=w(this.currentRange,e))})),this.quill.keyboard.addBinding({key:"z",shortKey:!0},this.undo.bind(this)),this.quill.keyboard.addBinding({key:["z","Z"],shortKey:!0,shiftKey:!0},this.redo.bind(this)),/Win/i.test(navigator.platform)&&this.quill.keyboard.addBinding({key:"y",shortKey:!0},this.redo.bind(this)),this.quill.root.addEventListener("beforeinput",(t=>{"historyUndo"===t.inputType?(this.undo(),t.preventDefault()):"historyRedo"===t.inputType&&(this.redo(),t.preventDefault())}))}change(t,e){if(0===this.stack[t].length)return;const n=this.stack[t].pop();if(!n)return;const i=this.quill.getContents(),s=n.delta.invert(i);this.stack[e].push({delta:s,range:w(n.range,s)}),this.lastRecorded=0,this.ignoreChange=!0,this.quill.updateContents(n.delta,r.Ay.sources.USER),this.ignoreChange=!1,this.restoreSelection(n)}clear(){this.stack={undo:[],redo:[]}}cutoff(){this.lastRecorded=0}record(t,e){if(0===t.ops.length)return;this.stack.redo=[];let n=t.invert(e),r=this.currentRange;const i=Date.now();if(this.lastRecorded+this.options.delay>i&&this.stack.undo.length>0){const t=this.stack.undo.pop();t&&(n=n.compose(t.delta),r=t.range)}else this.lastRecorded=i;0!==n.length()&&(this.stack.undo.push({delta:n,range:r}),this.stack.undo.length>this.options.maxStack&&this.stack.undo.shift())}redo(){this.change("redo","undo")}transform(t){E(this.stack.undo,t),E(this.stack.redo,t)}undo(){this.change("undo","redo")}restoreSelection(t){if(t.range)this.quill.setSelection(t.range,r.Ay.sources.USER);else{const e=function(t,e){const n=e.reduce(((t,e)=>t+(e.delete||0)),0);let r=e.length()-n;return function(t,e){const n=e.ops[e.ops.length-1];return null!=n&&(null!=n.insert?"string"==typeof n.insert&&n.insert.endsWith("\n"):null!=n.attributes&&Object.keys(n.attributes).some((e=>null!=t.query(e,u.Scope.BLOCK))))}(t,e)&&(r-=1),r}(this.quill.scroll,t.delta);this.quill.setSelection(e,r.Ay.sources.USER)}}}function E(t,e){let n=e;for(let e=t.length-1;e>=0;e-=1){const r=t[e];t[e]={delta:n.transform(r.delta,!0),range:r.range&&w(r.range,n)},n=r.delta.transform(n),0===t[e].delta.length()&&t.splice(e,1)}}function w(t,e){if(!t)return t;const n=e.transformPosition(t.index);return{index:n,length:e.transformPosition(t.index+t.length)-n}}var q=n(8123);class k extends x.A{constructor(t,e){super(t,e),t.root.addEventListener("drop",(e=>{e.preventDefault();let n=null;if(document.caretRangeFromPoint)n=document.caretRangeFromPoint(e.clientX,e.clientY);else if(document.caretPositionFromPoint){const t=document.caretPositionFromPoint(e.clientX,e.clientY);n=document.createRange(),n.setStart(t.offsetNode,t.offset),n.setEnd(t.offsetNode,t.offset)}const r=n&&t.selection.normalizeNative(n);if(r){const n=t.selection.normalizedToRange(r);e.dataTransfer?.files&&this.upload(n,e.dataTransfer.files)}}))}upload(t,e){const n=[];Array.from(e).forEach((t=>{t&&this.options.mimetypes?.includes(t.type)&&n.push(t)})),n.length>0&&this.options.handler.call(this,t,n)}}k.DEFAULTS={mimetypes:["image/png","image/jpeg"],handler(t,e){if(!this.quill.scroll.query("image"))return;const n=e.map((t=>new Promise((e=>{const n=new FileReader;n.onload=()=>{e(n.result)},n.readAsDataURL(t)}))));Promise.all(n).then((e=>{const n=e.reduce(((t,e)=>t.insert({image:e})),(new(d())).retain(t.index).delete(t.length));this.quill.updateContents(n,f.A.sources.USER),this.quill.setSelection(t.index+e.length,f.A.sources.SILENT)}))}};var _=k;const L=["insertText","insertReplacementText"];class S extends x.A{constructor(t,e){super(t,e),t.root.addEventListener("beforeinput",(t=>{this.handleBeforeInput(t)})),/Android/i.test(navigator.userAgent)||t.on(r.Ay.events.COMPOSITION_BEFORE_START,(()=>{this.handleCompositionStart()}))}deleteRange(t){(0,q.Xo)({range:t,quill:this.quill})}replaceText(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(0===t.length)return!1;if(e){const n=this.quill.getFormat(t.index,1);this.deleteRange(t),this.quill.updateContents((new(d())).retain(t.index).insert(e,n),r.Ay.sources.USER)}else this.deleteRange(t);return this.quill.setSelection(t.index+e.length,0,r.Ay.sources.SILENT),!0}handleBeforeInput(t){if(this.quill.composition.isComposing||t.defaultPrevented||!L.includes(t.inputType))return;const e=t.getTargetRanges?t.getTargetRanges()[0]:null;if(!e||!0===e.collapsed)return;const n=function(t){return"string"==typeof t.data?t.data:t.dataTransfer?.types.includes("text/plain")?t.dataTransfer.getData("text/plain"):null}(t);if(null==n)return;const r=this.quill.selection.normalizeNative(e),i=r?this.quill.selection.normalizedToRange(r):null;i&&this.replaceText(i,n)&&t.preventDefault()}handleCompositionStart(){const t=this.quill.getSelection();t&&this.replaceText(t)}}var O=S;const T=/Mac/i.test(navigator.platform);class j extends x.A{isListening=!1;selectionChangeDeadline=0;constructor(t,e){super(t,e),this.handleArrowKeys(),this.handleNavigationShortcuts()}handleArrowKeys(){this.quill.keyboard.addBinding({key:["ArrowLeft","ArrowRight"],offset:0,shiftKey:null,handler(t,e){let{line:n,event:i}=e;if(!(n instanceof u.ParentBlot&&n.uiNode))return!0;const s="rtl"===getComputedStyle(n.domNode).direction;return!!(s&&"ArrowRight"!==i.key||!s&&"ArrowLeft"!==i.key)||(this.quill.setSelection(t.index-1,t.length+(i.shiftKey?1:0),r.Ay.sources.USER),!1)}})}handleNavigationShortcuts(){this.quill.root.addEventListener("keydown",(t=>{!t.defaultPrevented&&(t=>"ArrowLeft"===t.key||"ArrowRight"===t.key||"ArrowUp"===t.key||"ArrowDown"===t.key||"Home"===t.key||!(!T||"a"!==t.key||!0!==t.ctrlKey))(t)&&this.ensureListeningToSelectionChange()}))}ensureListeningToSelectionChange(){this.selectionChangeDeadline=Date.now()+100,this.isListening||(this.isListening=!0,document.addEventListener("selectionchange",(()=>{this.isListening=!1,Date.now()<=this.selectionChangeDeadline&&this.handleSelectionChange()}),{once:!0}))}handleSelectionChange(){const t=document.getSelection();if(!t)return;const e=t.getRangeAt(0);if(!0!==e.collapsed||0!==e.startOffset)return;const n=this.quill.scroll.find(e.startContainer);if(!(n instanceof u.ParentBlot&&n.uiNode))return;const r=document.createRange();r.setStartAfter(n.uiNode),r.setEndAfter(n.uiNode),t.removeAllRanges(),t.addRange(r)}}var C=j;r.Ay.register({"blots/block":i.Ay,"blots/block/embed":i.zo,"blots/break":s.A,"blots/container":o.A,"blots/cursor":l.A,"blots/embed":a.A,"blots/inline":c.A,"blots/scroll":y,"blots/text":v.A,"modules/clipboard":A.Ay,"modules/history":N,"modules/keyboard":q.Ay,"modules/uploader":_,"modules/input":O,"modules/uiNode":C});var R=r.Ay},5374:function(t,e,n){"use strict";n.d(e,{A:function(){return o}});var r=n(8920),i=n(7356);const s=(0,n(6078).A)("quill:events");["selectionchange","mousedown","mouseup","click"].forEach((t=>{document.addEventListener(t,(function(){for(var t=arguments.length,e=new Array(t),n=0;n{const n=i.A.get(t);n&&n.emitter&&n.emitter.handleDOM(...e)}))}))}));var o=class extends r{static events={EDITOR_CHANGE:"editor-change",SCROLL_BEFORE_UPDATE:"scroll-before-update",SCROLL_BLOT_MOUNT:"scroll-blot-mount",SCROLL_BLOT_UNMOUNT:"scroll-blot-unmount",SCROLL_OPTIMIZE:"scroll-optimize",SCROLL_UPDATE:"scroll-update",SCROLL_EMBED_UPDATE:"scroll-embed-update",SELECTION_CHANGE:"selection-change",TEXT_CHANGE:"text-change",COMPOSITION_BEFORE_START:"composition-before-start",COMPOSITION_START:"composition-start",COMPOSITION_BEFORE_END:"composition-before-end",COMPOSITION_END:"composition-end"};static sources={API:"api",SILENT:"silent",USER:"user"};constructor(){super(),this.domListeners={},this.on("error",s.error)}emit(){for(var t=arguments.length,e=new Array(t),n=0;n1?e-1:0),r=1;r{let{node:r,handler:i}=e;(t.target===r||r.contains(t.target))&&i(t,...n)}))}listenDOM(t,e,n){this.domListeners[t]||(this.domListeners[t]=[]),this.domListeners[t].push({node:e,handler:n})}}},7356:function(t,e){"use strict";e.A=new WeakMap},6078:function(t,e){"use strict";const n=["error","warn","log","info"];let r="warn";function i(t){if(r&&n.indexOf(t)<=n.indexOf(r)){for(var e=arguments.length,i=new Array(e>1?e-1:0),s=1;s(e[n]=i.bind(console,n,t),e)),{})}s.level=t=>{r=t},i.level=s.level,e.A=s},4266:function(t,e){"use strict";e.A=class{static DEFAULTS={};constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.quill=t,this.options=e}}},6142:function(t,e,n){"use strict";n.d(e,{Ay:function(){return I}});var r=n(8347),i=n(6003),s=n(5232),o=n.n(s),l=n(3707),a=n(5123),c=n(9698),u=n(3036),h=n(4541),d=n(5508),f=n(8298);const p=/^[ -~]*$/;function g(t,e,n){if(0===t.length){const[t]=y(n.pop());return e<=0?`${t}>`:`${t}>${g([],e-1,n)}`}const[{child:r,offset:i,length:s,indent:o,type:l},...a]=t,[c,u]=y(l);if(o>e)return n.push(l),o===e+1?`<${c}>${m(r,i,s)}${g(a,o,n)}`:`<${c}> ${g(t,e+1,n)}`;const h=n[n.length-1];if(o===e&&l===h)return` ${m(r,i,s)}${g(a,o,n)}`;const[d]=y(n.pop());return` ${d}>${g(t,e-1,n)}`}function m(t,e,n){let r=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if("html"in t&&"function"==typeof t.html)return t.html(e,n);if(t instanceof d.A)return(0,d.X)(t.value().slice(e,e+n)).replaceAll(" "," ");if(t instanceof i.ParentBlot){if("list-container"===t.statics.blotName){const r=[];return t.children.forEachAt(e,n,((t,e,n)=>{const i="formats"in t&&"function"==typeof t.formats?t.formats():{};r.push({child:t,offset:e,length:n,indent:i.indent||0,type:i.list})})),g(r,-1,[])}const i=[];if(t.children.forEachAt(e,n,((t,e,n)=>{i.push(m(t,e,n))})),r||"list"===t.statics.blotName)return i.join("");const{outerHTML:s,innerHTML:o}=t.domNode,[l,a]=s.split(`>${o}<`);return"${i.join("")}<${a}`:`${l}>${i.join("")}<${a}`}return t.domNode instanceof Element?t.domNode.outerHTML:""}function b(t,e){return Object.keys(e).reduce(((n,r)=>{if(null==t[r])return n;const i=e[r];return i===t[r]?n[r]=i:Array.isArray(i)?i.indexOf(t[r])<0?n[r]=i.concat([t[r]]):n[r]=i:n[r]=[i,t[r]],n}),{})}function y(t){const e="ordered"===t?"ol":"ul";switch(t){case"checked":return[e,' data-list="checked"'];case"unchecked":return[e,' data-list="unchecked"'];default:return[e,""]}}function v(t){return t.reduce(((t,e)=>{if("string"==typeof e.insert){const n=e.insert.replace(/\r\n/g,"\n").replace(/\r/g,"\n");return t.insert(n,e.attributes)}return t.push(e)}),new(o()))}function A(t,e){let{index:n,length:r}=t;return new f.Q(n+e,r)}var x=class{constructor(t){this.scroll=t,this.delta=this.getDelta()}applyDelta(t){this.scroll.update();let e=this.scroll.length();this.scroll.batchStart();const n=v(t),l=new(o());return function(t){const e=[];return t.forEach((t=>{"string"==typeof t.insert?t.insert.split("\n").forEach(((n,r)=>{r&&e.push({insert:"\n",attributes:t.attributes}),n&&e.push({insert:n,attributes:t.attributes})})):e.push(t)})),e}(n.ops.slice()).reduce(((t,n)=>{const o=s.Op.length(n);let a=n.attributes||{},u=!1,h=!1;if(null!=n.insert){if(l.retain(o),"string"==typeof n.insert){const o=n.insert;h=!o.endsWith("\n")&&(e<=t||!!this.scroll.descendant(c.zo,t)[0]),this.scroll.insertAt(t,o);const[l,u]=this.scroll.line(t);let d=(0,r.A)({},(0,c.Ji)(l));if(l instanceof c.Ay){const[t]=l.descendant(i.LeafBlot,u);t&&(d=(0,r.A)(d,(0,c.Ji)(t)))}a=s.AttributeMap.diff(d,a)||{}}else if("object"==typeof n.insert){const o=Object.keys(n.insert)[0];if(null==o)return t;const l=null!=this.scroll.query(o,i.Scope.INLINE);if(l)(e<=t||this.scroll.descendant(c.zo,t)[0])&&(h=!0);else if(t>0){const[e,n]=this.scroll.descendant(i.LeafBlot,t-1);e instanceof d.A?"\n"!==e.value()[n]&&(u=!0):e instanceof i.EmbedBlot&&e.statics.scope===i.Scope.INLINE_BLOT&&(u=!0)}if(this.scroll.insertAt(t,o,n.insert[o]),l){const[e]=this.scroll.descendant(i.LeafBlot,t);if(e){const t=(0,r.A)({},(0,c.Ji)(e));a=s.AttributeMap.diff(t,a)||{}}}}e+=o}else if(l.push(n),null!==n.retain&&"object"==typeof n.retain){const e=Object.keys(n.retain)[0];if(null==e)return t;this.scroll.updateEmbedAt(t,e,n.retain[e])}Object.keys(a).forEach((e=>{this.scroll.formatAt(t,o,e,a[e])}));const f=u?1:0,p=h?1:0;return e+=f+p,l.retain(f),l.delete(p),t+o+f+p}),0),l.reduce(((t,e)=>"number"==typeof e.delete?(this.scroll.deleteAt(t,e.delete),t):t+s.Op.length(e)),0),this.scroll.batchEnd(),this.scroll.optimize(),this.update(n)}deleteText(t,e){return this.scroll.deleteAt(t,e),this.update((new(o())).retain(t).delete(e))}formatLine(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};this.scroll.update(),Object.keys(n).forEach((r=>{this.scroll.lines(t,Math.max(e,1)).forEach((t=>{t.format(r,n[r])}))})),this.scroll.optimize();const r=(new(o())).retain(t).retain(e,(0,l.A)(n));return this.update(r)}formatText(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.keys(n).forEach((r=>{this.scroll.formatAt(t,e,r,n[r])}));const r=(new(o())).retain(t).retain(e,(0,l.A)(n));return this.update(r)}getContents(t,e){return this.delta.slice(t,t+e)}getDelta(){return this.scroll.lines().reduce(((t,e)=>t.concat(e.delta())),new(o()))}getFormat(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=[],r=[];0===e?this.scroll.path(t).forEach((t=>{const[e]=t;e instanceof c.Ay?n.push(e):e instanceof i.LeafBlot&&r.push(e)})):(n=this.scroll.lines(t,e),r=this.scroll.descendants(i.LeafBlot,t,e));const[s,o]=[n,r].map((t=>{const e=t.shift();if(null==e)return{};let n=(0,c.Ji)(e);for(;Object.keys(n).length>0;){const e=t.shift();if(null==e)return n;n=b((0,c.Ji)(e),n)}return n}));return{...s,...o}}getHTML(t,e){const[n,r]=this.scroll.line(t);if(n){const i=n.length();return n.length()>=r+e&&(0!==r||e!==i)?m(n,r,e,!0):m(this.scroll,t,e,!0)}return""}getText(t,e){return this.getContents(t,e).filter((t=>"string"==typeof t.insert)).map((t=>t.insert)).join("")}insertContents(t,e){const n=v(e),r=(new(o())).retain(t).concat(n);return this.scroll.insertContents(t,n),this.update(r)}insertEmbed(t,e,n){return this.scroll.insertAt(t,e,n),this.update((new(o())).retain(t).insert({[e]:n}))}insertText(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return e=e.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),this.scroll.insertAt(t,e),Object.keys(n).forEach((r=>{this.scroll.formatAt(t,e.length,r,n[r])})),this.update((new(o())).retain(t).insert(e,(0,l.A)(n)))}isBlank(){if(0===this.scroll.children.length)return!0;if(this.scroll.children.length>1)return!1;const t=this.scroll.children.head;if(t?.statics.blotName!==c.Ay.blotName)return!1;const e=t;return!(e.children.length>1)&&e.children.head instanceof u.A}removeFormat(t,e){const n=this.getText(t,e),[r,i]=this.scroll.line(t+e);let s=0,l=new(o());null!=r&&(s=r.length()-i,l=r.delta().slice(i,i+s-1).insert("\n"));const a=this.getContents(t,e+s).diff((new(o())).insert(n).concat(l)),c=(new(o())).retain(t).concat(a);return this.applyDelta(c)}update(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;const r=this.delta;if(1===e.length&&"characterData"===e[0].type&&e[0].target.data.match(p)&&this.scroll.find(e[0].target)){const i=this.scroll.find(e[0].target),s=(0,c.Ji)(i),l=i.offset(this.scroll),a=e[0].oldValue.replace(h.A.CONTENTS,""),u=(new(o())).insert(a),d=(new(o())).insert(i.value()),f=n&&{oldRange:A(n.oldRange,-l),newRange:A(n.newRange,-l)};t=(new(o())).retain(l).concat(u.diff(d,f)).reduce(((t,e)=>e.insert?t.insert(e.insert,s):t.push(e)),new(o())),this.delta=r.compose(t)}else this.delta=this.getDelta(),t&&(0,a.A)(r.compose(t),this.delta)||(t=r.diff(this.delta,n));return t}},N=n(5374),E=n(7356),w=n(6078),q=n(4266),k=n(746),_=class{isComposing=!1;constructor(t,e){this.scroll=t,this.emitter=e,this.setupListeners()}setupListeners(){this.scroll.domNode.addEventListener("compositionstart",(t=>{this.isComposing||this.handleCompositionStart(t)})),this.scroll.domNode.addEventListener("compositionend",(t=>{this.isComposing&&queueMicrotask((()=>{this.handleCompositionEnd(t)}))}))}handleCompositionStart(t){const e=t.target instanceof Node?this.scroll.find(t.target,!0):null;!e||e instanceof k.A||(this.emitter.emit(N.A.events.COMPOSITION_BEFORE_START,t),this.scroll.batchStart(),this.emitter.emit(N.A.events.COMPOSITION_START,t),this.isComposing=!0)}handleCompositionEnd(t){this.emitter.emit(N.A.events.COMPOSITION_BEFORE_END,t),this.scroll.batchEnd(),this.emitter.emit(N.A.events.COMPOSITION_END,t),this.isComposing=!1}},L=n(9609);const S=t=>{const e=t.getBoundingClientRect(),n="offsetWidth"in t&&Math.abs(e.width)/t.offsetWidth||1,r="offsetHeight"in t&&Math.abs(e.height)/t.offsetHeight||1;return{top:e.top,right:e.left+t.clientWidth*n,bottom:e.top+t.clientHeight*r,left:e.left}},O=t=>{const e=parseInt(t,10);return Number.isNaN(e)?0:e},T=(t,e,n,r,i,s)=>tr?0:tr?e-t>r-n?t+i-n:e-r+s:0;const j=["block","break","cursor","inline","scroll","text"];const C=(0,w.A)("quill"),R=new i.Registry;i.ParentBlot.uiClass="ql-ui";class I{static DEFAULTS={bounds:null,modules:{clipboard:!0,keyboard:!0,history:!0,uploader:!0},placeholder:"",readOnly:!1,registry:R,theme:"default"};static events=N.A.events;static sources=N.A.sources;static version="2.0.3";static imports={delta:o(),parchment:i,"core/module":q.A,"core/theme":L.A};static debug(t){!0===t&&(t="log"),w.A.level(t)}static find(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return E.A.get(t)||R.find(t,e)}static import(t){return null==this.imports[t]&&C.error(`Cannot import ${t}. Are you sure it was registered?`),this.imports[t]}static register(){if("string"!=typeof(arguments.length<=0?void 0:arguments[0])){const t=arguments.length<=0?void 0:arguments[0],e=!!(arguments.length<=1?void 0:arguments[1]),n="attrName"in t?t.attrName:t.blotName;"string"==typeof n?this.register(`formats/${n}`,t,e):Object.keys(t).forEach((n=>{this.register(n,t[n],e)}))}else{const t=arguments.length<=0?void 0:arguments[0],e=arguments.length<=1?void 0:arguments[1],n=!!(arguments.length<=2?void 0:arguments[2]);null==this.imports[t]||n||C.warn(`Overwriting ${t} with`,e),this.imports[t]=e,(t.startsWith("blots/")||t.startsWith("formats/"))&&e&&"boolean"!=typeof e&&"abstract"!==e.blotName&&R.register(e),"function"==typeof e.register&&e.register(R)}}constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(this.options=function(t,e){const n=B(t);if(!n)throw new Error("Invalid Quill container");const s=!e.theme||e.theme===I.DEFAULTS.theme?L.A:I.import(`themes/${e.theme}`);if(!s)throw new Error(`Invalid theme ${e.theme}. Did you register it?`);const{modules:o,...l}=I.DEFAULTS,{modules:a,...c}=s.DEFAULTS;let u=M(e.modules);null!=u&&u.toolbar&&u.toolbar.constructor!==Object&&(u={...u,toolbar:{container:u.toolbar}});const h=(0,r.A)({},M(o),M(a),u),d={...l,...U(c),...U(e)};let f=e.registry;return f?e.formats&&C.warn('Ignoring "formats" option because "registry" is specified'):f=e.formats?((t,e,n)=>{const r=new i.Registry;return j.forEach((t=>{const n=e.query(t);n&&r.register(n)})),t.forEach((t=>{let i=e.query(t);i||n.error(`Cannot register "${t}" specified in "formats" config. Are you sure it was registered?`);let s=0;for(;i;)if(r.register(i),i="blotName"in i?i.requiredContainer??null:null,s+=1,s>100){n.error(`Cycle detected in registering blot requiredContainer: "${t}"`);break}})),r})(e.formats,d.registry,C):d.registry,{...d,registry:f,container:n,theme:s,modules:Object.entries(h).reduce(((t,e)=>{let[n,i]=e;if(!i)return t;const s=I.import(`modules/${n}`);return null==s?(C.error(`Cannot load ${n} module. Are you sure you registered it?`),t):{...t,[n]:(0,r.A)({},s.DEFAULTS||{},i)}}),{}),bounds:B(d.bounds)}}(t,e),this.container=this.options.container,null==this.container)return void C.error("Invalid Quill container",t);this.options.debug&&I.debug(this.options.debug);const n=this.container.innerHTML.trim();this.container.classList.add("ql-container"),this.container.innerHTML="",E.A.set(this.container,this),this.root=this.addContainer("ql-editor"),this.root.classList.add("ql-blank"),this.emitter=new N.A;const s=i.ScrollBlot.blotName,l=this.options.registry.query(s);if(!l||!("blotName"in l))throw new Error(`Cannot initialize Quill without "${s}" blot`);if(this.scroll=new l(this.options.registry,this.root,{emitter:this.emitter}),this.editor=new x(this.scroll),this.selection=new f.A(this.scroll,this.emitter),this.composition=new _(this.scroll,this.emitter),this.theme=new this.options.theme(this,this.options),this.keyboard=this.theme.addModule("keyboard"),this.clipboard=this.theme.addModule("clipboard"),this.history=this.theme.addModule("history"),this.uploader=this.theme.addModule("uploader"),this.theme.addModule("input"),this.theme.addModule("uiNode"),this.theme.init(),this.emitter.on(N.A.events.EDITOR_CHANGE,(t=>{t===N.A.events.TEXT_CHANGE&&this.root.classList.toggle("ql-blank",this.editor.isBlank())})),this.emitter.on(N.A.events.SCROLL_UPDATE,((t,e)=>{const n=this.selection.lastRange,[r]=this.selection.getRange(),i=n&&r?{oldRange:n,newRange:r}:void 0;D.call(this,(()=>this.editor.update(null,e,i)),t)})),this.emitter.on(N.A.events.SCROLL_EMBED_UPDATE,((t,e)=>{const n=this.selection.lastRange,[r]=this.selection.getRange(),i=n&&r?{oldRange:n,newRange:r}:void 0;D.call(this,(()=>{const n=(new(o())).retain(t.offset(this)).retain({[t.statics.blotName]:e});return this.editor.update(n,[],i)}),I.sources.USER)})),n){const t=this.clipboard.convert({html:`${n}
`,text:"\n"});this.setContents(t)}this.history.clear(),this.options.placeholder&&this.root.setAttribute("data-placeholder",this.options.placeholder),this.options.readOnly&&this.disable(),this.allowReadOnlyEdits=!1}addContainer(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if("string"==typeof t){const e=t;(t=document.createElement("div")).classList.add(e)}return this.container.insertBefore(t,e),t}blur(){this.selection.setRange(null)}deleteText(t,e,n){return[t,e,,n]=P(t,e,n),D.call(this,(()=>this.editor.deleteText(t,e)),n,t,-1*e)}disable(){this.enable(!1)}editReadOnly(t){this.allowReadOnlyEdits=!0;const e=t();return this.allowReadOnlyEdits=!1,e}enable(){let t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.scroll.enable(t),this.container.classList.toggle("ql-disabled",!t)}focus(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.selection.focus(),t.preventScroll||this.scrollSelectionIntoView()}format(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:N.A.sources.API;return D.call(this,(()=>{const n=this.getSelection(!0);let r=new(o());if(null==n)return r;if(this.scroll.query(t,i.Scope.BLOCK))r=this.editor.formatLine(n.index,n.length,{[t]:e});else{if(0===n.length)return this.selection.format(t,e),r;r=this.editor.formatText(n.index,n.length,{[t]:e})}return this.setSelection(n,N.A.sources.SILENT),r}),n)}formatLine(t,e,n,r,i){let s;return[t,e,s,i]=P(t,e,n,r,i),D.call(this,(()=>this.editor.formatLine(t,e,s)),i,t,0)}formatText(t,e,n,r,i){let s;return[t,e,s,i]=P(t,e,n,r,i),D.call(this,(()=>this.editor.formatText(t,e,s)),i,t,0)}getBounds(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=null;if(n="number"==typeof t?this.selection.getBounds(t,e):this.selection.getBounds(t.index,t.length),!n)return null;const r=this.container.getBoundingClientRect();return{bottom:n.bottom-r.top,height:n.height,left:n.left-r.left,right:n.right-r.left,top:n.top-r.top,width:n.width}}getContents(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.getLength()-t;return[t,e]=P(t,e),this.editor.getContents(t,e)}getFormat(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.getSelection(!0),e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return"number"==typeof t?this.editor.getFormat(t,e):this.editor.getFormat(t.index,t.length)}getIndex(t){return t.offset(this.scroll)}getLength(){return this.scroll.length()}getLeaf(t){return this.scroll.leaf(t)}getLine(t){return this.scroll.line(t)}getLines(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.MAX_VALUE;return"number"!=typeof t?this.scroll.lines(t.index,t.length):this.scroll.lines(t,e)}getModule(t){return this.theme.modules[t]}getSelection(){return arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.focus(),this.update(),this.selection.getRange()[0]}getSemanticHTML(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1?arguments[1]:void 0;return"number"==typeof t&&(e=e??this.getLength()-t),[t,e]=P(t,e),this.editor.getHTML(t,e)}getText(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1?arguments[1]:void 0;return"number"==typeof t&&(e=e??this.getLength()-t),[t,e]=P(t,e),this.editor.getText(t,e)}hasFocus(){return this.selection.hasFocus()}insertEmbed(t,e,n){let r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:I.sources.API;return D.call(this,(()=>this.editor.insertEmbed(t,e,n)),r,t)}insertText(t,e,n,r,i){let s;return[t,,s,i]=P(t,0,n,r,i),D.call(this,(()=>this.editor.insertText(t,e,s)),i,t,e.length)}isEnabled(){return this.scroll.isEnabled()}off(){return this.emitter.off(...arguments)}on(){return this.emitter.on(...arguments)}once(){return this.emitter.once(...arguments)}removeFormat(t,e,n){return[t,e,,n]=P(t,e,n),D.call(this,(()=>this.editor.removeFormat(t,e)),n,t)}scrollRectIntoView(t){((t,e)=>{const n=t.ownerDocument;let r=e,i=t;for(;i;){const t=i===n.body,e=t?{top:0,right:window.visualViewport?.width??n.documentElement.clientWidth,bottom:window.visualViewport?.height??n.documentElement.clientHeight,left:0}:S(i),o=getComputedStyle(i),l=T(r.left,r.right,e.left,e.right,O(o.scrollPaddingLeft),O(o.scrollPaddingRight)),a=T(r.top,r.bottom,e.top,e.bottom,O(o.scrollPaddingTop),O(o.scrollPaddingBottom));if(l||a)if(t)n.defaultView?.scrollBy(l,a);else{const{scrollLeft:t,scrollTop:e}=i;a&&(i.scrollTop+=a),l&&(i.scrollLeft+=l);const n=i.scrollLeft-t,s=i.scrollTop-e;r={left:r.left-n,top:r.top-s,right:r.right-n,bottom:r.bottom-s}}i=t||"fixed"===o.position?null:(s=i).parentElement||s.getRootNode().host||null}var s})(this.root,t)}scrollIntoView(){console.warn("Quill#scrollIntoView() has been deprecated and will be removed in the near future. Please use Quill#scrollSelectionIntoView() instead."),this.scrollSelectionIntoView()}scrollSelectionIntoView(){const t=this.selection.lastRange,e=t&&this.selection.getBounds(t.index,t.length);e&&this.scrollRectIntoView(e)}setContents(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:N.A.sources.API;return D.call(this,(()=>{t=new(o())(t);const e=this.getLength(),n=this.editor.deleteText(0,e),r=this.editor.insertContents(0,t),i=this.editor.deleteText(this.getLength()-1,1);return n.compose(r).compose(i)}),e)}setSelection(t,e,n){null==t?this.selection.setRange(null,e||I.sources.API):([t,e,,n]=P(t,e,n),this.selection.setRange(new f.Q(Math.max(0,t),e),n),n!==N.A.sources.SILENT&&this.scrollSelectionIntoView())}setText(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:N.A.sources.API;const n=(new(o())).insert(t);return this.setContents(n,e)}update(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:N.A.sources.USER;const e=this.scroll.update(t);return this.selection.update(t),e}updateContents(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:N.A.sources.API;return D.call(this,(()=>(t=new(o())(t),this.editor.applyDelta(t))),e,!0)}}function B(t){return"string"==typeof t?document.querySelector(t):t}function M(t){return Object.entries(t??{}).reduce(((t,e)=>{let[n,r]=e;return{...t,[n]:!0===r?{}:r}}),{})}function U(t){return Object.fromEntries(Object.entries(t).filter((t=>void 0!==t[1])))}function D(t,e,n,r){if(!this.isEnabled()&&e===N.A.sources.USER&&!this.allowReadOnlyEdits)return new(o());let i=null==n?null:this.getSelection();const s=this.editor.delta,l=t();if(null!=i&&(!0===n&&(n=i.index),null==r?i=z(i,l,e):0!==r&&(i=z(i,n,r,e)),this.setSelection(i,N.A.sources.SILENT)),l.length()>0){const t=[N.A.events.TEXT_CHANGE,l,s,e];this.emitter.emit(N.A.events.EDITOR_CHANGE,...t),e!==N.A.sources.SILENT&&this.emitter.emit(...t)}return l}function P(t,e,n,r,i){let s={};return"number"==typeof t.index&&"number"==typeof t.length?"number"!=typeof e?(i=r,r=n,n=e,e=t.length,t=t.index):(e=t.length,t=t.index):"number"!=typeof e&&(i=r,r=n,n=e,e=0),"object"==typeof n?(s=n,i=r):"string"==typeof n&&(null!=r?s[n]=r:i=n),[t,e,s,i=i||N.A.sources.API]}function z(t,e,n,r){const i="number"==typeof n?n:0;if(null==t)return null;let s,o;return e&&"function"==typeof e.transformPosition?[s,o]=[t.index,t.index+t.length].map((t=>e.transformPosition(t,r!==N.A.sources.USER))):[s,o]=[t.index,t.index+t.length].map((t=>t=0?t+i:Math.max(e,t+i))),new f.Q(s,o-s)}},8298:function(t,e,n){"use strict";n.d(e,{Q:function(){return a}});var r=n(6003),i=n(5123),s=n(3707),o=n(5374);const l=(0,n(6078).A)("quill:selection");class a{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.index=t,this.length=e}}function c(t,e){try{e.parentNode}catch(t){return!1}return t.contains(e)}e.A=class{constructor(t,e){this.emitter=e,this.scroll=t,this.composing=!1,this.mouseDown=!1,this.root=this.scroll.domNode,this.cursor=this.scroll.create("cursor",this),this.savedRange=new a(0,0),this.lastRange=this.savedRange,this.lastNative=null,this.handleComposition(),this.handleDragging(),this.emitter.listenDOM("selectionchange",document,(()=>{this.mouseDown||this.composing||setTimeout(this.update.bind(this,o.A.sources.USER),1)})),this.emitter.on(o.A.events.SCROLL_BEFORE_UPDATE,(()=>{if(!this.hasFocus())return;const t=this.getNativeRange();null!=t&&t.start.node!==this.cursor.textNode&&this.emitter.once(o.A.events.SCROLL_UPDATE,((e,n)=>{try{this.root.contains(t.start.node)&&this.root.contains(t.end.node)&&this.setNativeRange(t.start.node,t.start.offset,t.end.node,t.end.offset);const r=n.some((t=>"characterData"===t.type||"childList"===t.type||"attributes"===t.type&&t.target===this.root));this.update(r?o.A.sources.SILENT:e)}catch(t){}}))})),this.emitter.on(o.A.events.SCROLL_OPTIMIZE,((t,e)=>{if(e.range){const{startNode:t,startOffset:n,endNode:r,endOffset:i}=e.range;this.setNativeRange(t,n,r,i),this.update(o.A.sources.SILENT)}})),this.update(o.A.sources.SILENT)}handleComposition(){this.emitter.on(o.A.events.COMPOSITION_BEFORE_START,(()=>{this.composing=!0})),this.emitter.on(o.A.events.COMPOSITION_END,(()=>{if(this.composing=!1,this.cursor.parent){const t=this.cursor.restore();if(!t)return;setTimeout((()=>{this.setNativeRange(t.startNode,t.startOffset,t.endNode,t.endOffset)}),1)}}))}handleDragging(){this.emitter.listenDOM("mousedown",document.body,(()=>{this.mouseDown=!0})),this.emitter.listenDOM("mouseup",document.body,(()=>{this.mouseDown=!1,this.update(o.A.sources.USER)}))}focus(){this.hasFocus()||(this.root.focus({preventScroll:!0}),this.setRange(this.savedRange))}format(t,e){this.scroll.update();const n=this.getNativeRange();if(null!=n&&n.native.collapsed&&!this.scroll.query(t,r.Scope.BLOCK)){if(n.start.node!==this.cursor.textNode){const t=this.scroll.find(n.start.node,!1);if(null==t)return;if(t instanceof r.LeafBlot){const e=t.split(n.start.offset);t.parent.insertBefore(this.cursor,e)}else t.insertBefore(this.cursor,n.start.node);this.cursor.attach()}this.cursor.format(t,e),this.scroll.optimize(),this.setNativeRange(this.cursor.textNode,this.cursor.textNode.data.length),this.update()}}getBounds(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const n=this.scroll.length();let r;t=Math.min(t,n-1),e=Math.min(t+e,n-1)-t;let[i,s]=this.scroll.leaf(t);if(null==i)return null;if(e>0&&s===i.length()){const[e]=this.scroll.leaf(t+1);if(e){const[n]=this.scroll.line(t),[r]=this.scroll.line(t+1);n===r&&(i=e,s=0)}}[r,s]=i.position(s,!0);const o=document.createRange();if(e>0)return o.setStart(r,s),[i,s]=this.scroll.leaf(t+e),null==i?null:([r,s]=i.position(s,!0),o.setEnd(r,s),o.getBoundingClientRect());let l,a="left";if(r instanceof Text){if(!r.data.length)return null;s0&&(a="right")}return{bottom:l.top+l.height,height:l.height,left:l[a],right:l[a],top:l.top,width:0}}getNativeRange(){const t=document.getSelection();if(null==t||t.rangeCount<=0)return null;const e=t.getRangeAt(0);if(null==e)return null;const n=this.normalizeNative(e);return l.info("getNativeRange",n),n}getRange(){const t=this.scroll.domNode;if("isConnected"in t&&!t.isConnected)return[null,null];const e=this.getNativeRange();return null==e?[null,null]:[this.normalizedToRange(e),e]}hasFocus(){return document.activeElement===this.root||null!=document.activeElement&&c(this.root,document.activeElement)}normalizedToRange(t){const e=[[t.start.node,t.start.offset]];t.native.collapsed||e.push([t.end.node,t.end.offset]);const n=e.map((t=>{const[e,n]=t,i=this.scroll.find(e,!0),s=i.offset(this.scroll);return 0===n?s:i instanceof r.LeafBlot?s+i.index(e,n):s+i.length()})),i=Math.min(Math.max(...n),this.scroll.length()-1),s=Math.min(i,...n);return new a(s,i-s)}normalizeNative(t){if(!c(this.root,t.startContainer)||!t.collapsed&&!c(this.root,t.endContainer))return null;const e={start:{node:t.startContainer,offset:t.startOffset},end:{node:t.endContainer,offset:t.endOffset},native:t};return[e.start,e.end].forEach((t=>{let{node:e,offset:n}=t;for(;!(e instanceof Text)&&e.childNodes.length>0;)if(e.childNodes.length>n)e=e.childNodes[n],n=0;else{if(e.childNodes.length!==n)break;e=e.lastChild,n=e instanceof Text?e.data.length:e.childNodes.length>0?e.childNodes.length:e.childNodes.length+1}t.node=e,t.offset=n})),e}rangeToNative(t){const e=this.scroll.length(),n=(t,n)=>{t=Math.min(e-1,t);const[r,i]=this.scroll.leaf(t);return r?r.position(i,n):[null,-1]};return[...n(t.index,!1),...n(t.index+t.length,!0)]}setNativeRange(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:e,i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];if(l.info("setNativeRange",t,e,n,r),null!=t&&(null==this.root.parentNode||null==t.parentNode||null==n.parentNode))return;const s=document.getSelection();if(null!=s)if(null!=t){this.hasFocus()||this.root.focus({preventScroll:!0});const{native:o}=this.getNativeRange()||{};if(null==o||i||t!==o.startContainer||e!==o.startOffset||n!==o.endContainer||r!==o.endOffset){t instanceof Element&&"BR"===t.tagName&&(e=Array.from(t.parentNode.childNodes).indexOf(t),t=t.parentNode),n instanceof Element&&"BR"===n.tagName&&(r=Array.from(n.parentNode.childNodes).indexOf(n),n=n.parentNode);const i=document.createRange();i.setStart(t,e),i.setEnd(n,r),s.removeAllRanges(),s.addRange(i)}}else s.removeAllRanges(),this.root.blur()}setRange(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:o.A.sources.API;if("string"==typeof e&&(n=e,e=!1),l.info("setRange",t),null!=t){const n=this.rangeToNative(t);this.setNativeRange(...n,e)}else this.setNativeRange(null);this.update(n)}update(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o.A.sources.USER;const e=this.lastRange,[n,r]=this.getRange();if(this.lastRange=n,this.lastNative=r,null!=this.lastRange&&(this.savedRange=this.lastRange),!(0,i.A)(e,this.lastRange)){if(!this.composing&&null!=r&&r.native.collapsed&&r.start.node!==this.cursor.textNode){const t=this.cursor.restore();t&&this.setNativeRange(t.startNode,t.startOffset,t.endNode,t.endOffset)}const n=[o.A.events.SELECTION_CHANGE,(0,s.A)(this.lastRange),(0,s.A)(e),t];this.emitter.emit(o.A.events.EDITOR_CHANGE,...n),t!==o.A.sources.SILENT&&this.emitter.emit(...n)}}}},9609:function(t,e){"use strict";class n{static DEFAULTS={modules:{}};static themes={default:n};modules={};constructor(t,e){this.quill=t,this.options=e}init(){Object.keys(this.options.modules).forEach((t=>{null==this.modules[t]&&this.addModule(t)}))}addModule(t){const e=this.quill.constructor.import(`modules/${t}`);return this.modules[t]=new e(this.quill,this.options.modules[t]||{}),this.modules[t]}}e.A=n},8276:function(t,e,n){"use strict";n.d(e,{Hu:function(){return l},gS:function(){return s},qh:function(){return o}});var r=n(6003);const i={scope:r.Scope.BLOCK,whitelist:["right","center","justify"]},s=new r.Attributor("align","align",i),o=new r.ClassAttributor("align","ql-align",i),l=new r.StyleAttributor("align","text-align",i)},9541:function(t,e,n){"use strict";n.d(e,{l:function(){return s},s:function(){return o}});var r=n(6003),i=n(8638);const s=new r.ClassAttributor("background","ql-bg",{scope:r.Scope.INLINE}),o=new i.a2("background","background-color",{scope:r.Scope.INLINE})},9404:function(t,e,n){"use strict";n.d(e,{Ay:function(){return h},Cy:function(){return d},EJ:function(){return u}});var r=n(9698),i=n(3036),s=n(4541),o=n(4850),l=n(5508),a=n(580),c=n(6142);class u extends a.A{static create(t){const e=super.create(t);return e.setAttribute("spellcheck","false"),e}code(t,e){return this.children.map((t=>t.length()<=1?"":t.domNode.innerText)).join("\n").slice(t,t+e)}html(t,e){return`\n${(0,l.X)(this.code(t,e))}\n `}}class h extends r.Ay{static TAB=" ";static register(){c.Ay.register(u)}}class d extends o.A{}d.blotName="code",d.tagName="CODE",h.blotName="code-block",h.className="ql-code-block",h.tagName="DIV",u.blotName="code-block-container",u.className="ql-code-block-container",u.tagName="DIV",u.allowedChildren=[h],h.allowedChildren=[l.A,i.A,s.A],h.requiredContainer=u},8638:function(t,e,n){"use strict";n.d(e,{JM:function(){return o},a2:function(){return i},g3:function(){return s}});var r=n(6003);class i extends r.StyleAttributor{value(t){let e=super.value(t);return e.startsWith("rgb(")?(e=e.replace(/^[^\d]+/,"").replace(/[^\d]+$/,""),`#${e.split(",").map((t=>`00${parseInt(t,10).toString(16)}`.slice(-2))).join("")}`):e}}const s=new r.ClassAttributor("color","ql-color",{scope:r.Scope.INLINE}),o=new i("color","color",{scope:r.Scope.INLINE})},7912:function(t,e,n){"use strict";n.d(e,{Mc:function(){return s},VL:function(){return l},sY:function(){return o}});var r=n(6003);const i={scope:r.Scope.BLOCK,whitelist:["rtl"]},s=new r.Attributor("direction","dir",i),o=new r.ClassAttributor("direction","ql-direction",i),l=new r.StyleAttributor("direction","direction",i)},6772:function(t,e,n){"use strict";n.d(e,{q:function(){return s},z:function(){return l}});var r=n(6003);const i={scope:r.Scope.INLINE,whitelist:["serif","monospace"]},s=new r.ClassAttributor("font","ql-font",i);class o extends r.StyleAttributor{value(t){return super.value(t).replace(/["']/g,"")}}const l=new o("font","font-family",i)},664:function(t,e,n){"use strict";n.d(e,{U:function(){return i},r:function(){return s}});var r=n(6003);const i=new r.ClassAttributor("size","ql-size",{scope:r.Scope.INLINE,whitelist:["small","large","huge"]}),s=new r.StyleAttributor("size","font-size",{scope:r.Scope.INLINE,whitelist:["10px","18px","32px"]})},584:function(t,e,n){"use strict";n.d(e,{Ay:function(){return S},hV:function(){return I}});var r=n(6003),i=n(5232),s=n.n(i),o=n(9698),l=n(6078),a=n(4266),c=n(6142),u=n(8276),h=n(9541),d=n(9404),f=n(8638),p=n(7912),g=n(6772),m=n(664),b=n(8123);const y=/font-weight:\s*normal/,v=["P","OL","UL"],A=t=>t&&v.includes(t.tagName),x=/\bmso-list:[^;]*ignore/i,N=/\bmso-list:[^;]*\bl(\d+)/i,E=/\bmso-list:[^;]*\blevel(\d+)/i,w=[function(t){"urn:schemas-microsoft-com:office:word"===t.documentElement.getAttribute("xmlns:w")&&(t=>{const e=Array.from(t.querySelectorAll("[style*=mso-list]")),n=[],r=[];e.forEach((t=>{(t.getAttribute("style")||"").match(x)?n.push(t):r.push(t)})),n.forEach((t=>t.parentNode?.removeChild(t)));const i=t.documentElement.innerHTML,s=r.map((t=>((t,e)=>{const n=t.getAttribute("style"),r=n?.match(N);if(!r)return null;const i=Number(r[1]),s=n?.match(E),o=s?Number(s[1]):1,l=new RegExp(`@list l${i}:level${o}\\s*\\{[^\\}]*mso-level-number-format:\\s*([\\w-]+)`,"i"),a=e.match(l);return{id:i,indent:o,type:a&&"bullet"===a[1]?"bullet":"ordered",element:t}})(t,i))).filter((t=>t));for(;s.length;){const t=[];let e=s.shift();for(;e;)t.push(e),e=s.length&&s[0]?.element===e.element.nextElementSibling&&s[0].id===e.id?s.shift():null;const n=document.createElement("ul");t.forEach((t=>{const e=document.createElement("li");e.setAttribute("data-list",t.type),t.indent>1&&e.setAttribute("class","ql-indent-"+(t.indent-1)),e.innerHTML=t.element.innerHTML,n.appendChild(e)}));const r=t[0]?.element,{parentNode:i}=r??{};r&&i?.replaceChild(n,r),t.slice(1).forEach((t=>{let{element:e}=t;i?.removeChild(e)}))}})(t)},function(t){t.querySelector('[id^="docs-internal-guid-"]')&&((t=>{Array.from(t.querySelectorAll('b[style*="font-weight"]')).filter((t=>t.getAttribute("style")?.match(y))).forEach((e=>{const n=t.createDocumentFragment();n.append(...e.childNodes),e.parentNode?.replaceChild(n,e)}))})(t),(t=>{Array.from(t.querySelectorAll("br")).filter((t=>A(t.previousElementSibling)&&A(t.nextElementSibling))).forEach((t=>{t.parentNode?.removeChild(t)}))})(t))}];const q=(0,l.A)("quill:clipboard"),k=[[Node.TEXT_NODE,function(t,e,n){let r=t.data;if("O:P"===t.parentElement?.tagName)return e.insert(r.trim());if(!R(t)){if(0===r.trim().length&&r.includes("\n")&&!function(t,e){return t.previousElementSibling&&t.nextElementSibling&&!j(t.previousElementSibling,e)&&!j(t.nextElementSibling,e)}(t,n))return e;r=r.replace(/[^\S\u00a0]/g," "),r=r.replace(/ {2,}/g," "),(null==t.previousSibling&&null!=t.parentElement&&j(t.parentElement,n)||t.previousSibling instanceof Element&&j(t.previousSibling,n))&&(r=r.replace(/^ /,"")),(null==t.nextSibling&&null!=t.parentElement&&j(t.parentElement,n)||t.nextSibling instanceof Element&&j(t.nextSibling,n))&&(r=r.replace(/ $/,"")),r=r.replaceAll("Â "," ")}return e.insert(r)}],[Node.TEXT_NODE,M],["br",function(t,e){return T(e,"\n")||e.insert("\n"),e}],[Node.ELEMENT_NODE,M],[Node.ELEMENT_NODE,function(t,e,n){const i=n.query(t);if(null==i)return e;if(i.prototype instanceof r.EmbedBlot){const e={},r=i.value(t);if(null!=r)return e[i.blotName]=r,(new(s())).insert(e,i.formats(t,n))}else if(i.prototype instanceof r.BlockBlot&&!T(e,"\n")&&e.insert("\n"),"blotName"in i&&"formats"in i&&"function"==typeof i.formats)return O(e,i.blotName,i.formats(t,n),n);return e}],[Node.ELEMENT_NODE,function(t,e,n){const i=r.Attributor.keys(t),s=r.ClassAttributor.keys(t),o=r.StyleAttributor.keys(t),l={};return i.concat(s).concat(o).forEach((e=>{let i=n.query(e,r.Scope.ATTRIBUTE);null!=i&&(l[i.attrName]=i.value(t),l[i.attrName])||(i=_[e],null==i||i.attrName!==e&&i.keyName!==e||(l[i.attrName]=i.value(t)||void 0),i=L[e],null==i||i.attrName!==e&&i.keyName!==e||(i=L[e],l[i.attrName]=i.value(t)||void 0))})),Object.entries(l).reduce(((t,e)=>{let[r,i]=e;return O(t,r,i,n)}),e)}],[Node.ELEMENT_NODE,function(t,e,n){const r={},i=t.style||{};return"italic"===i.fontStyle&&(r.italic=!0),"underline"===i.textDecoration&&(r.underline=!0),"line-through"===i.textDecoration&&(r.strike=!0),(i.fontWeight?.startsWith("bold")||parseInt(i.fontWeight,10)>=700)&&(r.bold=!0),e=Object.entries(r).reduce(((t,e)=>{let[r,i]=e;return O(t,r,i,n)}),e),parseFloat(i.textIndent||0)>0?(new(s())).insert("\t").concat(e):e}],["li",function(t,e,n){const r=n.query(t);if(null==r||"list"!==r.blotName||!T(e,"\n"))return e;let i=-1,o=t.parentNode;for(;null!=o;)["OL","UL"].includes(o.tagName)&&(i+=1),o=o.parentNode;return i<=0?e:e.reduce(((t,e)=>e.insert?e.attributes&&"number"==typeof e.attributes.indent?t.push(e):t.insert(e.insert,{indent:i,...e.attributes||{}}):t),new(s()))}],["ol, ul",function(t,e,n){const r=t;let i="OL"===r.tagName?"ordered":"bullet";const s=r.getAttribute("data-checked");return s&&(i="true"===s?"checked":"unchecked"),O(e,"list",i,n)}],["pre",function(t,e,n){const r=n.query("code-block");return O(e,"code-block",!r||!("formats"in r)||"function"!=typeof r.formats||r.formats(t,n),n)}],["tr",function(t,e,n){const r="TABLE"===t.parentElement?.tagName?t.parentElement:t.parentElement?.parentElement;return null!=r?O(e,"table",Array.from(r.querySelectorAll("tr")).indexOf(t)+1,n):e}],["b",B("bold")],["i",B("italic")],["strike",B("strike")],["style",function(){return new(s())}]],_=[u.gS,p.Mc].reduce(((t,e)=>(t[e.keyName]=e,t)),{}),L=[u.Hu,h.s,f.JM,p.VL,g.z,m.r].reduce(((t,e)=>(t[e.keyName]=e,t)),{});class S extends a.A{static DEFAULTS={matchers:[]};constructor(t,e){super(t,e),this.quill.root.addEventListener("copy",(t=>this.onCaptureCopy(t,!1))),this.quill.root.addEventListener("cut",(t=>this.onCaptureCopy(t,!0))),this.quill.root.addEventListener("paste",this.onCapturePaste.bind(this)),this.matchers=[],k.concat(this.options.matchers??[]).forEach((t=>{let[e,n]=t;this.addMatcher(e,n)}))}addMatcher(t,e){this.matchers.push([t,e])}convert(t){let{html:e,text:n}=t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(r[d.Ay.blotName])return(new(s())).insert(n||"",{[d.Ay.blotName]:r[d.Ay.blotName]});if(!e)return(new(s())).insert(n||"",r);const i=this.convertHTML(e);return T(i,"\n")&&(null==i.ops[i.ops.length-1].attributes||r.table)?i.compose((new(s())).retain(i.length()-1).delete(1)):i}normalizeHTML(t){(t=>{t.documentElement&&w.forEach((e=>{e(t)}))})(t)}convertHTML(t){const e=(new DOMParser).parseFromString(t,"text/html");this.normalizeHTML(e);const n=e.body,r=new WeakMap,[i,s]=this.prepareMatching(n,r);return I(this.quill.scroll,n,i,s,r)}dangerouslyPasteHTML(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:c.Ay.sources.API;if("string"==typeof t){const n=this.convert({html:t,text:""});this.quill.setContents(n,e),this.quill.setSelection(0,c.Ay.sources.SILENT)}else{const r=this.convert({html:e,text:""});this.quill.updateContents((new(s())).retain(t).concat(r),n),this.quill.setSelection(t+r.length(),c.Ay.sources.SILENT)}}onCaptureCopy(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(t.defaultPrevented)return;t.preventDefault();const[n]=this.quill.selection.getRange();if(null==n)return;const{html:r,text:i}=this.onCopy(n,e);t.clipboardData?.setData("text/plain",i),t.clipboardData?.setData("text/html",r),e&&(0,b.Xo)({range:n,quill:this.quill})}normalizeURIList(t){return t.split(/\r?\n/).filter((t=>"#"!==t[0])).join("\n")}onCapturePaste(t){if(t.defaultPrevented||!this.quill.isEnabled())return;t.preventDefault();const e=this.quill.getSelection(!0);if(null==e)return;const n=t.clipboardData?.getData("text/html");let r=t.clipboardData?.getData("text/plain");if(!n&&!r){const e=t.clipboardData?.getData("text/uri-list");e&&(r=this.normalizeURIList(e))}const i=Array.from(t.clipboardData?.files||[]);if(!n&&i.length>0)this.quill.uploader.upload(e,i);else{if(n&&i.length>0){const t=(new DOMParser).parseFromString(n,"text/html");if(1===t.body.childElementCount&&"IMG"===t.body.firstElementChild?.tagName)return void this.quill.uploader.upload(e,i)}this.onPaste(e,{html:n,text:r})}}onCopy(t){const e=this.quill.getText(t);return{html:this.quill.getSemanticHTML(t),text:e}}onPaste(t,e){let{text:n,html:r}=e;const i=this.quill.getFormat(t.index),o=this.convert({text:n,html:r},i);q.log("onPaste",o,{text:n,html:r});const l=(new(s())).retain(t.index).delete(t.length).concat(o);this.quill.updateContents(l,c.Ay.sources.USER),this.quill.setSelection(l.length()-t.length,c.Ay.sources.SILENT),this.quill.scrollSelectionIntoView()}prepareMatching(t,e){const n=[],r=[];return this.matchers.forEach((i=>{const[s,o]=i;switch(s){case Node.TEXT_NODE:r.push(o);break;case Node.ELEMENT_NODE:n.push(o);break;default:Array.from(t.querySelectorAll(s)).forEach((t=>{if(e.has(t)){const n=e.get(t);n?.push(o)}else e.set(t,[o])}))}})),[n,r]}}function O(t,e,n,r){return r.query(e)?t.reduce(((t,r)=>{if(!r.insert)return t;if(r.attributes&&r.attributes[e])return t.push(r);const i=n?{[e]:n}:{};return t.insert(r.insert,{...i,...r.attributes})}),new(s())):t}function T(t,e){let n="";for(let r=t.ops.length-1;r>=0&&n.lengthr(e,n,t)),new(s())):e.nodeType===e.ELEMENT_NODE?Array.from(e.childNodes||[]).reduce(((s,o)=>{let l=I(t,o,n,r,i);return o.nodeType===e.ELEMENT_NODE&&(l=n.reduce(((e,n)=>n(o,e,t)),l),l=(i.get(o)||[]).reduce(((e,n)=>n(o,e,t)),l)),s.concat(l)}),new(s())):new(s())}function B(t){return(e,n,r)=>O(n,t,!0,r)}function M(t,e,n){if(!T(e,"\n")){if(j(t,n)&&(t.childNodes.length>0||t instanceof HTMLParagraphElement))return e.insert("\n");if(e.length()>0&&t.nextSibling){let r=t.nextSibling;for(;null!=r;){if(j(r,n))return e.insert("\n");const t=n.query(r);if(t&&t.prototype instanceof o.zo)return e.insert("\n");r=r.firstChild}}}return e}},8123:function(t,e,n){"use strict";n.d(e,{Ay:function(){return f},Xo:function(){return v}});var r=n(5123),i=n(3707),s=n(5232),o=n.n(s),l=n(6003),a=n(6142),c=n(6078),u=n(4266);const h=(0,c.A)("quill:keyboard"),d=/Mac/i.test(navigator.platform)?"metaKey":"ctrlKey";class f extends u.A{static match(t,e){return!["altKey","ctrlKey","metaKey","shiftKey"].some((n=>!!e[n]!==t[n]&&null!==e[n]))&&(e.key===t.key||e.key===t.which)}constructor(t,e){super(t,e),this.bindings={},Object.keys(this.options.bindings).forEach((t=>{this.options.bindings[t]&&this.addBinding(this.options.bindings[t])})),this.addBinding({key:"Enter",shiftKey:null},this.handleEnter),this.addBinding({key:"Enter",metaKey:null,ctrlKey:null,altKey:null},(()=>{})),/Firefox/i.test(navigator.userAgent)?(this.addBinding({key:"Backspace"},{collapsed:!0},this.handleBackspace),this.addBinding({key:"Delete"},{collapsed:!0},this.handleDelete)):(this.addBinding({key:"Backspace"},{collapsed:!0,prefix:/^.?$/},this.handleBackspace),this.addBinding({key:"Delete"},{collapsed:!0,suffix:/^.?$/},this.handleDelete)),this.addBinding({key:"Backspace"},{collapsed:!1},this.handleDeleteRange),this.addBinding({key:"Delete"},{collapsed:!1},this.handleDeleteRange),this.addBinding({key:"Backspace",altKey:null,ctrlKey:null,metaKey:null,shiftKey:null},{collapsed:!0,offset:0},this.handleBackspace),this.listen()}addBinding(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const r=function(t){if("string"==typeof t||"number"==typeof t)t={key:t};else{if("object"!=typeof t)return null;t=(0,i.A)(t)}return t.shortKey&&(t[d]=t.shortKey,delete t.shortKey),t}(t);null!=r?("function"==typeof e&&(e={handler:e}),"function"==typeof n&&(n={handler:n}),(Array.isArray(r.key)?r.key:[r.key]).forEach((t=>{const i={...r,key:t,...e,...n};this.bindings[i.key]=this.bindings[i.key]||[],this.bindings[i.key].push(i)}))):h.warn("Attempted to add invalid keyboard binding",r)}listen(){this.quill.root.addEventListener("keydown",(t=>{if(t.defaultPrevented||t.isComposing)return;if(229===t.keyCode&&("Enter"===t.key||"Backspace"===t.key))return;const e=(this.bindings[t.key]||[]).concat(this.bindings[t.which]||[]).filter((e=>f.match(t,e)));if(0===e.length)return;const n=a.Ay.find(t.target,!0);if(n&&n.scroll!==this.quill.scroll)return;const i=this.quill.getSelection();if(null==i||!this.quill.hasFocus())return;const[s,o]=this.quill.getLine(i.index),[c,u]=this.quill.getLeaf(i.index),[h,d]=0===i.length?[c,u]:this.quill.getLeaf(i.index+i.length),p=c instanceof l.TextBlot?c.value().slice(0,u):"",g=h instanceof l.TextBlot?h.value().slice(d):"",m={collapsed:0===i.length,empty:0===i.length&&s.length()<=1,format:this.quill.getFormat(i),line:s,offset:o,prefix:p,suffix:g,event:t};e.some((t=>{if(null!=t.collapsed&&t.collapsed!==m.collapsed)return!1;if(null!=t.empty&&t.empty!==m.empty)return!1;if(null!=t.offset&&t.offset!==m.offset)return!1;if(Array.isArray(t.format)){if(t.format.every((t=>null==m.format[t])))return!1}else if("object"==typeof t.format&&!Object.keys(t.format).every((e=>!0===t.format[e]?null!=m.format[e]:!1===t.format[e]?null==m.format[e]:(0,r.A)(t.format[e],m.format[e]))))return!1;return!(null!=t.prefix&&!t.prefix.test(m.prefix)||null!=t.suffix&&!t.suffix.test(m.suffix)||!0===t.handler.call(this,i,m,t))}))&&t.preventDefault()}))}handleBackspace(t,e){const n=/[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test(e.prefix)?2:1;if(0===t.index||this.quill.getLength()<=1)return;let r={};const[i]=this.quill.getLine(t.index);let l=(new(o())).retain(t.index-n).delete(n);if(0===e.offset){const[e]=this.quill.getLine(t.index-1);if(e&&!("block"===e.statics.blotName&&e.length()<=1)){const e=i.formats(),n=this.quill.getFormat(t.index-1,1);if(r=s.AttributeMap.diff(e,n)||{},Object.keys(r).length>0){const e=(new(o())).retain(t.index+i.length()-2).retain(1,r);l=l.compose(e)}}}this.quill.updateContents(l,a.Ay.sources.USER),this.quill.focus()}handleDelete(t,e){const n=/^[\uD800-\uDBFF][\uDC00-\uDFFF]/.test(e.suffix)?2:1;if(t.index>=this.quill.getLength()-n)return;let r={};const[i]=this.quill.getLine(t.index);let l=(new(o())).retain(t.index).delete(n);if(e.offset>=i.length()-1){const[e]=this.quill.getLine(t.index+1);if(e){const n=i.formats(),o=this.quill.getFormat(t.index,1);r=s.AttributeMap.diff(n,o)||{},Object.keys(r).length>0&&(l=l.retain(e.length()-1).retain(1,r))}}this.quill.updateContents(l,a.Ay.sources.USER),this.quill.focus()}handleDeleteRange(t){v({range:t,quill:this.quill}),this.quill.focus()}handleEnter(t,e){const n=Object.keys(e.format).reduce(((t,n)=>(this.quill.scroll.query(n,l.Scope.BLOCK)&&!Array.isArray(e.format[n])&&(t[n]=e.format[n]),t)),{}),r=(new(o())).retain(t.index).delete(t.length).insert("\n",n);this.quill.updateContents(r,a.Ay.sources.USER),this.quill.setSelection(t.index+1,a.Ay.sources.SILENT),this.quill.focus()}}const p={bindings:{bold:b("bold"),italic:b("italic"),underline:b("underline"),indent:{key:"Tab",format:["blockquote","indent","list"],handler(t,e){return!(!e.collapsed||0===e.offset)||(this.quill.format("indent","+1",a.Ay.sources.USER),!1)}},outdent:{key:"Tab",shiftKey:!0,format:["blockquote","indent","list"],handler(t,e){return!(!e.collapsed||0===e.offset)||(this.quill.format("indent","-1",a.Ay.sources.USER),!1)}},"outdent backspace":{key:"Backspace",collapsed:!0,shiftKey:null,metaKey:null,ctrlKey:null,altKey:null,format:["indent","list"],offset:0,handler(t,e){null!=e.format.indent?this.quill.format("indent","-1",a.Ay.sources.USER):null!=e.format.list&&this.quill.format("list",!1,a.Ay.sources.USER)}},"indent code-block":g(!0),"outdent code-block":g(!1),"remove tab":{key:"Tab",shiftKey:!0,collapsed:!0,prefix:/\t$/,handler(t){this.quill.deleteText(t.index-1,1,a.Ay.sources.USER)}},tab:{key:"Tab",handler(t,e){if(e.format.table)return!0;this.quill.history.cutoff();const n=(new(o())).retain(t.index).delete(t.length).insert("\t");return this.quill.updateContents(n,a.Ay.sources.USER),this.quill.history.cutoff(),this.quill.setSelection(t.index+1,a.Ay.sources.SILENT),!1}},"blockquote empty enter":{key:"Enter",collapsed:!0,format:["blockquote"],empty:!0,handler(){this.quill.format("blockquote",!1,a.Ay.sources.USER)}},"list empty enter":{key:"Enter",collapsed:!0,format:["list"],empty:!0,handler(t,e){const n={list:!1};e.format.indent&&(n.indent=!1),this.quill.formatLine(t.index,t.length,n,a.Ay.sources.USER)}},"checklist enter":{key:"Enter",collapsed:!0,format:{list:"checked"},handler(t){const[e,n]=this.quill.getLine(t.index),r={...e.formats(),list:"checked"},i=(new(o())).retain(t.index).insert("\n",r).retain(e.length()-n-1).retain(1,{list:"unchecked"});this.quill.updateContents(i,a.Ay.sources.USER),this.quill.setSelection(t.index+1,a.Ay.sources.SILENT),this.quill.scrollSelectionIntoView()}},"header enter":{key:"Enter",collapsed:!0,format:["header"],suffix:/^$/,handler(t,e){const[n,r]=this.quill.getLine(t.index),i=(new(o())).retain(t.index).insert("\n",e.format).retain(n.length()-r-1).retain(1,{header:null});this.quill.updateContents(i,a.Ay.sources.USER),this.quill.setSelection(t.index+1,a.Ay.sources.SILENT),this.quill.scrollSelectionIntoView()}},"table backspace":{key:"Backspace",format:["table"],collapsed:!0,offset:0,handler(){}},"table delete":{key:"Delete",format:["table"],collapsed:!0,suffix:/^$/,handler(){}},"table enter":{key:"Enter",shiftKey:null,format:["table"],handler(t){const e=this.quill.getModule("table");if(e){const[n,r,i,s]=e.getTable(t),l=function(t,e,n,r){return null==e.prev&&null==e.next?null==n.prev&&null==n.next?0===r?-1:1:null==n.prev?-1:1:null==e.prev?-1:null==e.next?1:null}(0,r,i,s);if(null==l)return;let c=n.offset();if(l<0){const e=(new(o())).retain(c).insert("\n");this.quill.updateContents(e,a.Ay.sources.USER),this.quill.setSelection(t.index+1,t.length,a.Ay.sources.SILENT)}else if(l>0){c+=n.length();const t=(new(o())).retain(c).insert("\n");this.quill.updateContents(t,a.Ay.sources.USER),this.quill.setSelection(c,a.Ay.sources.USER)}}}},"table tab":{key:"Tab",shiftKey:null,format:["table"],handler(t,e){const{event:n,line:r}=e,i=r.offset(this.quill.scroll);n.shiftKey?this.quill.setSelection(i-1,a.Ay.sources.USER):this.quill.setSelection(i+r.length(),a.Ay.sources.USER)}},"list autofill":{key:" ",shiftKey:null,collapsed:!0,format:{"code-block":!1,blockquote:!1,table:!1},prefix:/^\s*?(\d+\.|-|\*|\[ ?\]|\[x\])$/,handler(t,e){if(null==this.quill.scroll.query("list"))return!0;const{length:n}=e.prefix,[r,i]=this.quill.getLine(t.index);if(i>n)return!0;let s;switch(e.prefix.trim()){case"[]":case"[ ]":s="unchecked";break;case"[x]":s="checked";break;case"-":case"*":s="bullet";break;default:s="ordered"}this.quill.insertText(t.index," ",a.Ay.sources.USER),this.quill.history.cutoff();const l=(new(o())).retain(t.index-i).delete(n+1).retain(r.length()-2-i).retain(1,{list:s});return this.quill.updateContents(l,a.Ay.sources.USER),this.quill.history.cutoff(),this.quill.setSelection(t.index-n,a.Ay.sources.SILENT),!1}},"code exit":{key:"Enter",collapsed:!0,format:["code-block"],prefix:/^$/,suffix:/^\s*$/,handler(t){const[e,n]=this.quill.getLine(t.index);let r=2,i=e;for(;null!=i&&i.length()<=1&&i.formats()["code-block"];)if(i=i.prev,r-=1,r<=0){const r=(new(o())).retain(t.index+e.length()-n-2).retain(1,{"code-block":null}).delete(1);return this.quill.updateContents(r,a.Ay.sources.USER),this.quill.setSelection(t.index-1,a.Ay.sources.SILENT),!1}return!0}},"embed left":m("ArrowLeft",!1),"embed left shift":m("ArrowLeft",!0),"embed right":m("ArrowRight",!1),"embed right shift":m("ArrowRight",!0),"table down":y(!1),"table up":y(!0)}};function g(t){return{key:"Tab",shiftKey:!t,format:{"code-block":!0},handler(e,n){let{event:r}=n;const i=this.quill.scroll.query("code-block"),{TAB:s}=i;if(0===e.length&&!r.shiftKey)return this.quill.insertText(e.index,s,a.Ay.sources.USER),void this.quill.setSelection(e.index+s.length,a.Ay.sources.SILENT);const o=0===e.length?this.quill.getLines(e.index,1):this.quill.getLines(e);let{index:l,length:c}=e;o.forEach(((e,n)=>{t?(e.insertAt(0,s),0===n?l+=s.length:c+=s.length):e.domNode.textContent.startsWith(s)&&(e.deleteAt(0,s.length),0===n?l-=s.length:c-=s.length)})),this.quill.update(a.Ay.sources.USER),this.quill.setSelection(l,c,a.Ay.sources.SILENT)}}}function m(t,e){return{key:t,shiftKey:e,altKey:null,["ArrowLeft"===t?"prefix":"suffix"]:/^$/,handler(n){let{index:r}=n;"ArrowRight"===t&&(r+=n.length+1);const[i]=this.quill.getLeaf(r);return!(i instanceof l.EmbedBlot&&("ArrowLeft"===t?e?this.quill.setSelection(n.index-1,n.length+1,a.Ay.sources.USER):this.quill.setSelection(n.index-1,a.Ay.sources.USER):e?this.quill.setSelection(n.index,n.length+1,a.Ay.sources.USER):this.quill.setSelection(n.index+n.length+1,a.Ay.sources.USER),1))}}}function b(t){return{key:t[0],shortKey:!0,handler(e,n){this.quill.format(t,!n.format[t],a.Ay.sources.USER)}}}function y(t){return{key:t?"ArrowUp":"ArrowDown",collapsed:!0,format:["table"],handler(e,n){const r=t?"prev":"next",i=n.line,s=i.parent[r];if(null!=s){if("table-row"===s.statics.blotName){let t=s.children.head,e=i;for(;null!=e.prev;)e=e.prev,t=t.next;const r=t.offset(this.quill.scroll)+Math.min(n.offset,t.length()-1);this.quill.setSelection(r,0,a.Ay.sources.USER)}}else{const e=i.table()[r];null!=e&&(t?this.quill.setSelection(e.offset(this.quill.scroll)+e.length()-1,0,a.Ay.sources.USER):this.quill.setSelection(e.offset(this.quill.scroll),0,a.Ay.sources.USER))}return!1}}}function v(t){let{quill:e,range:n}=t;const r=e.getLines(n);let i={};if(r.length>1){const t=r[0].formats(),e=r[r.length-1].formats();i=s.AttributeMap.diff(e,t)||{}}e.deleteText(n,a.Ay.sources.USER),Object.keys(i).length>0&&e.formatLine(n.index,1,i,a.Ay.sources.USER),e.setSelection(n.index,a.Ay.sources.SILENT)}f.DEFAULTS=p},8920:function(t){"use strict";var e=Object.prototype.hasOwnProperty,n="~";function r(){}function i(t,e,n){this.fn=t,this.context=e,this.once=n||!1}function s(t,e,r,s,o){if("function"!=typeof r)throw new TypeError("The listener must be a function");var l=new i(r,s||t,o),a=n?n+e:e;return t._events[a]?t._events[a].fn?t._events[a]=[t._events[a],l]:t._events[a].push(l):(t._events[a]=l,t._eventsCount++),t}function o(t,e){0==--t._eventsCount?t._events=new r:delete t._events[e]}function l(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(n=!1)),l.prototype.eventNames=function(){var t,r,i=[];if(0===this._eventsCount)return i;for(r in t=this._events)e.call(t,r)&&i.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?i.concat(Object.getOwnPropertySymbols(t)):i},l.prototype.listeners=function(t){var e=n?n+t:t,r=this._events[e];if(!r)return[];if(r.fn)return[r.fn];for(var i=0,s=r.length,o=new Array(s);io)){var d=e.slice(0,h);if((g=e.slice(h))===c){var f=Math.min(l,h);if((b=a.slice(0,f))===(A=d.slice(0,f)))return v(b,a.slice(f),d.slice(f),c)}}if(null===u||u===l){var p=l,g=(d=e.slice(0,p),e.slice(p));if(d===a){var m=Math.min(s-p,o-p);if((y=c.slice(c.length-m))===(x=g.slice(g.length-m)))return v(a,c.slice(0,c.length-m),g.slice(0,g.length-m),y)}}}if(r.length>0&&i&&0===i.length){var b=t.slice(0,r.index),y=t.slice(r.index+r.length);if(!(o<(f=b.length)+(m=y.length))){var A=e.slice(0,f),x=e.slice(o-m);if(b===A&&y===x)return v(b,t.slice(f,s-m),e.slice(f,o-m),y)}}return null}(t,g,m);if(A)return A}var x=o(t,g),N=t.substring(0,x);x=a(t=t.substring(x),g=g.substring(x));var E=t.substring(t.length-x),w=function(t,l){var c;if(!t)return[[n,l]];if(!l)return[[e,t]];var u=t.length>l.length?t:l,h=t.length>l.length?l:t,d=u.indexOf(h);if(-1!==d)return c=[[n,u.substring(0,d)],[r,h],[n,u.substring(d+h.length)]],t.length>l.length&&(c[0][0]=c[2][0]=e),c;if(1===h.length)return[[e,t],[n,l]];var f=function(t,e){var n=t.length>e.length?t:e,r=t.length>e.length?e:t;if(n.length<4||2*r.length=t.length?[r,i,s,l,h]:null}var s,l,c,u,h,d=i(n,r,Math.ceil(n.length/4)),f=i(n,r,Math.ceil(n.length/2));return d||f?(s=f?d&&d[4].length>f[4].length?d:f:d,t.length>e.length?(l=s[0],c=s[1],u=s[2],h=s[3]):(u=s[0],h=s[1],l=s[2],c=s[3]),[l,c,u,h,s[4]]):null}(t,l);if(f){var p=f[0],g=f[1],m=f[2],b=f[3],y=f[4],v=i(p,m),A=i(g,b);return v.concat([[r,y]],A)}return function(t,r){for(var i=t.length,o=r.length,l=Math.ceil((i+o)/2),a=l,c=2*l,u=new Array(c),h=new Array(c),d=0;di)m+=2;else if(N>o)g+=2;else if(p&&(q=a+f-A)>=0&&q=(w=i-h[q]))return s(t,r,_,N)}for(var E=-v+b;E<=v-y;E+=2){for(var w,q=a+E,k=(w=E===-v||E!==v&&h[q-1]i)y+=2;else if(k>o)b+=2;else if(!p){var _;if((x=a+f-E)>=0&&x=(w=i-w))return s(t,r,_,N)}}}return[[e,t],[n,r]]}(t,l)}(t=t.substring(0,t.length-x),g=g.substring(0,g.length-x));return N&&w.unshift([r,N]),E&&w.push([r,E]),p(w,y),b&&function(t){for(var i=!1,s=[],o=0,g=null,m=0,b=0,y=0,v=0,A=0;m0?s[o-1]:-1,b=0,y=0,v=0,A=0,g=null,i=!0)),m++;for(i&&p(t),function(t){function e(t,e){if(!t||!e)return 6;var n=t.charAt(t.length-1),r=e.charAt(0),i=n.match(c),s=r.match(c),o=i&&n.match(u),l=s&&r.match(u),a=o&&n.match(h),p=l&&r.match(h),g=a&&t.match(d),m=p&&e.match(f);return g||m?5:a||p?4:i&&!o&&l?3:o||l?2:i||s?1:0}for(var n=1;n=y&&(y=v,g=i,m=s,b=o)}t[n-1][1]!=g&&(g?t[n-1][1]=g:(t.splice(n-1,1),n--),t[n][1]=m,b?t[n+1][1]=b:(t.splice(n+1,1),n--))}n++}}(t),m=1;m=w?(E>=x.length/2||E>=N.length/2)&&(t.splice(m,0,[r,N.substring(0,E)]),t[m-1][1]=x.substring(0,x.length-E),t[m+1][1]=N.substring(E),m++):(w>=x.length/2||w>=N.length/2)&&(t.splice(m,0,[r,x.substring(0,w)]),t[m-1][0]=n,t[m-1][1]=N.substring(0,N.length-w),t[m+1][0]=e,t[m+1][1]=x.substring(w),m++),m++}m++}}(w),w}function s(t,e,n,r){var s=t.substring(0,n),o=e.substring(0,r),l=t.substring(n),a=e.substring(r),c=i(s,o),u=i(l,a);return c.concat(u)}function o(t,e){if(!t||!e||t.charAt(0)!==e.charAt(0))return 0;for(var n=0,r=Math.min(t.length,e.length),i=r,s=0;nr?t=t.substring(n-r):n=0&&y(t[f][1])){var g=t[f][1].slice(-1);if(t[f][1]=t[f][1].slice(0,-1),h=g+h,d=g+d,!t[f][1]){t.splice(f,1),l--;var m=f-1;t[m]&&t[m][0]===n&&(u++,d=t[m][1]+d,m--),t[m]&&t[m][0]===e&&(c++,h=t[m][1]+h,m--),f=m}}b(t[l][1])&&(g=t[l][1].charAt(0),t[l][1]=t[l][1].slice(1),h+=g,d+=g)}if(l0||d.length>0){h.length>0&&d.length>0&&(0!==(s=o(d,h))&&(f>=0?t[f][1]+=d.substring(0,s):(t.splice(0,0,[r,d.substring(0,s)]),l++),d=d.substring(s),h=h.substring(s)),0!==(s=a(d,h))&&(t[l][1]=d.substring(d.length-s)+t[l][1],d=d.substring(0,d.length-s),h=h.substring(0,h.length-s)));var v=u+c;0===h.length&&0===d.length?(t.splice(l-v,v),l-=v):0===h.length?(t.splice(l-v,v,[n,d]),l=l-v+1):0===d.length?(t.splice(l-v,v,[e,h]),l=l-v+1):(t.splice(l-v,v,[e,h],[n,d]),l=l-v+2)}0!==l&&t[l-1][0]===r?(t[l-1][1]+=t[l][1],t.splice(l,1)):l++,u=0,c=0,h="",d=""}""===t[t.length-1][1]&&t.pop();var A=!1;for(l=1;l=55296&&t<=56319}function m(t){return t>=56320&&t<=57343}function b(t){return m(t.charCodeAt(0))}function y(t){return g(t.charCodeAt(t.length-1))}function v(t,i,s,o){return y(t)||b(o)?null:function(t){for(var e=[],n=0;n0&&e.push(t[n]);return e}([[r,t],[e,i],[n,s],[r,o]])}function A(t,e,n,r){return i(t,e,n,r,!0)}A.INSERT=n,A.DELETE=e,A.EQUAL=r,t.exports=A},9629:function(t,e,n){t=n.nmd(t);var r="__lodash_hash_undefined__",i=9007199254740991,s="[object Arguments]",o="[object Boolean]",l="[object Date]",a="[object Function]",c="[object GeneratorFunction]",u="[object Map]",h="[object Number]",d="[object Object]",f="[object Promise]",p="[object RegExp]",g="[object Set]",m="[object String]",b="[object Symbol]",y="[object WeakMap]",v="[object ArrayBuffer]",A="[object DataView]",x="[object Float32Array]",N="[object Float64Array]",E="[object Int8Array]",w="[object Int16Array]",q="[object Int32Array]",k="[object Uint8Array]",_="[object Uint8ClampedArray]",L="[object Uint16Array]",S="[object Uint32Array]",O=/\w*$/,T=/^\[object .+?Constructor\]$/,j=/^(?:0|[1-9]\d*)$/,C={};C[s]=C["[object Array]"]=C[v]=C[A]=C[o]=C[l]=C[x]=C[N]=C[E]=C[w]=C[q]=C[u]=C[h]=C[d]=C[p]=C[g]=C[m]=C[b]=C[k]=C[_]=C[L]=C[S]=!0,C["[object Error]"]=C[a]=C[y]=!1;var R="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,I="object"==typeof self&&self&&self.Object===Object&&self,B=R||I||Function("return this")(),M=e&&!e.nodeType&&e,U=M&&t&&!t.nodeType&&t,D=U&&U.exports===M;function P(t,e){return t.set(e[0],e[1]),t}function z(t,e){return t.add(e),t}function F(t,e,n,r){var i=-1,s=t?t.length:0;for(r&&s&&(n=t[++i]);++i-1},_t.prototype.set=function(t,e){var n=this.__data__,r=Tt(n,t);return r<0?n.push([t,e]):n[r][1]=e,this},Lt.prototype.clear=function(){this.__data__={hash:new kt,map:new(pt||_t),string:new kt}},Lt.prototype.delete=function(t){return It(this,t).delete(t)},Lt.prototype.get=function(t){return It(this,t).get(t)},Lt.prototype.has=function(t){return It(this,t).has(t)},Lt.prototype.set=function(t,e){return It(this,t).set(t,e),this},St.prototype.clear=function(){this.__data__=new _t},St.prototype.delete=function(t){return this.__data__.delete(t)},St.prototype.get=function(t){return this.__data__.get(t)},St.prototype.has=function(t){return this.__data__.has(t)},St.prototype.set=function(t,e){var n=this.__data__;if(n instanceof _t){var r=n.__data__;if(!pt||r.length<199)return r.push([t,e]),this;n=this.__data__=new Lt(r)}return n.set(t,e),this};var Mt=ut?V(ut,Object):function(){return[]},Ut=function(t){return et.call(t)};function Dt(t,e){return!!(e=null==e?i:e)&&("number"==typeof t||j.test(t))&&t>-1&&t%1==0&&t-1&&t%1==0&&t<=i}(t.length)&&!Kt(t)}var Vt=ht||function(){return!1};function Kt(t){var e=Wt(t)?et.call(t):"";return e==a||e==c}function Wt(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function Zt(t){return $t(t)?function(t,e){var n=Ht(t)||function(t){return function(t){return function(t){return!!t&&"object"==typeof t}(t)&&$t(t)}(t)&&tt.call(t,"callee")&&(!at.call(t,"callee")||et.call(t)==s)}(t)?function(t,e){for(var n=-1,r=Array(t);++nc))return!1;var h=l.get(t);if(h&&l.get(e))return h==e;var d=-1,f=!0,p=n&s?new kt:void 0;for(l.set(t,e),l.set(e,t);++d-1},wt.prototype.set=function(t,e){var n=this.__data__,r=Lt(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this},qt.prototype.clear=function(){this.size=0,this.__data__={hash:new Et,map:new(ht||wt),string:new Et}},qt.prototype.delete=function(t){var e=Rt(this,t).delete(t);return this.size-=e?1:0,e},qt.prototype.get=function(t){return Rt(this,t).get(t)},qt.prototype.has=function(t){return Rt(this,t).has(t)},qt.prototype.set=function(t,e){var n=Rt(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this},kt.prototype.add=kt.prototype.push=function(t){return this.__data__.set(t,r),this},kt.prototype.has=function(t){return this.__data__.has(t)},_t.prototype.clear=function(){this.__data__=new wt,this.size=0},_t.prototype.delete=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n},_t.prototype.get=function(t){return this.__data__.get(t)},_t.prototype.has=function(t){return this.__data__.has(t)},_t.prototype.set=function(t,e){var n=this.__data__;if(n instanceof wt){var r=n.__data__;if(!ht||r.length<199)return r.push([t,e]),this.size=++n.size,this;n=this.__data__=new qt(r)}return n.set(t,e),this.size=n.size,this};var Bt=lt?function(t){return null==t?[]:(t=Object(t),function(e,n){for(var r=-1,i=null==e?0:e.length,s=0,o=[];++r-1&&t%1==0&&t-1&&t%1==0&&t<=o}function Kt(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function Wt(t){return null!=t&&"object"==typeof t}var Zt=D?function(t){return function(e){return t(e)}}(D):function(t){return Wt(t)&&Vt(t.length)&&!!O[St(t)]};function Gt(t){return null!=(e=t)&&Vt(e.length)&&!$t(e)?function(t,e){var n=Ft(t),r=!n&&zt(t),i=!n&&!r&&Ht(t),s=!n&&!r&&!i&&Zt(t),o=n||r||i||s,l=o?function(t,e){for(var n=-1,r=Array(t);++n(null!=i[e]&&(t[e]=i[e]),t)),{}));for(const n in t)void 0!==t[n]&&void 0===e[n]&&(i[n]=t[n]);return Object.keys(i).length>0?i:void 0},t.diff=function(t={},e={}){"object"!=typeof t&&(t={}),"object"!=typeof e&&(e={});const n=Object.keys(t).concat(Object.keys(e)).reduce(((n,r)=>(i(t[r],e[r])||(n[r]=void 0===e[r]?null:e[r]),n)),{});return Object.keys(n).length>0?n:void 0},t.invert=function(t={},e={}){t=t||{};const n=Object.keys(e).reduce(((n,r)=>(e[r]!==t[r]&&void 0!==t[r]&&(n[r]=e[r]),n)),{});return Object.keys(t).reduce(((n,r)=>(t[r]!==e[r]&&void 0===e[r]&&(n[r]=null),n)),n)},t.transform=function(t,e,n=!1){if("object"!=typeof t)return e;if("object"!=typeof e)return;if(!n)return e;const r=Object.keys(e).reduce(((n,r)=>(void 0===t[r]&&(n[r]=e[r]),n)),{});return Object.keys(r).length>0?r:void 0}}(s||(s={})),e.default=s},5232:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AttributeMap=e.OpIterator=e.Op=void 0;const r=n(5090),i=n(9629),s=n(4162),o=n(1270);e.AttributeMap=o.default;const l=n(4123);e.Op=l.default;const a=n(7033);e.OpIterator=a.default;const c=String.fromCharCode(0),u=(t,e)=>{if("object"!=typeof t||null===t)throw new Error("cannot retain a "+typeof t);if("object"!=typeof e||null===e)throw new Error("cannot retain a "+typeof e);const n=Object.keys(t)[0];if(!n||n!==Object.keys(e)[0])throw new Error(`embed types not matched: ${n} != ${Object.keys(e)[0]}`);return[n,t[n],e[n]]};class h{constructor(t){Array.isArray(t)?this.ops=t:null!=t&&Array.isArray(t.ops)?this.ops=t.ops:this.ops=[]}static registerEmbed(t,e){this.handlers[t]=e}static unregisterEmbed(t){delete this.handlers[t]}static getHandler(t){const e=this.handlers[t];if(!e)throw new Error(`no handlers for embed type "${t}"`);return e}insert(t,e){const n={};return"string"==typeof t&&0===t.length?this:(n.insert=t,null!=e&&"object"==typeof e&&Object.keys(e).length>0&&(n.attributes=e),this.push(n))}delete(t){return t<=0?this:this.push({delete:t})}retain(t,e){if("number"==typeof t&&t<=0)return this;const n={retain:t};return null!=e&&"object"==typeof e&&Object.keys(e).length>0&&(n.attributes=e),this.push(n)}push(t){let e=this.ops.length,n=this.ops[e-1];if(t=i(t),"object"==typeof n){if("number"==typeof t.delete&&"number"==typeof n.delete)return this.ops[e-1]={delete:n.delete+t.delete},this;if("number"==typeof n.delete&&null!=t.insert&&(e-=1,n=this.ops[e-1],"object"!=typeof n))return this.ops.unshift(t),this;if(s(t.attributes,n.attributes)){if("string"==typeof t.insert&&"string"==typeof n.insert)return this.ops[e-1]={insert:n.insert+t.insert},"object"==typeof t.attributes&&(this.ops[e-1].attributes=t.attributes),this;if("number"==typeof t.retain&&"number"==typeof n.retain)return this.ops[e-1]={retain:n.retain+t.retain},"object"==typeof t.attributes&&(this.ops[e-1].attributes=t.attributes),this}}return e===this.ops.length?this.ops.push(t):this.ops.splice(e,0,t),this}chop(){const t=this.ops[this.ops.length-1];return t&&"number"==typeof t.retain&&!t.attributes&&this.ops.pop(),this}filter(t){return this.ops.filter(t)}forEach(t){this.ops.forEach(t)}map(t){return this.ops.map(t)}partition(t){const e=[],n=[];return this.forEach((r=>{(t(r)?e:n).push(r)})),[e,n]}reduce(t,e){return this.ops.reduce(t,e)}changeLength(){return this.reduce(((t,e)=>e.insert?t+l.default.length(e):e.delete?t-e.delete:t),0)}length(){return this.reduce(((t,e)=>t+l.default.length(e)),0)}slice(t=0,e=1/0){const n=[],r=new a.default(this.ops);let i=0;for(;i0&&n.next(i.retain-t)}const l=new h(r);for(;e.hasNext()||n.hasNext();)if("insert"===n.peekType())l.push(n.next());else if("delete"===e.peekType())l.push(e.next());else{const t=Math.min(e.peekLength(),n.peekLength()),r=e.next(t),i=n.next(t);if(i.retain){const a={};if("number"==typeof r.retain)a.retain="number"==typeof i.retain?t:i.retain;else if("number"==typeof i.retain)null==r.retain?a.insert=r.insert:a.retain=r.retain;else{const t=null==r.retain?"insert":"retain",[e,n,s]=u(r[t],i.retain),o=h.getHandler(e);a[t]={[e]:o.compose(n,s,"retain"===t)}}const c=o.default.compose(r.attributes,i.attributes,"number"==typeof r.retain);if(c&&(a.attributes=c),l.push(a),!n.hasNext()&&s(l.ops[l.ops.length-1],a)){const t=new h(e.rest());return l.concat(t).chop()}}else"number"==typeof i.delete&&("number"==typeof r.retain||"object"==typeof r.retain&&null!==r.retain)&&l.push(i)}return l.chop()}concat(t){const e=new h(this.ops.slice());return t.ops.length>0&&(e.push(t.ops[0]),e.ops=e.ops.concat(t.ops.slice(1))),e}diff(t,e){if(this.ops===t.ops)return new h;const n=[this,t].map((e=>e.map((n=>{if(null!=n.insert)return"string"==typeof n.insert?n.insert:c;throw new Error("diff() called "+(e===t?"on":"with")+" non-document")})).join(""))),i=new h,l=r(n[0],n[1],e,!0),u=new a.default(this.ops),d=new a.default(t.ops);return l.forEach((t=>{let e=t[1].length;for(;e>0;){let n=0;switch(t[0]){case r.INSERT:n=Math.min(d.peekLength(),e),i.push(d.next(n));break;case r.DELETE:n=Math.min(e,u.peekLength()),u.next(n),i.delete(n);break;case r.EQUAL:n=Math.min(u.peekLength(),d.peekLength(),e);const t=u.next(n),l=d.next(n);s(t.insert,l.insert)?i.retain(n,o.default.diff(t.attributes,l.attributes)):i.push(l).delete(n)}e-=n}})),i.chop()}eachLine(t,e="\n"){const n=new a.default(this.ops);let r=new h,i=0;for(;n.hasNext();){if("insert"!==n.peekType())return;const s=n.peek(),o=l.default.length(s)-n.peekLength(),a="string"==typeof s.insert?s.insert.indexOf(e,o)-o:-1;if(a<0)r.push(n.next());else if(a>0)r.push(n.next(a));else{if(!1===t(r,n.next(1).attributes||{},i))return;i+=1,r=new h}}r.length()>0&&t(r,{},i)}invert(t){const e=new h;return this.reduce(((n,r)=>{if(r.insert)e.delete(l.default.length(r));else{if("number"==typeof r.retain&&null==r.attributes)return e.retain(r.retain),n+r.retain;if(r.delete||"number"==typeof r.retain){const i=r.delete||r.retain;return t.slice(n,n+i).forEach((t=>{r.delete?e.push(t):r.retain&&r.attributes&&e.retain(l.default.length(t),o.default.invert(r.attributes,t.attributes))})),n+i}if("object"==typeof r.retain&&null!==r.retain){const i=t.slice(n,n+1),s=new a.default(i.ops).next(),[l,c,d]=u(r.retain,s.insert),f=h.getHandler(l);return e.retain({[l]:f.invert(c,d)},o.default.invert(r.attributes,s.attributes)),n+1}}return n}),0),e.chop()}transform(t,e=!1){if(e=!!e,"number"==typeof t)return this.transformPosition(t,e);const n=t,r=new a.default(this.ops),i=new a.default(n.ops),s=new h;for(;r.hasNext()||i.hasNext();)if("insert"!==r.peekType()||!e&&"insert"===i.peekType())if("insert"===i.peekType())s.push(i.next());else{const t=Math.min(r.peekLength(),i.peekLength()),n=r.next(t),l=i.next(t);if(n.delete)continue;if(l.delete)s.push(l);else{const r=n.retain,i=l.retain;let a="object"==typeof i&&null!==i?i:t;if("object"==typeof r&&null!==r&&"object"==typeof i&&null!==i){const t=Object.keys(r)[0];if(t===Object.keys(i)[0]){const n=h.getHandler(t);n&&(a={[t]:n.transform(r[t],i[t],e)})}}s.retain(a,o.default.transform(n.attributes,l.attributes,e))}}else s.retain(l.default.length(r.next()));return s.chop()}transformPosition(t,e=!1){e=!!e;const n=new a.default(this.ops);let r=0;for(;n.hasNext()&&r<=t;){const i=n.peekLength(),s=n.peekType();n.next(),"delete"!==s?("insert"===s&&(r=i-n?(t=i-n,this.index+=1,this.offset=0):this.offset+=t,"number"==typeof e.delete)return{delete:t};{const r={};return e.attributes&&(r.attributes=e.attributes),"number"==typeof e.retain?r.retain=t:"object"==typeof e.retain&&null!==e.retain?r.retain=e.retain:"string"==typeof e.insert?r.insert=e.insert.substr(n,t):r.insert=e.insert,r}}return{retain:1/0}}peek(){return this.ops[this.index]}peekLength(){return this.ops[this.index]?r.default.length(this.ops[this.index])-this.offset:1/0}peekType(){const t=this.ops[this.index];return t?"number"==typeof t.delete?"delete":"number"==typeof t.retain||"object"==typeof t.retain&&null!==t.retain?"retain":"insert":"retain"}rest(){if(this.hasNext()){if(0===this.offset)return this.ops.slice(this.index);{const t=this.offset,e=this.index,n=this.next(),r=this.ops.slice(this.index);return this.offset=t,this.index=e,[n].concat(r)}}return[]}}},8820:function(t,e,n){"use strict";n.d(e,{A:function(){return l}});var r=n(8138),i=function(t,e){for(var n=t.length;n--;)if((0,r.A)(t[n][0],e))return n;return-1},s=Array.prototype.splice;function o(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1},o.prototype.set=function(t,e){var n=this.__data__,r=i(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this};var l=o},2461:function(t,e,n){"use strict";var r=n(2281),i=n(5507),s=(0,r.A)(i.A,"Map");e.A=s},3558:function(t,e,n){"use strict";n.d(e,{A:function(){return d}});var r=(0,n(2281).A)(Object,"create"),i=Object.prototype.hasOwnProperty,s=Object.prototype.hasOwnProperty;function o(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1&&t%1==0&&tc))return!1;var h=s.get(t),d=s.get(e);if(h&&d)return h==e&&d==t;var f=-1,p=!0,g=2&n?new o:void 0;for(s.set(t,e),s.set(e,t);++f-1&&t%1==0&&t<=9007199254740991}},659:function(t,e){"use strict";e.A=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},7948:function(t,e){"use strict";e.A=function(t){return null!=t&&"object"==typeof t}},5755:function(t,e,n){"use strict";n.d(e,{A:function(){return u}});var r=n(2159),i=n(1628),s=n(7948),o={};o["[object Float32Array]"]=o["[object Float64Array]"]=o["[object Int8Array]"]=o["[object Int16Array]"]=o["[object Int32Array]"]=o["[object Uint8Array]"]=o["[object Uint8ClampedArray]"]=o["[object Uint16Array]"]=o["[object Uint32Array]"]=!0,o["[object Arguments]"]=o["[object Array]"]=o["[object ArrayBuffer]"]=o["[object Boolean]"]=o["[object DataView]"]=o["[object Date]"]=o["[object Error]"]=o["[object Function]"]=o["[object Map]"]=o["[object Number]"]=o["[object Object]"]=o["[object RegExp]"]=o["[object Set]"]=o["[object String]"]=o["[object WeakMap]"]=!1;var l=n(5771),a=n(8795),c=a.A&&a.A.isTypedArray,u=c?(0,l.A)(c):function(t){return(0,s.A)(t)&&(0,i.A)(t.length)&&!!o[(0,r.A)(t)]}},3169:function(t,e,n){"use strict";n.d(e,{A:function(){return a}});var r=n(6753),i=n(501),s=(0,n(2217).A)(Object.keys,Object),o=Object.prototype.hasOwnProperty,l=n(3628),a=function(t){return(0,l.A)(t)?(0,r.A)(t):function(t){if(!(0,i.A)(t))return s(t);var e=[];for(var n in Object(t))o.call(t,n)&&"constructor"!=n&&e.push(n);return e}(t)}},2624:function(t,e,n){"use strict";n.d(e,{A:function(){return c}});var r=n(6753),i=n(659),s=n(501),o=Object.prototype.hasOwnProperty,l=function(t){if(!(0,i.A)(t))return function(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e}(t);var e=(0,s.A)(t),n=[];for(var r in t)("constructor"!=r||!e&&o.call(t,r))&&n.push(r);return n},a=n(3628),c=function(t){return(0,a.A)(t)?(0,r.A)(t,!0):l(t)}},8347:function(t,e,n){"use strict";n.d(e,{A:function(){return $}});var r,i,s,o,l=n(2673),a=n(6770),c=n(8138),u=function(t,e,n){(void 0!==n&&!(0,c.A)(t[e],n)||void 0===n&&!(e in t))&&(0,a.A)(t,e,n)},h=function(t,e,n){for(var r=-1,i=Object(t),s=n(t),o=s.length;o--;){var l=s[++r];if(!1===e(i[l],l,i))break}return t},d=n(3812),f=n(1827),p=n(4405),g=n(1683),m=n(8412),b=n(723),y=n(3628),v=n(7948),A=n(776),x=n(7572),N=n(659),E=n(2159),w=n(8769),q=Function.prototype,k=Object.prototype,_=q.toString,L=k.hasOwnProperty,S=_.call(Object),O=n(5755),T=function(t,e){if(("constructor"!==e||"function"!=typeof t[e])&&"__proto__"!=e)return t[e]},j=n(9601),C=n(2624),R=function(t,e,n,r,i,s,o){var l,a=T(t,n),c=T(e,n),h=o.get(c);if(h)u(t,n,h);else{var q=s?s(a,c,n+"",t,e,o):void 0,k=void 0===q;if(k){var R=(0,b.A)(c),I=!R&&(0,A.A)(c),B=!R&&!I&&(0,O.A)(c);q=c,R||I||B?(0,b.A)(a)?q=a:(l=a,(0,v.A)(l)&&(0,y.A)(l)?q=(0,p.A)(a):I?(k=!1,q=(0,d.A)(c,!0)):B?(k=!1,q=(0,f.A)(c,!0)):q=[]):function(t){if(!(0,v.A)(t)||"[object Object]"!=(0,E.A)(t))return!1;var e=(0,w.A)(t);if(null===e)return!0;var n=L.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&_.call(n)==S}(c)||(0,m.A)(c)?(q=a,(0,m.A)(a)?q=function(t){return(0,j.A)(t,(0,C.A)(t))}(a):(0,N.A)(a)&&!(0,x.A)(a)||(q=(0,g.A)(c))):k=!1}k&&(o.set(c,q),i(q,c,r,s,o),o.delete(c)),u(t,n,q)}},I=function t(e,n,r,i,s){e!==n&&h(n,(function(o,a){if(s||(s=new l.A),(0,N.A)(o))R(e,n,a,r,t,i,s);else{var c=i?i(T(e,a),o,a+"",e,n,s):void 0;void 0===c&&(c=o),u(e,a,c)}}),C.A)},B=function(t){return t},M=Math.max,U=n(7889),D=U.A?function(t,e){return(0,U.A)(t,"toString",{configurable:!0,enumerable:!1,value:(n=e,function(){return n}),writable:!0});var n}:B,P=Date.now,z=(r=D,i=0,s=0,function(){var t=P(),e=16-(t-s);if(s=t,e>0){if(++i>=800)return arguments[0]}else i=0;return r.apply(void 0,arguments)}),F=function(t,e){return z(function(t,e,n){return e=M(void 0===e?t.length-1:e,0),function(){for(var r=arguments,i=-1,s=M(r.length-e,0),o=Array(s);++i1?e[r-1]:void 0,s=r>2?e[2]:void 0;for(i=o.length>3&&"function"==typeof i?(r--,i):void 0,s&&function(t,e,n){if(!(0,N.A)(n))return!1;var r=typeof e;return!!("number"==r?(0,y.A)(n)&&(0,H.A)(e,n.length):"string"==r&&e in n)&&(0,c.A)(n[e],t)}(e[0],e[1],s)&&(i=r<3?void 0:i,r=1),t=Object(t);++n(t[t.TYPE=3]="TYPE",t[t.LEVEL=12]="LEVEL",t[t.ATTRIBUTE=13]="ATTRIBUTE",t[t.BLOT=14]="BLOT",t[t.INLINE=7]="INLINE",t[t.BLOCK=11]="BLOCK",t[t.BLOCK_BLOT=10]="BLOCK_BLOT",t[t.INLINE_BLOT=6]="INLINE_BLOT",t[t.BLOCK_ATTRIBUTE=9]="BLOCK_ATTRIBUTE",t[t.INLINE_ATTRIBUTE=5]="INLINE_ATTRIBUTE",t[t.ANY=15]="ANY",t))(r||{});class i{constructor(t,e,n={}){this.attrName=t,this.keyName=e;const i=r.TYPE&r.ATTRIBUTE;this.scope=null!=n.scope?n.scope&r.LEVEL|i:r.ATTRIBUTE,null!=n.whitelist&&(this.whitelist=n.whitelist)}static keys(t){return Array.from(t.attributes).map((t=>t.name))}add(t,e){return!!this.canAdd(t,e)&&(t.setAttribute(this.keyName,e),!0)}canAdd(t,e){return null==this.whitelist||("string"==typeof e?this.whitelist.indexOf(e.replace(/["']/g,""))>-1:this.whitelist.indexOf(e)>-1)}remove(t){t.removeAttribute(this.keyName)}value(t){const e=t.getAttribute(this.keyName);return this.canAdd(t,e)&&e?e:""}}class s extends Error{constructor(t){super(t="[Parchment] "+t),this.message=t,this.name=this.constructor.name}}const o=class t{constructor(){this.attributes={},this.classes={},this.tags={},this.types={}}static find(t,e=!1){if(null==t)return null;if(this.blots.has(t))return this.blots.get(t)||null;if(e){let n=null;try{n=t.parentNode}catch{return null}return this.find(n,e)}return null}create(e,n,r){const i=this.query(n);if(null==i)throw new s(`Unable to create ${n} blot`);const o=i,l=n instanceof Node||n.nodeType===Node.TEXT_NODE?n:o.create(r),a=new o(e,l,r);return t.blots.set(a.domNode,a),a}find(e,n=!1){return t.find(e,n)}query(t,e=r.ANY){let n;return"string"==typeof t?n=this.types[t]||this.attributes[t]:t instanceof Text||t.nodeType===Node.TEXT_NODE?n=this.types.text:"number"==typeof t?t&r.LEVEL&r.BLOCK?n=this.types.block:t&r.LEVEL&r.INLINE&&(n=this.types.inline):t instanceof Element&&((t.getAttribute("class")||"").split(/\s+/).some((t=>(n=this.classes[t],!!n))),n=n||this.tags[t.tagName]),null==n?null:"scope"in n&&e&r.LEVEL&n.scope&&e&r.TYPE&n.scope?n:null}register(...t){return t.map((t=>{const e="blotName"in t,n="attrName"in t;if(!e&&!n)throw new s("Invalid definition");if(e&&"abstract"===t.blotName)throw new s("Cannot register abstract class");const r=e?t.blotName:n?t.attrName:void 0;return this.types[r]=t,n?"string"==typeof t.keyName&&(this.attributes[t.keyName]=t):e&&(t.className&&(this.classes[t.className]=t),t.tagName&&(Array.isArray(t.tagName)?t.tagName=t.tagName.map((t=>t.toUpperCase())):t.tagName=t.tagName.toUpperCase(),(Array.isArray(t.tagName)?t.tagName:[t.tagName]).forEach((e=>{(null==this.tags[e]||null==t.className)&&(this.tags[e]=t)})))),t}))}};o.blots=new WeakMap;let l=o;function a(t,e){return(t.getAttribute("class")||"").split(/\s+/).filter((t=>0===t.indexOf(`${e}-`)))}const c=class extends i{static keys(t){return(t.getAttribute("class")||"").split(/\s+/).map((t=>t.split("-").slice(0,-1).join("-")))}add(t,e){return!!this.canAdd(t,e)&&(this.remove(t),t.classList.add(`${this.keyName}-${e}`),!0)}remove(t){a(t,this.keyName).forEach((e=>{t.classList.remove(e)})),0===t.classList.length&&t.removeAttribute("class")}value(t){const e=(a(t,this.keyName)[0]||"").slice(this.keyName.length+1);return this.canAdd(t,e)?e:""}};function u(t){const e=t.split("-"),n=e.slice(1).map((t=>t[0].toUpperCase()+t.slice(1))).join("");return e[0]+n}const h=class extends i{static keys(t){return(t.getAttribute("style")||"").split(";").map((t=>t.split(":")[0].trim()))}add(t,e){return!!this.canAdd(t,e)&&(t.style[u(this.keyName)]=e,!0)}remove(t){t.style[u(this.keyName)]="",t.getAttribute("style")||t.removeAttribute("style")}value(t){const e=t.style[u(this.keyName)];return this.canAdd(t,e)?e:""}},d=class{constructor(t){this.attributes={},this.domNode=t,this.build()}attribute(t,e){e?t.add(this.domNode,e)&&(null!=t.value(this.domNode)?this.attributes[t.attrName]=t:delete this.attributes[t.attrName]):(t.remove(this.domNode),delete this.attributes[t.attrName])}build(){this.attributes={};const t=l.find(this.domNode);if(null==t)return;const e=i.keys(this.domNode),n=c.keys(this.domNode),s=h.keys(this.domNode);e.concat(n).concat(s).forEach((e=>{const n=t.scroll.query(e,r.ATTRIBUTE);n instanceof i&&(this.attributes[n.attrName]=n)}))}copy(t){Object.keys(this.attributes).forEach((e=>{const n=this.attributes[e].value(this.domNode);t.format(e,n)}))}move(t){this.copy(t),Object.keys(this.attributes).forEach((t=>{this.attributes[t].remove(this.domNode)})),this.attributes={}}values(){return Object.keys(this.attributes).reduce(((t,e)=>(t[e]=this.attributes[e].value(this.domNode),t)),{})}},f=class{constructor(t,e){this.scroll=t,this.domNode=e,l.blots.set(e,this),this.prev=null,this.next=null}static create(t){if(null==this.tagName)throw new s("Blot definition missing tagName");let e,n;return Array.isArray(this.tagName)?("string"==typeof t?(n=t.toUpperCase(),parseInt(n,10).toString()===n&&(n=parseInt(n,10))):"number"==typeof t&&(n=t),e="number"==typeof n?document.createElement(this.tagName[n-1]):n&&this.tagName.indexOf(n)>-1?document.createElement(n):document.createElement(this.tagName[0])):e=document.createElement(this.tagName),this.className&&e.classList.add(this.className),e}get statics(){return this.constructor}attach(){}clone(){const t=this.domNode.cloneNode(!1);return this.scroll.create(t)}detach(){null!=this.parent&&this.parent.removeChild(this),l.blots.delete(this.domNode)}deleteAt(t,e){this.isolate(t,e).remove()}formatAt(t,e,n,i){const s=this.isolate(t,e);if(null!=this.scroll.query(n,r.BLOT)&&i)s.wrap(n,i);else if(null!=this.scroll.query(n,r.ATTRIBUTE)){const t=this.scroll.create(this.statics.scope);s.wrap(t),t.format(n,i)}}insertAt(t,e,n){const r=null==n?this.scroll.create("text",e):this.scroll.create(e,n),i=this.split(t);this.parent.insertBefore(r,i||void 0)}isolate(t,e){const n=this.split(t);if(null==n)throw new Error("Attempt to isolate at end");return n.split(e),n}length(){return 1}offset(t=this.parent){return null==this.parent||this===t?0:this.parent.children.offset(this)+this.parent.offset(t)}optimize(t){this.statics.requiredContainer&&!(this.parent instanceof this.statics.requiredContainer)&&this.wrap(this.statics.requiredContainer.blotName)}remove(){null!=this.domNode.parentNode&&this.domNode.parentNode.removeChild(this.domNode),this.detach()}replaceWith(t,e){const n="string"==typeof t?this.scroll.create(t,e):t;return null!=this.parent&&(this.parent.insertBefore(n,this.next||void 0),this.remove()),n}split(t,e){return 0===t?this:this.next}update(t,e){}wrap(t,e){const n="string"==typeof t?this.scroll.create(t,e):t;if(null!=this.parent&&this.parent.insertBefore(n,this.next||void 0),"function"!=typeof n.appendChild)throw new s(`Cannot wrap ${t}`);return n.appendChild(this),n}};f.blotName="abstract";let p=f;const g=class extends p{static value(t){return!0}index(t,e){return this.domNode===t||this.domNode.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY?Math.min(e,1):-1}position(t,e){let n=Array.from(this.parent.domNode.childNodes).indexOf(this.domNode);return t>0&&(n+=1),[this.parent.domNode,n]}value(){return{[this.statics.blotName]:this.statics.value(this.domNode)||!0}}};g.scope=r.INLINE_BLOT;const m=g;class b{constructor(){this.head=null,this.tail=null,this.length=0}append(...t){if(this.insertBefore(t[0],null),t.length>1){const e=t.slice(1);this.append(...e)}}at(t){const e=this.iterator();let n=e();for(;n&&t>0;)t-=1,n=e();return n}contains(t){const e=this.iterator();let n=e();for(;n;){if(n===t)return!0;n=e()}return!1}indexOf(t){const e=this.iterator();let n=e(),r=0;for(;n;){if(n===t)return r;r+=1,n=e()}return-1}insertBefore(t,e){null!=t&&(this.remove(t),t.next=e,null!=e?(t.prev=e.prev,null!=e.prev&&(e.prev.next=t),e.prev=t,e===this.head&&(this.head=t)):null!=this.tail?(this.tail.next=t,t.prev=this.tail,this.tail=t):(t.prev=null,this.head=this.tail=t),this.length+=1)}offset(t){let e=0,n=this.head;for(;null!=n;){if(n===t)return e;e+=n.length(),n=n.next}return-1}remove(t){this.contains(t)&&(null!=t.prev&&(t.prev.next=t.next),null!=t.next&&(t.next.prev=t.prev),t===this.head&&(this.head=t.next),t===this.tail&&(this.tail=t.prev),this.length-=1)}iterator(t=this.head){return()=>{const e=t;return null!=t&&(t=t.next),e}}find(t,e=!1){const n=this.iterator();let r=n();for(;r;){const i=r.length();if(ts?n(l,t-s,Math.min(e,s+r-t)):n(l,0,Math.min(r,t+e-s)),s+=r,l=o()}}map(t){return this.reduce(((e,n)=>(e.push(t(n)),e)),[])}reduce(t,e){const n=this.iterator();let r=n();for(;r;)e=t(e,r),r=n();return e}}function y(t,e){const n=e.find(t);if(n)return n;try{return e.create(t)}catch{const n=e.create(r.INLINE);return Array.from(t.childNodes).forEach((t=>{n.domNode.appendChild(t)})),t.parentNode&&t.parentNode.replaceChild(n.domNode,t),n.attach(),n}}const v=class t extends p{constructor(t,e){super(t,e),this.uiNode=null,this.build()}appendChild(t){this.insertBefore(t)}attach(){super.attach(),this.children.forEach((t=>{t.attach()}))}attachUI(e){null!=this.uiNode&&this.uiNode.remove(),this.uiNode=e,t.uiClass&&this.uiNode.classList.add(t.uiClass),this.uiNode.setAttribute("contenteditable","false"),this.domNode.insertBefore(this.uiNode,this.domNode.firstChild)}build(){this.children=new b,Array.from(this.domNode.childNodes).filter((t=>t!==this.uiNode)).reverse().forEach((t=>{try{const e=y(t,this.scroll);this.insertBefore(e,this.children.head||void 0)}catch(t){if(t instanceof s)return;throw t}}))}deleteAt(t,e){if(0===t&&e===this.length())return this.remove();this.children.forEachAt(t,e,((t,e,n)=>{t.deleteAt(e,n)}))}descendant(e,n=0){const[r,i]=this.children.find(n);return null==e.blotName&&e(r)||null!=e.blotName&&r instanceof e?[r,i]:r instanceof t?r.descendant(e,i):[null,-1]}descendants(e,n=0,r=Number.MAX_VALUE){let i=[],s=r;return this.children.forEachAt(n,r,((n,r,o)=>{(null==e.blotName&&e(n)||null!=e.blotName&&n instanceof e)&&i.push(n),n instanceof t&&(i=i.concat(n.descendants(e,r,s))),s-=o})),i}detach(){this.children.forEach((t=>{t.detach()})),super.detach()}enforceAllowedChildren(){let e=!1;this.children.forEach((n=>{e||this.statics.allowedChildren.some((t=>n instanceof t))||(n.statics.scope===r.BLOCK_BLOT?(null!=n.next&&this.splitAfter(n),null!=n.prev&&this.splitAfter(n.prev),n.parent.unwrap(),e=!0):n instanceof t?n.unwrap():n.remove())}))}formatAt(t,e,n,r){this.children.forEachAt(t,e,((t,e,i)=>{t.formatAt(e,i,n,r)}))}insertAt(t,e,n){const[r,i]=this.children.find(t);if(r)r.insertAt(i,e,n);else{const t=null==n?this.scroll.create("text",e):this.scroll.create(e,n);this.appendChild(t)}}insertBefore(t,e){null!=t.parent&&t.parent.children.remove(t);let n=null;this.children.insertBefore(t,e||null),t.parent=this,null!=e&&(n=e.domNode),(this.domNode.parentNode!==t.domNode||this.domNode.nextSibling!==n)&&this.domNode.insertBefore(t.domNode,n),t.attach()}length(){return this.children.reduce(((t,e)=>t+e.length()),0)}moveChildren(t,e){this.children.forEach((n=>{t.insertBefore(n,e)}))}optimize(t){if(super.optimize(t),this.enforceAllowedChildren(),null!=this.uiNode&&this.uiNode!==this.domNode.firstChild&&this.domNode.insertBefore(this.uiNode,this.domNode.firstChild),0===this.children.length)if(null!=this.statics.defaultChild){const t=this.scroll.create(this.statics.defaultChild.blotName);this.appendChild(t)}else this.remove()}path(e,n=!1){const[r,i]=this.children.find(e,n),s=[[this,e]];return r instanceof t?s.concat(r.path(i,n)):(null!=r&&s.push([r,i]),s)}removeChild(t){this.children.remove(t)}replaceWith(e,n){const r="string"==typeof e?this.scroll.create(e,n):e;return r instanceof t&&this.moveChildren(r),super.replaceWith(r)}split(t,e=!1){if(!e){if(0===t)return this;if(t===this.length())return this.next}const n=this.clone();return this.parent&&this.parent.insertBefore(n,this.next||void 0),this.children.forEachAt(t,this.length(),((t,r,i)=>{const s=t.split(r,e);null!=s&&n.appendChild(s)})),n}splitAfter(t){const e=this.clone();for(;null!=t.next;)e.appendChild(t.next);return this.parent&&this.parent.insertBefore(e,this.next||void 0),e}unwrap(){this.parent&&this.moveChildren(this.parent,this.next||void 0),this.remove()}update(t,e){const n=[],r=[];t.forEach((t=>{t.target===this.domNode&&"childList"===t.type&&(n.push(...t.addedNodes),r.push(...t.removedNodes))})),r.forEach((t=>{if(null!=t.parentNode&&"IFRAME"!==t.tagName&&document.body.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY)return;const e=this.scroll.find(t);null!=e&&(null==e.domNode.parentNode||e.domNode.parentNode===this.domNode)&&e.detach()})),n.filter((t=>t.parentNode===this.domNode&&t!==this.uiNode)).sort(((t,e)=>t===e?0:t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING?1:-1)).forEach((t=>{let e=null;null!=t.nextSibling&&(e=this.scroll.find(t.nextSibling));const n=y(t,this.scroll);(n.next!==e||null==n.next)&&(null!=n.parent&&n.parent.removeChild(this),this.insertBefore(n,e||void 0))})),this.enforceAllowedChildren()}};v.uiClass="";const A=v,x=class t extends A{static create(t){return super.create(t)}static formats(e,n){const r=n.query(t.blotName);if(null==r||e.tagName!==r.tagName){if("string"==typeof this.tagName)return!0;if(Array.isArray(this.tagName))return e.tagName.toLowerCase()}}constructor(t,e){super(t,e),this.attributes=new d(this.domNode)}format(e,n){if(e!==this.statics.blotName||n){const t=this.scroll.query(e,r.INLINE);if(null==t)return;t instanceof i?this.attributes.attribute(t,n):n&&(e!==this.statics.blotName||this.formats()[e]!==n)&&this.replaceWith(e,n)}else this.children.forEach((e=>{e instanceof t||(e=e.wrap(t.blotName,!0)),this.attributes.copy(e)})),this.unwrap()}formats(){const t=this.attributes.values(),e=this.statics.formats(this.domNode,this.scroll);return null!=e&&(t[this.statics.blotName]=e),t}formatAt(t,e,n,i){null!=this.formats()[n]||this.scroll.query(n,r.ATTRIBUTE)?this.isolate(t,e).format(n,i):super.formatAt(t,e,n,i)}optimize(e){super.optimize(e);const n=this.formats();if(0===Object.keys(n).length)return this.unwrap();const r=this.next;r instanceof t&&r.prev===this&&function(t,e){if(Object.keys(t).length!==Object.keys(e).length)return!1;for(const n in t)if(t[n]!==e[n])return!1;return!0}(n,r.formats())&&(r.moveChildren(this),r.remove())}replaceWith(t,e){const n=super.replaceWith(t,e);return this.attributes.copy(n),n}update(t,e){super.update(t,e),t.some((t=>t.target===this.domNode&&"attributes"===t.type))&&this.attributes.build()}wrap(e,n){const r=super.wrap(e,n);return r instanceof t&&this.attributes.move(r),r}};x.allowedChildren=[x,m],x.blotName="inline",x.scope=r.INLINE_BLOT,x.tagName="SPAN";const N=x,E=class t extends A{static create(t){return super.create(t)}static formats(e,n){const r=n.query(t.blotName);if(null==r||e.tagName!==r.tagName){if("string"==typeof this.tagName)return!0;if(Array.isArray(this.tagName))return e.tagName.toLowerCase()}}constructor(t,e){super(t,e),this.attributes=new d(this.domNode)}format(e,n){const s=this.scroll.query(e,r.BLOCK);null!=s&&(s instanceof i?this.attributes.attribute(s,n):e!==this.statics.blotName||n?n&&(e!==this.statics.blotName||this.formats()[e]!==n)&&this.replaceWith(e,n):this.replaceWith(t.blotName))}formats(){const t=this.attributes.values(),e=this.statics.formats(this.domNode,this.scroll);return null!=e&&(t[this.statics.blotName]=e),t}formatAt(t,e,n,i){null!=this.scroll.query(n,r.BLOCK)?this.format(n,i):super.formatAt(t,e,n,i)}insertAt(t,e,n){if(null==n||null!=this.scroll.query(e,r.INLINE))super.insertAt(t,e,n);else{const r=this.split(t);if(null==r)throw new Error("Attempt to insertAt after block boundaries");{const t=this.scroll.create(e,n);r.parent.insertBefore(t,r)}}}replaceWith(t,e){const n=super.replaceWith(t,e);return this.attributes.copy(n),n}update(t,e){super.update(t,e),t.some((t=>t.target===this.domNode&&"attributes"===t.type))&&this.attributes.build()}};E.blotName="block",E.scope=r.BLOCK_BLOT,E.tagName="P",E.allowedChildren=[N,E,m];const w=E,q=class extends A{checkMerge(){return null!==this.next&&this.next.statics.blotName===this.statics.blotName}deleteAt(t,e){super.deleteAt(t,e),this.enforceAllowedChildren()}formatAt(t,e,n,r){super.formatAt(t,e,n,r),this.enforceAllowedChildren()}insertAt(t,e,n){super.insertAt(t,e,n),this.enforceAllowedChildren()}optimize(t){super.optimize(t),this.children.length>0&&null!=this.next&&this.checkMerge()&&(this.next.moveChildren(this),this.next.remove())}};q.blotName="container",q.scope=r.BLOCK_BLOT;const k=q,_=class extends m{static formats(t,e){}format(t,e){super.formatAt(0,this.length(),t,e)}formatAt(t,e,n,r){0===t&&e===this.length()?this.format(n,r):super.formatAt(t,e,n,r)}formats(){return this.statics.formats(this.domNode,this.scroll)}},L={attributes:!0,characterData:!0,characterDataOldValue:!0,childList:!0,subtree:!0},S=class extends A{constructor(t,e){super(null,e),this.registry=t,this.scroll=this,this.build(),this.observer=new MutationObserver((t=>{this.update(t)})),this.observer.observe(this.domNode,L),this.attach()}create(t,e){return this.registry.create(this,t,e)}find(t,e=!1){const n=this.registry.find(t,e);return n?n.scroll===this?n:e?this.find(n.scroll.domNode.parentNode,!0):null:null}query(t,e=r.ANY){return this.registry.query(t,e)}register(...t){return this.registry.register(...t)}build(){null!=this.scroll&&super.build()}detach(){super.detach(),this.observer.disconnect()}deleteAt(t,e){this.update(),0===t&&e===this.length()?this.children.forEach((t=>{t.remove()})):super.deleteAt(t,e)}formatAt(t,e,n,r){this.update(),super.formatAt(t,e,n,r)}insertAt(t,e,n){this.update(),super.insertAt(t,e,n)}optimize(t=[],e={}){super.optimize(e);const n=e.mutationsMap||new WeakMap;let r=Array.from(this.observer.takeRecords());for(;r.length>0;)t.push(r.pop());const i=(t,e=!0)=>{null==t||t===this||null!=t.domNode.parentNode&&(n.has(t.domNode)||n.set(t.domNode,[]),e&&i(t.parent))},s=t=>{n.has(t.domNode)&&(t instanceof A&&t.children.forEach(s),n.delete(t.domNode),t.optimize(e))};let o=t;for(let e=0;o.length>0;e+=1){if(e>=100)throw new Error("[Parchment] Maximum optimize iterations reached");for(o.forEach((t=>{const e=this.find(t.target,!0);null!=e&&(e.domNode===t.target&&("childList"===t.type?(i(this.find(t.previousSibling,!1)),Array.from(t.addedNodes).forEach((t=>{const e=this.find(t,!1);i(e,!1),e instanceof A&&e.children.forEach((t=>{i(t,!1)}))}))):"attributes"===t.type&&i(e.prev)),i(e))})),this.children.forEach(s),o=Array.from(this.observer.takeRecords()),r=o.slice();r.length>0;)t.push(r.pop())}}update(t,e={}){t=t||this.observer.takeRecords();const n=new WeakMap;t.map((t=>{const e=this.find(t.target,!0);return null==e?null:n.has(e.domNode)?(n.get(e.domNode).push(t),null):(n.set(e.domNode,[t]),e)})).forEach((t=>{null!=t&&t!==this&&n.has(t.domNode)&&t.update(n.get(t.domNode)||[],e)})),e.mutationsMap=n,n.has(this.domNode)&&super.update(n.get(this.domNode),e),this.optimize(t,e)}};S.blotName="scroll",S.defaultChild=w,S.allowedChildren=[w,k],S.scope=r.BLOCK_BLOT,S.tagName="DIV";const O=S,T=class t extends m{static create(t){return document.createTextNode(t)}static value(t){return t.data}constructor(t,e){super(t,e),this.text=this.statics.value(this.domNode)}deleteAt(t,e){this.domNode.data=this.text=this.text.slice(0,t)+this.text.slice(t+e)}index(t,e){return this.domNode===t?e:-1}insertAt(t,e,n){null==n?(this.text=this.text.slice(0,t)+e+this.text.slice(t),this.domNode.data=this.text):super.insertAt(t,e,n)}length(){return this.text.length}optimize(e){super.optimize(e),this.text=this.statics.value(this.domNode),0===this.text.length?this.remove():this.next instanceof t&&this.next.prev===this&&(this.insertAt(this.length(),this.next.value()),this.next.remove())}position(t,e=!1){return[this.domNode,t]}split(t,e=!1){if(!e){if(0===t)return this;if(t===this.length())return this.next}const n=this.scroll.create(this.domNode.splitText(t));return this.parent.insertBefore(n,this.next||void 0),this.text=this.statics.value(this.domNode),n}update(t,e){t.some((t=>"characterData"===t.type&&t.target===this.domNode))&&(this.text=this.statics.value(this.domNode))}value(){return this.text}};T.blotName="text",T.scope=r.INLINE_BLOT;const j=T}},e={};function n(r){var i=e[r];if(void 0!==i)return i.exports;var s=e[r]={id:r,loaded:!1,exports:{}};return t[r](s,s.exports,n),s.loaded=!0,s.exports}n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,{a:e}),e},n.d=function(t,e){for(var r in e)n.o(e,r)&&!n.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.nmd=function(t){return t.paths=[],t.children||(t.children=[]),t};var r={};return function(){"use strict";n.d(r,{default:function(){return It}});var t=n(3729),e=n(8276),i=n(7912),s=n(6003);class o extends s.ClassAttributor{add(t,e){let n=0;if("+1"===e||"-1"===e){const r=this.value(t)||0;n="+1"===e?r+1:r-1}else"number"==typeof e&&(n=e);return 0===n?(this.remove(t),!0):super.add(t,n.toString())}canAdd(t,e){return super.canAdd(t,e)||super.canAdd(t,parseInt(e,10))}value(t){return parseInt(super.value(t),10)||void 0}}var l=new o("indent","ql-indent",{scope:s.Scope.BLOCK,whitelist:[1,2,3,4,5,6,7,8]}),a=n(9698);class c extends a.Ay{static blotName="blockquote";static tagName="blockquote"}var u=c;class h extends a.Ay{static blotName="header";static tagName=["H1","H2","H3","H4","H5","H6"];static formats(t){return this.tagName.indexOf(t.tagName)+1}}var d=h,f=n(580),p=n(6142);class g extends f.A{}g.blotName="list-container",g.tagName="OL";class m extends a.Ay{static create(t){const e=super.create();return e.setAttribute("data-list",t),e}static formats(t){return t.getAttribute("data-list")||void 0}static register(){p.Ay.register(g)}constructor(t,e){super(t,e);const n=e.ownerDocument.createElement("span"),r=n=>{if(!t.isEnabled())return;const r=this.statics.formats(e,t);"checked"===r?(this.format("list","unchecked"),n.preventDefault()):"unchecked"===r&&(this.format("list","checked"),n.preventDefault())};n.addEventListener("mousedown",r),n.addEventListener("touchstart",r),this.attachUI(n)}format(t,e){t===this.statics.blotName&&e?this.domNode.setAttribute("data-list",e):super.format(t,e)}}m.blotName="list",m.tagName="LI",g.allowedChildren=[m],m.requiredContainer=g;var b=n(9541),y=n(8638),v=n(6772),A=n(664),x=n(4850);class N extends x.A{static blotName="bold";static tagName=["STRONG","B"];static create(){return super.create()}static formats(){return!0}optimize(t){super.optimize(t),this.domNode.tagName!==this.statics.tagName[0]&&this.replaceWith(this.statics.blotName)}}var E=N;class w extends x.A{static blotName="link";static tagName="A";static SANITIZED_URL="about:blank";static PROTOCOL_WHITELIST=["http","https","mailto","tel","sms"];static create(t){const e=super.create(t);return e.setAttribute("href",this.sanitize(t)),e.setAttribute("rel","noopener noreferrer"),e.setAttribute("target","_blank"),e}static formats(t){return t.getAttribute("href")}static sanitize(t){return q(t,this.PROTOCOL_WHITELIST)?t:this.SANITIZED_URL}format(t,e){t===this.statics.blotName&&e?this.domNode.setAttribute("href",this.constructor.sanitize(e)):super.format(t,e)}}function q(t,e){const n=document.createElement("a");n.href=t;const r=n.href.slice(0,n.href.indexOf(":"));return e.indexOf(r)>-1}class k extends x.A{static blotName="script";static tagName=["SUB","SUP"];static create(t){return"super"===t?document.createElement("sup"):"sub"===t?document.createElement("sub"):super.create(t)}static formats(t){return"SUB"===t.tagName?"sub":"SUP"===t.tagName?"super":void 0}}var _=k;class L extends x.A{static blotName="underline";static tagName="U"}var S=L,O=n(746);class T extends O.A{static blotName="formula";static className="ql-formula";static tagName="SPAN";static create(t){if(null==window.katex)throw new Error("Formula module requires KaTeX.");const e=super.create(t);return"string"==typeof t&&(window.katex.render(t,e,{throwOnError:!1,errorColor:"#f00"}),e.setAttribute("data-value",t)),e}static value(t){return t.getAttribute("data-value")}html(){const{formula:t}=this.value();return`${t} `}}var j=T;const C=["alt","height","width"];class R extends s.EmbedBlot{static blotName="image";static tagName="IMG";static create(t){const e=super.create(t);return"string"==typeof t&&e.setAttribute("src",this.sanitize(t)),e}static formats(t){return C.reduce(((e,n)=>(t.hasAttribute(n)&&(e[n]=t.getAttribute(n)),e)),{})}static match(t){return/\.(jpe?g|gif|png)$/.test(t)||/^data:image\/.+;base64/.test(t)}static sanitize(t){return q(t,["http","https","data"])?t:"//:0"}static value(t){return t.getAttribute("src")}format(t,e){C.indexOf(t)>-1?e?this.domNode.setAttribute(t,e):this.domNode.removeAttribute(t):super.format(t,e)}}var I=R;const B=["height","width"];class M extends a.zo{static blotName="video";static className="ql-video";static tagName="IFRAME";static create(t){const e=super.create(t);return e.setAttribute("frameborder","0"),e.setAttribute("allowfullscreen","true"),e.setAttribute("src",this.sanitize(t)),e}static formats(t){return B.reduce(((e,n)=>(t.hasAttribute(n)&&(e[n]=t.getAttribute(n)),e)),{})}static sanitize(t){return w.sanitize(t)}static value(t){return t.getAttribute("src")}format(t,e){B.indexOf(t)>-1?e?this.domNode.setAttribute(t,e):this.domNode.removeAttribute(t):super.format(t,e)}html(){const{video:t}=this.value();return`${t} `}}var U=M,D=n(9404),P=n(5232),z=n.n(P),F=n(4266),H=n(3036),$=n(4541),V=n(5508),K=n(584);const W=new s.ClassAttributor("code-token","hljs",{scope:s.Scope.INLINE});class Z extends x.A{static formats(t,e){for(;null!=t&&t!==e.domNode;){if(t.classList&&t.classList.contains(D.Ay.className))return super.formats(t,e);t=t.parentNode}}constructor(t,e,n){super(t,e,n),W.add(this.domNode,n)}format(t,e){t!==Z.blotName?super.format(t,e):e?W.add(this.domNode,e):(W.remove(this.domNode),this.domNode.classList.remove(this.statics.className))}optimize(){super.optimize(...arguments),W.value(this.domNode)||this.unwrap()}}Z.blotName="code-token",Z.className="ql-token";class G extends D.Ay{static create(t){const e=super.create(t);return"string"==typeof t&&e.setAttribute("data-language",t),e}static formats(t){return t.getAttribute("data-language")||"plain"}static register(){}format(t,e){t===this.statics.blotName&&e?this.domNode.setAttribute("data-language",e):super.format(t,e)}replaceWith(t,e){return this.formatAt(0,this.length(),Z.blotName,!1),super.replaceWith(t,e)}}class X extends D.EJ{attach(){super.attach(),this.forceNext=!1,this.scroll.emitMount(this)}format(t,e){t===G.blotName&&(this.forceNext=!0,this.children.forEach((n=>{n.format(t,e)})))}formatAt(t,e,n,r){n===G.blotName&&(this.forceNext=!0),super.formatAt(t,e,n,r)}highlight(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(null==this.children.head)return;const n=`${Array.from(this.domNode.childNodes).filter((t=>t!==this.uiNode)).map((t=>t.textContent)).join("\n")}\n`,r=G.formats(this.children.head.domNode);if(e||this.forceNext||this.cachedText!==n){if(n.trim().length>0||null==this.cachedText){const e=this.children.reduce(((t,e)=>t.concat((0,a.mG)(e,!1))),new(z())),i=t(n,r);e.diff(i).reduce(((t,e)=>{let{retain:n,attributes:r}=e;return n?(r&&Object.keys(r).forEach((e=>{[G.blotName,Z.blotName].includes(e)&&this.formatAt(t,n,e,r[e])})),t+n):t}),0)}this.cachedText=n,this.forceNext=!1}}html(t,e){const[n]=this.children.find(t);return`\n${(0,V.X)(this.code(t,e))}\n `}optimize(t){if(super.optimize(t),null!=this.parent&&null!=this.children.head&&null!=this.uiNode){const t=G.formats(this.children.head.domNode);t!==this.uiNode.value&&(this.uiNode.value=t)}}}X.allowedChildren=[G],G.requiredContainer=X,G.allowedChildren=[Z,$.A,V.A,H.A];class Q extends F.A{static register(){p.Ay.register(Z,!0),p.Ay.register(G,!0),p.Ay.register(X,!0)}constructor(t,e){if(super(t,e),null==this.options.hljs)throw new Error("Syntax module requires highlight.js. Please include the library on the page before Quill.");this.languages=this.options.languages.reduce(((t,e)=>{let{key:n}=e;return t[n]=!0,t}),{}),this.highlightBlot=this.highlightBlot.bind(this),this.initListener(),this.initTimer()}initListener(){this.quill.on(p.Ay.events.SCROLL_BLOT_MOUNT,(t=>{if(!(t instanceof X))return;const e=this.quill.root.ownerDocument.createElement("select");this.options.languages.forEach((t=>{let{key:n,label:r}=t;const i=e.ownerDocument.createElement("option");i.textContent=r,i.setAttribute("value",n),e.appendChild(i)})),e.addEventListener("change",(()=>{t.format(G.blotName,e.value),this.quill.root.focus(),this.highlight(t,!0)})),null==t.uiNode&&(t.attachUI(e),t.children.head&&(e.value=G.formats(t.children.head.domNode)))}))}initTimer(){let t=null;this.quill.on(p.Ay.events.SCROLL_OPTIMIZE,(()=>{t&&clearTimeout(t),t=setTimeout((()=>{this.highlight(),t=null}),this.options.interval)}))}highlight(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.quill.selection.composing)return;this.quill.update(p.Ay.sources.USER);const n=this.quill.getSelection();(null==t?this.quill.scroll.descendants(X):[t]).forEach((t=>{t.highlight(this.highlightBlot,e)})),this.quill.update(p.Ay.sources.SILENT),null!=n&&this.quill.setSelection(n,p.Ay.sources.SILENT)}highlightBlot(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"plain";if(e=this.languages[e]?e:"plain","plain"===e)return(0,V.X)(t).split("\n").reduce(((t,n,r)=>(0!==r&&t.insert("\n",{[D.Ay.blotName]:e}),t.insert(n))),new(z()));const n=this.quill.root.ownerDocument.createElement("div");return n.classList.add(D.Ay.className),n.innerHTML=((t,e,n)=>{if("string"==typeof t.versionString){const r=t.versionString.split(".")[0];if(parseInt(r,10)>=11)return t.highlight(n,{language:e}).value}return t.highlight(e,n).value})(this.options.hljs,e,t),(0,K.hV)(this.quill.scroll,n,[(t,e)=>{const n=W.value(t);return n?e.compose((new(z())).retain(e.length(),{[Z.blotName]:n})):e}],[(t,n)=>t.data.split("\n").reduce(((t,n,r)=>(0!==r&&t.insert("\n",{[D.Ay.blotName]:e}),t.insert(n))),n)],new WeakMap)}}Q.DEFAULTS={hljs:window.hljs,interval:1e3,languages:[{key:"plain",label:"Plain"},{key:"bash",label:"Bash"},{key:"cpp",label:"C++"},{key:"cs",label:"C#"},{key:"css",label:"CSS"},{key:"diff",label:"Diff"},{key:"xml",label:"HTML/XML"},{key:"java",label:"Java"},{key:"javascript",label:"JavaScript"},{key:"markdown",label:"Markdown"},{key:"php",label:"PHP"},{key:"python",label:"Python"},{key:"ruby",label:"Ruby"},{key:"sql",label:"SQL"}]};class J extends a.Ay{static blotName="table";static tagName="TD";static create(t){const e=super.create();return t?e.setAttribute("data-row",t):e.setAttribute("data-row",nt()),e}static formats(t){if(t.hasAttribute("data-row"))return t.getAttribute("data-row")}cellOffset(){return this.parent?this.parent.children.indexOf(this):-1}format(t,e){t===J.blotName&&e?this.domNode.setAttribute("data-row",e):super.format(t,e)}row(){return this.parent}rowOffset(){return this.row()?this.row().rowOffset():-1}table(){return this.row()&&this.row().table()}}class Y extends f.A{static blotName="table-row";static tagName="TR";checkMerge(){if(super.checkMerge()&&null!=this.next.children.head){const t=this.children.head.formats(),e=this.children.tail.formats(),n=this.next.children.head.formats(),r=this.next.children.tail.formats();return t.table===e.table&&t.table===n.table&&t.table===r.table}return!1}optimize(t){super.optimize(t),this.children.forEach((t=>{if(null==t.next)return;const e=t.formats(),n=t.next.formats();if(e.table!==n.table){const e=this.splitAfter(t);e&&e.optimize(),this.prev&&this.prev.optimize()}}))}rowOffset(){return this.parent?this.parent.children.indexOf(this):-1}table(){return this.parent&&this.parent.parent}}class tt extends f.A{static blotName="table-body";static tagName="TBODY"}class et extends f.A{static blotName="table-container";static tagName="TABLE";balanceCells(){const t=this.descendants(Y),e=t.reduce(((t,e)=>Math.max(e.children.length,t)),0);t.forEach((t=>{new Array(e-t.children.length).fill(0).forEach((()=>{let e;null!=t.children.head&&(e=J.formats(t.children.head.domNode));const n=this.scroll.create(J.blotName,e);t.appendChild(n),n.optimize()}))}))}cells(t){return this.rows().map((e=>e.children.at(t)))}deleteColumn(t){const[e]=this.descendant(tt);null!=e&&null!=e.children.head&&e.children.forEach((e=>{const n=e.children.at(t);null!=n&&n.remove()}))}insertColumn(t){const[e]=this.descendant(tt);null!=e&&null!=e.children.head&&e.children.forEach((e=>{const n=e.children.at(t),r=J.formats(e.children.head.domNode),i=this.scroll.create(J.blotName,r);e.insertBefore(i,n)}))}insertRow(t){const[e]=this.descendant(tt);if(null==e||null==e.children.head)return;const n=nt(),r=this.scroll.create(Y.blotName);e.children.head.children.forEach((()=>{const t=this.scroll.create(J.blotName,n);r.appendChild(t)}));const i=e.children.at(t);e.insertBefore(r,i)}rows(){const t=this.children.head;return null==t?[]:t.children.map((t=>t))}}function nt(){return`row-${Math.random().toString(36).slice(2,6)}`}et.allowedChildren=[tt],tt.requiredContainer=et,tt.allowedChildren=[Y],Y.requiredContainer=tt,Y.allowedChildren=[J],J.requiredContainer=Y;class rt extends F.A{static register(){p.Ay.register(J),p.Ay.register(Y),p.Ay.register(tt),p.Ay.register(et)}constructor(){super(...arguments),this.listenBalanceCells()}balanceTables(){this.quill.scroll.descendants(et).forEach((t=>{t.balanceCells()}))}deleteColumn(){const[t,,e]=this.getTable();null!=e&&(t.deleteColumn(e.cellOffset()),this.quill.update(p.Ay.sources.USER))}deleteRow(){const[,t]=this.getTable();null!=t&&(t.remove(),this.quill.update(p.Ay.sources.USER))}deleteTable(){const[t]=this.getTable();if(null==t)return;const e=t.offset();t.remove(),this.quill.update(p.Ay.sources.USER),this.quill.setSelection(e,p.Ay.sources.SILENT)}getTable(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.quill.getSelection();if(null==t)return[null,null,null,-1];const[e,n]=this.quill.getLine(t.index);if(null==e||e.statics.blotName!==J.blotName)return[null,null,null,-1];const r=e.parent;return[r.parent.parent,r,e,n]}insertColumn(t){const e=this.quill.getSelection();if(!e)return;const[n,r,i]=this.getTable(e);if(null==i)return;const s=i.cellOffset();n.insertColumn(s+t),this.quill.update(p.Ay.sources.USER);let o=r.rowOffset();0===t&&(o+=1),this.quill.setSelection(e.index+o,e.length,p.Ay.sources.SILENT)}insertColumnLeft(){this.insertColumn(0)}insertColumnRight(){this.insertColumn(1)}insertRow(t){const e=this.quill.getSelection();if(!e)return;const[n,r,i]=this.getTable(e);if(null==i)return;const s=r.rowOffset();n.insertRow(s+t),this.quill.update(p.Ay.sources.USER),t>0?this.quill.setSelection(e,p.Ay.sources.SILENT):this.quill.setSelection(e.index+r.children.length,e.length,p.Ay.sources.SILENT)}insertRowAbove(){this.insertRow(0)}insertRowBelow(){this.insertRow(1)}insertTable(t,e){const n=this.quill.getSelection();if(null==n)return;const r=new Array(t).fill(0).reduce((t=>{const n=new Array(e).fill("\n").join("");return t.insert(n,{table:nt()})}),(new(z())).retain(n.index));this.quill.updateContents(r,p.Ay.sources.USER),this.quill.setSelection(n.index,p.Ay.sources.SILENT),this.balanceTables()}listenBalanceCells(){this.quill.on(p.Ay.events.SCROLL_OPTIMIZE,(t=>{t.some((t=>!!["TD","TR","TBODY","TABLE"].includes(t.target.tagName)&&(this.quill.once(p.Ay.events.TEXT_CHANGE,((t,e,n)=>{n===p.Ay.sources.USER&&this.balanceTables()})),!0)))}))}}var it=rt;const st=(0,n(6078).A)("quill:toolbar");class ot extends F.A{constructor(t,e){if(super(t,e),Array.isArray(this.options.container)){const e=document.createElement("div");e.setAttribute("role","toolbar"),function(t,e){Array.isArray(e[0])||(e=[e]),e.forEach((e=>{const n=document.createElement("span");n.classList.add("ql-formats"),e.forEach((t=>{if("string"==typeof t)lt(n,t);else{const e=Object.keys(t)[0],r=t[e];Array.isArray(r)?function(t,e,n){const r=document.createElement("select");r.classList.add(`ql-${e}`),n.forEach((t=>{const e=document.createElement("option");!1!==t?e.setAttribute("value",String(t)):e.setAttribute("selected","selected"),r.appendChild(e)})),t.appendChild(r)}(n,e,r):lt(n,e,r)}})),t.appendChild(n)}))}(e,this.options.container),t.container?.parentNode?.insertBefore(e,t.container),this.container=e}else"string"==typeof this.options.container?this.container=document.querySelector(this.options.container):this.container=this.options.container;this.container instanceof HTMLElement?(this.container.classList.add("ql-toolbar"),this.controls=[],this.handlers={},this.options.handlers&&Object.keys(this.options.handlers).forEach((t=>{const e=this.options.handlers?.[t];e&&this.addHandler(t,e)})),Array.from(this.container.querySelectorAll("button, select")).forEach((t=>{this.attach(t)})),this.quill.on(p.Ay.events.EDITOR_CHANGE,(()=>{const[t]=this.quill.selection.getRange();this.update(t)}))):st.error("Container required for toolbar",this.options)}addHandler(t,e){this.handlers[t]=e}attach(t){let e=Array.from(t.classList).find((t=>0===t.indexOf("ql-")));if(!e)return;if(e=e.slice(3),"BUTTON"===t.tagName&&t.setAttribute("type","button"),null==this.handlers[e]&&null==this.quill.scroll.query(e))return void st.warn("ignoring attaching to nonexistent format",e,t);const n="SELECT"===t.tagName?"change":"click";t.addEventListener(n,(n=>{let r;if("SELECT"===t.tagName){if(t.selectedIndex<0)return;const e=t.options[t.selectedIndex];r=!e.hasAttribute("selected")&&(e.value||!1)}else r=!t.classList.contains("ql-active")&&(t.value||!t.hasAttribute("value")),n.preventDefault();this.quill.focus();const[i]=this.quill.selection.getRange();if(null!=this.handlers[e])this.handlers[e].call(this,r);else if(this.quill.scroll.query(e).prototype instanceof s.EmbedBlot){if(r=prompt(`Enter ${e}`),!r)return;this.quill.updateContents((new(z())).retain(i.index).delete(i.length).insert({[e]:r}),p.Ay.sources.USER)}else this.quill.format(e,r,p.Ay.sources.USER);this.update(i)})),this.controls.push([e,t])}update(t){const e=null==t?{}:this.quill.getFormat(t);this.controls.forEach((n=>{const[r,i]=n;if("SELECT"===i.tagName){let n=null;if(null==t)n=null;else if(null==e[r])n=i.querySelector("option[selected]");else if(!Array.isArray(e[r])){let t=e[r];"string"==typeof t&&(t=t.replace(/"/g,'\\"')),n=i.querySelector(`option[value="${t}"]`)}null==n?(i.value="",i.selectedIndex=-1):n.selected=!0}else if(null==t)i.classList.remove("ql-active"),i.setAttribute("aria-pressed","false");else if(i.hasAttribute("value")){const t=e[r],n=t===i.getAttribute("value")||null!=t&&t.toString()===i.getAttribute("value")||null==t&&!i.getAttribute("value");i.classList.toggle("ql-active",n),i.setAttribute("aria-pressed",n.toString())}else{const t=null!=e[r];i.classList.toggle("ql-active",t),i.setAttribute("aria-pressed",t.toString())}}))}}function lt(t,e,n){const r=document.createElement("button");r.setAttribute("type","button"),r.classList.add(`ql-${e}`),r.setAttribute("aria-pressed","false"),null!=n?(r.value=n,r.setAttribute("aria-label",`${e}: ${n}`)):r.setAttribute("aria-label",e),t.appendChild(r)}ot.DEFAULTS={},ot.DEFAULTS={container:null,handlers:{clean(){const t=this.quill.getSelection();if(null!=t)if(0===t.length){const t=this.quill.getFormat();Object.keys(t).forEach((t=>{null!=this.quill.scroll.query(t,s.Scope.INLINE)&&this.quill.format(t,!1,p.Ay.sources.USER)}))}else this.quill.removeFormat(t.index,t.length,p.Ay.sources.USER)},direction(t){const{align:e}=this.quill.getFormat();"rtl"===t&&null==e?this.quill.format("align","right",p.Ay.sources.USER):t||"right"!==e||this.quill.format("align",!1,p.Ay.sources.USER),this.quill.format("direction",t,p.Ay.sources.USER)},indent(t){const e=this.quill.getSelection(),n=this.quill.getFormat(e),r=parseInt(n.indent||0,10);if("+1"===t||"-1"===t){let e="+1"===t?1:-1;"rtl"===n.direction&&(e*=-1),this.quill.format("indent",r+e,p.Ay.sources.USER)}},link(t){!0===t&&(t=prompt("Enter link URL:")),this.quill.format("link",t,p.Ay.sources.USER)},list(t){const e=this.quill.getSelection(),n=this.quill.getFormat(e);"check"===t?"checked"===n.list||"unchecked"===n.list?this.quill.format("list",!1,p.Ay.sources.USER):this.quill.format("list","unchecked",p.Ay.sources.USER):this.quill.format("list",t,p.Ay.sources.USER)}}};const at=' ';var ct={align:{"":' ',center:' ',right:' ',justify:' '},background:' ',blockquote:' ',bold:' ',clean:' ',code:at,"code-block":at,color:' ',direction:{"":' ',rtl:' '},formula:' ',header:{1:' ',2:' ',3:' ',4:' ',5:' ',6:' '},italic:' ',image:' ',indent:{"+1":' ',"-1":' '},link:' ',list:{bullet:' ',check:' ',ordered:' '},script:{sub:' ',super:' '},strike:' ',table:' ',underline:' ',video:' '};let ut=0;function ht(t,e){t.setAttribute(e,`${!("true"===t.getAttribute(e))}`)}var dt=class{constructor(t){this.select=t,this.container=document.createElement("span"),this.buildPicker(),this.select.style.display="none",this.select.parentNode.insertBefore(this.container,this.select),this.label.addEventListener("mousedown",(()=>{this.togglePicker()})),this.label.addEventListener("keydown",(t=>{switch(t.key){case"Enter":this.togglePicker();break;case"Escape":this.escape(),t.preventDefault()}})),this.select.addEventListener("change",this.update.bind(this))}togglePicker(){this.container.classList.toggle("ql-expanded"),ht(this.label,"aria-expanded"),ht(this.options,"aria-hidden")}buildItem(t){const e=document.createElement("span");e.tabIndex="0",e.setAttribute("role","button"),e.classList.add("ql-picker-item");const n=t.getAttribute("value");return n&&e.setAttribute("data-value",n),t.textContent&&e.setAttribute("data-label",t.textContent),e.addEventListener("click",(()=>{this.selectItem(e,!0)})),e.addEventListener("keydown",(t=>{switch(t.key){case"Enter":this.selectItem(e,!0),t.preventDefault();break;case"Escape":this.escape(),t.preventDefault()}})),e}buildLabel(){const t=document.createElement("span");return t.classList.add("ql-picker-label"),t.innerHTML=' ',t.tabIndex="0",t.setAttribute("role","button"),t.setAttribute("aria-expanded","false"),this.container.appendChild(t),t}buildOptions(){const t=document.createElement("span");t.classList.add("ql-picker-options"),t.setAttribute("aria-hidden","true"),t.tabIndex="-1",t.id=`ql-picker-options-${ut}`,ut+=1,this.label.setAttribute("aria-controls",t.id),this.options=t,Array.from(this.select.options).forEach((e=>{const n=this.buildItem(e);t.appendChild(n),!0===e.selected&&this.selectItem(n)})),this.container.appendChild(t)}buildPicker(){Array.from(this.select.attributes).forEach((t=>{this.container.setAttribute(t.name,t.value)})),this.container.classList.add("ql-picker"),this.label=this.buildLabel(),this.buildOptions()}escape(){this.close(),setTimeout((()=>this.label.focus()),1)}close(){this.container.classList.remove("ql-expanded"),this.label.setAttribute("aria-expanded","false"),this.options.setAttribute("aria-hidden","true")}selectItem(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const n=this.container.querySelector(".ql-selected");t!==n&&(null!=n&&n.classList.remove("ql-selected"),null!=t&&(t.classList.add("ql-selected"),this.select.selectedIndex=Array.from(t.parentNode.children).indexOf(t),t.hasAttribute("data-value")?this.label.setAttribute("data-value",t.getAttribute("data-value")):this.label.removeAttribute("data-value"),t.hasAttribute("data-label")?this.label.setAttribute("data-label",t.getAttribute("data-label")):this.label.removeAttribute("data-label"),e&&(this.select.dispatchEvent(new Event("change")),this.close())))}update(){let t;if(this.select.selectedIndex>-1){const e=this.container.querySelector(".ql-picker-options").children[this.select.selectedIndex];t=this.select.options[this.select.selectedIndex],this.selectItem(e)}else this.selectItem(null);const e=null!=t&&t!==this.select.querySelector("option[selected]");this.label.classList.toggle("ql-active",e)}},ft=class extends dt{constructor(t,e){super(t),this.label.innerHTML=e,this.container.classList.add("ql-color-picker"),Array.from(this.container.querySelectorAll(".ql-picker-item")).slice(0,7).forEach((t=>{t.classList.add("ql-primary")}))}buildItem(t){const e=super.buildItem(t);return e.style.backgroundColor=t.getAttribute("value")||"",e}selectItem(t,e){super.selectItem(t,e);const n=this.label.querySelector(".ql-color-label"),r=t&&t.getAttribute("data-value")||"";n&&("line"===n.tagName?n.style.stroke=r:n.style.fill=r)}},pt=class extends dt{constructor(t,e){super(t),this.container.classList.add("ql-icon-picker"),Array.from(this.container.querySelectorAll(".ql-picker-item")).forEach((t=>{t.innerHTML=e[t.getAttribute("data-value")||""]})),this.defaultItem=this.container.querySelector(".ql-selected"),this.selectItem(this.defaultItem)}selectItem(t,e){super.selectItem(t,e);const n=t||this.defaultItem;if(null!=n){if(this.label.innerHTML===n.innerHTML)return;this.label.innerHTML=n.innerHTML}}},gt=class{constructor(t,e){this.quill=t,this.boundsContainer=e||document.body,this.root=t.addContainer("ql-tooltip"),this.root.innerHTML=this.constructor.TEMPLATE,(t=>{const{overflowY:e}=getComputedStyle(t,null);return"visible"!==e&&"clip"!==e})(this.quill.root)&&this.quill.root.addEventListener("scroll",(()=>{this.root.style.marginTop=-1*this.quill.root.scrollTop+"px"})),this.hide()}hide(){this.root.classList.add("ql-hidden")}position(t){const e=t.left+t.width/2-this.root.offsetWidth/2,n=t.bottom+this.quill.root.scrollTop;this.root.style.left=`${e}px`,this.root.style.top=`${n}px`,this.root.classList.remove("ql-flip");const r=this.boundsContainer.getBoundingClientRect(),i=this.root.getBoundingClientRect();let s=0;if(i.right>r.right&&(s=r.right-i.right,this.root.style.left=`${e+s}px`),i.leftr.bottom){const e=i.bottom-i.top,r=t.bottom-t.top+e;this.root.style.top=n-r+"px",this.root.classList.add("ql-flip")}return s}show(){this.root.classList.remove("ql-editing"),this.root.classList.remove("ql-hidden")}},mt=n(8347),bt=n(5374),yt=n(9609);const vt=[!1,"center","right","justify"],At=["#000000","#e60000","#ff9900","#ffff00","#008a00","#0066cc","#9933ff","#ffffff","#facccc","#ffebcc","#ffffcc","#cce8cc","#cce0f5","#ebd6ff","#bbbbbb","#f06666","#ffc266","#ffff66","#66b966","#66a3e0","#c285ff","#888888","#a10000","#b26b00","#b2b200","#006100","#0047b2","#6b24b2","#444444","#5c0000","#663d00","#666600","#003700","#002966","#3d1466"],xt=[!1,"serif","monospace"],Nt=["1","2","3",!1],Et=["small",!1,"large","huge"];class wt extends yt.A{constructor(t,e){super(t,e);const n=e=>{document.body.contains(t.root)?(null==this.tooltip||this.tooltip.root.contains(e.target)||document.activeElement===this.tooltip.textbox||this.quill.hasFocus()||this.tooltip.hide(),null!=this.pickers&&this.pickers.forEach((t=>{t.container.contains(e.target)||t.close()}))):document.body.removeEventListener("click",n)};t.emitter.listenDOM("click",document.body,n)}addModule(t){const e=super.addModule(t);return"toolbar"===t&&this.extendToolbar(e),e}buildButtons(t,e){Array.from(t).forEach((t=>{(t.getAttribute("class")||"").split(/\s+/).forEach((n=>{if(n.startsWith("ql-")&&(n=n.slice(3),null!=e[n]))if("direction"===n)t.innerHTML=e[n][""]+e[n].rtl;else if("string"==typeof e[n])t.innerHTML=e[n];else{const r=t.value||"";null!=r&&e[n][r]&&(t.innerHTML=e[n][r])}}))}))}buildPickers(t,e){this.pickers=Array.from(t).map((t=>{if(t.classList.contains("ql-align")&&(null==t.querySelector("option")&&kt(t,vt),"object"==typeof e.align))return new pt(t,e.align);if(t.classList.contains("ql-background")||t.classList.contains("ql-color")){const n=t.classList.contains("ql-background")?"background":"color";return null==t.querySelector("option")&&kt(t,At,"background"===n?"#ffffff":"#000000"),new ft(t,e[n])}return null==t.querySelector("option")&&(t.classList.contains("ql-font")?kt(t,xt):t.classList.contains("ql-header")?kt(t,Nt):t.classList.contains("ql-size")&&kt(t,Et)),new dt(t)})),this.quill.on(bt.A.events.EDITOR_CHANGE,(()=>{this.pickers.forEach((t=>{t.update()}))}))}}wt.DEFAULTS=(0,mt.A)({},yt.A.DEFAULTS,{modules:{toolbar:{handlers:{formula(){this.quill.theme.tooltip.edit("formula")},image(){let t=this.container.querySelector("input.ql-image[type=file]");null==t&&(t=document.createElement("input"),t.setAttribute("type","file"),t.setAttribute("accept",this.quill.uploader.options.mimetypes.join(", ")),t.classList.add("ql-image"),t.addEventListener("change",(()=>{const e=this.quill.getSelection(!0);this.quill.uploader.upload(e,t.files),t.value=""})),this.container.appendChild(t)),t.click()},video(){this.quill.theme.tooltip.edit("video")}}}}});class qt extends gt{constructor(t,e){super(t,e),this.textbox=this.root.querySelector('input[type="text"]'),this.listen()}listen(){this.textbox.addEventListener("keydown",(t=>{"Enter"===t.key?(this.save(),t.preventDefault()):"Escape"===t.key&&(this.cancel(),t.preventDefault())}))}cancel(){this.hide(),this.restoreFocus()}edit(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"link",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(this.root.classList.remove("ql-hidden"),this.root.classList.add("ql-editing"),null==this.textbox)return;null!=e?this.textbox.value=e:t!==this.root.getAttribute("data-mode")&&(this.textbox.value="");const n=this.quill.getBounds(this.quill.selection.savedRange);null!=n&&this.position(n),this.textbox.select(),this.textbox.setAttribute("placeholder",this.textbox.getAttribute(`data-${t}`)||""),this.root.setAttribute("data-mode",t)}restoreFocus(){this.quill.focus({preventScroll:!0})}save(){let{value:t}=this.textbox;switch(this.root.getAttribute("data-mode")){case"link":{const{scrollTop:e}=this.quill.root;this.linkRange?(this.quill.formatText(this.linkRange,"link",t,bt.A.sources.USER),delete this.linkRange):(this.restoreFocus(),this.quill.format("link",t,bt.A.sources.USER)),this.quill.root.scrollTop=e;break}case"video":t=function(t){let e=t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtube\.com\/watch.*v=([a-zA-Z0-9_-]+)/)||t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtu\.be\/([a-zA-Z0-9_-]+)/);return e?`${e[1]||"https"}://www.youtube.com/embed/${e[2]}?showinfo=0`:(e=t.match(/^(?:(https?):\/\/)?(?:www\.)?vimeo\.com\/(\d+)/))?`${e[1]||"https"}://player.vimeo.com/video/${e[2]}/`:t}(t);case"formula":{if(!t)break;const e=this.quill.getSelection(!0);if(null!=e){const n=e.index+e.length;this.quill.insertEmbed(n,this.root.getAttribute("data-mode"),t,bt.A.sources.USER),"formula"===this.root.getAttribute("data-mode")&&this.quill.insertText(n+1," ",bt.A.sources.USER),this.quill.setSelection(n+2,bt.A.sources.USER)}break}}this.textbox.value="",this.hide()}}function kt(t,e){let n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];e.forEach((e=>{const r=document.createElement("option");e===n?r.setAttribute("selected","selected"):r.setAttribute("value",String(e)),t.appendChild(r)}))}var _t=n(8298);const Lt=[["bold","italic","link"],[{header:1},{header:2},"blockquote"]];class St extends qt{static TEMPLATE=[' ','"].join("");constructor(t,e){super(t,e),this.quill.on(bt.A.events.EDITOR_CHANGE,((t,e,n,r)=>{if(t===bt.A.events.SELECTION_CHANGE)if(null!=e&&e.length>0&&r===bt.A.sources.USER){this.show(),this.root.style.left="0px",this.root.style.width="",this.root.style.width=`${this.root.offsetWidth}px`;const t=this.quill.getLines(e.index,e.length);if(1===t.length){const t=this.quill.getBounds(e);null!=t&&this.position(t)}else{const n=t[t.length-1],r=this.quill.getIndex(n),i=Math.min(n.length()-1,e.index+e.length-r),s=this.quill.getBounds(new _t.Q(r,i));null!=s&&this.position(s)}}else document.activeElement!==this.textbox&&this.quill.hasFocus()&&this.hide()}))}listen(){super.listen(),this.root.querySelector(".ql-close").addEventListener("click",(()=>{this.root.classList.remove("ql-editing")})),this.quill.on(bt.A.events.SCROLL_OPTIMIZE,(()=>{setTimeout((()=>{if(this.root.classList.contains("ql-hidden"))return;const t=this.quill.getSelection();if(null!=t){const e=this.quill.getBounds(t);null!=e&&this.position(e)}}),1)}))}cancel(){this.show()}position(t){const e=super.position(t),n=this.root.querySelector(".ql-tooltip-arrow");return n.style.marginLeft="",0!==e&&(n.style.marginLeft=-1*e-n.offsetWidth/2+"px"),e}}class Ot extends wt{constructor(t,e){null!=e.modules.toolbar&&null==e.modules.toolbar.container&&(e.modules.toolbar.container=Lt),super(t,e),this.quill.container.classList.add("ql-bubble")}extendToolbar(t){this.tooltip=new St(this.quill,this.options.bounds),null!=t.container&&(this.tooltip.root.appendChild(t.container),this.buildButtons(t.container.querySelectorAll("button"),ct),this.buildPickers(t.container.querySelectorAll("select"),ct))}}Ot.DEFAULTS=(0,mt.A)({},wt.DEFAULTS,{modules:{toolbar:{handlers:{link(t){t?this.quill.theme.tooltip.edit():this.quill.format("link",!1,p.Ay.sources.USER)}}}}});const Tt=[[{header:["1","2","3",!1]}],["bold","italic","underline","link"],[{list:"ordered"},{list:"bullet"}],["clean"]];class jt extends qt{static TEMPLATE=[' ',' ',' ',' '].join("");preview=this.root.querySelector("a.ql-preview");listen(){super.listen(),this.root.querySelector("a.ql-action").addEventListener("click",(t=>{this.root.classList.contains("ql-editing")?this.save():this.edit("link",this.preview.textContent),t.preventDefault()})),this.root.querySelector("a.ql-remove").addEventListener("click",(t=>{if(null!=this.linkRange){const t=this.linkRange;this.restoreFocus(),this.quill.formatText(t,"link",!1,bt.A.sources.USER),delete this.linkRange}t.preventDefault(),this.hide()})),this.quill.on(bt.A.events.SELECTION_CHANGE,((t,e,n)=>{if(null!=t){if(0===t.length&&n===bt.A.sources.USER){const[e,n]=this.quill.scroll.descendant(w,t.index);if(null!=e){this.linkRange=new _t.Q(t.index-n,e.length());const r=w.formats(e.domNode);this.preview.textContent=r,this.preview.setAttribute("href",r),this.show();const i=this.quill.getBounds(this.linkRange);return void(null!=i&&this.position(i))}}else delete this.linkRange;this.hide()}}))}show(){super.show(),this.root.removeAttribute("data-mode")}}class Ct extends wt{constructor(t,e){null!=e.modules.toolbar&&null==e.modules.toolbar.container&&(e.modules.toolbar.container=Tt),super(t,e),this.quill.container.classList.add("ql-snow")}extendToolbar(t){null!=t.container&&(t.container.classList.add("ql-snow"),this.buildButtons(t.container.querySelectorAll("button"),ct),this.buildPickers(t.container.querySelectorAll("select"),ct),this.tooltip=new jt(this.quill,this.options.bounds),t.container.querySelector(".ql-link")&&this.quill.keyboard.addBinding({key:"k",shortKey:!0},((e,n)=>{t.handlers.link.call(t,!n.format.link)})))}}Ct.DEFAULTS=(0,mt.A)({},wt.DEFAULTS,{modules:{toolbar:{handlers:{link(t){if(t){const t=this.quill.getSelection();if(null==t||0===t.length)return;let e=this.quill.getText(t);/^\S+@\S+\.\S+$/.test(e)&&0!==e.indexOf("mailto:")&&(e=`mailto:${e}`);const{tooltip:n}=this.quill.theme;n.edit("link",e)}else this.quill.format("link",!1,p.Ay.sources.USER)}}}}});var Rt=Ct;t.default.register({"attributors/attribute/direction":i.Mc,"attributors/class/align":e.qh,"attributors/class/background":b.l,"attributors/class/color":y.g3,"attributors/class/direction":i.sY,"attributors/class/font":v.q,"attributors/class/size":A.U,"attributors/style/align":e.Hu,"attributors/style/background":b.s,"attributors/style/color":y.JM,"attributors/style/direction":i.VL,"attributors/style/font":v.z,"attributors/style/size":A.r},!0),t.default.register({"formats/align":e.qh,"formats/direction":i.sY,"formats/indent":l,"formats/background":b.s,"formats/color":y.JM,"formats/font":v.q,"formats/size":A.U,"formats/blockquote":u,"formats/code-block":D.Ay,"formats/header":d,"formats/list":m,"formats/bold":E,"formats/code":D.Cy,"formats/italic":class extends E{static blotName="italic";static tagName=["EM","I"]},"formats/link":w,"formats/script":_,"formats/strike":class extends E{static blotName="strike";static tagName=["S","STRIKE"]},"formats/underline":S,"formats/formula":j,"formats/image":I,"formats/video":U,"modules/syntax":Q,"modules/table":it,"modules/toolbar":ot,"themes/bubble":Ot,"themes/snow":Rt,"ui/icons":ct,"ui/picker":dt,"ui/icon-picker":pt,"ui/color-picker":ft,"ui/tooltip":gt},!0);var It=t.default}(),r.default}()}));
+//# sourceMappingURL=quill.js.map
\ No newline at end of file
diff --git a/src/test/resources/libraries/quill/quill.snow.css b/src/test/resources/libraries/quill/quill.snow.css
new file mode 100644
index 00000000000..c95a80e2331
--- /dev/null
+++ b/src/test/resources/libraries/quill/quill.snow.css
@@ -0,0 +1,10 @@
+/*!
+ * Quill Editor v2.0.3
+ * https://quilljs.com
+ * Copyright (c) 2017-2024, Slab
+ * Copyright (c) 2014, Jason Chen
+ * Copyright (c) 2013, salesforce.com
+ */
+.ql-container{box-sizing:border-box;font-family:Helvetica,Arial,sans-serif;font-size:13px;height:100%;margin:0;position:relative}.ql-container.ql-disabled .ql-tooltip{visibility:hidden}.ql-container:not(.ql-disabled) li[data-list=checked] > .ql-ui,.ql-container:not(.ql-disabled) li[data-list=unchecked] > .ql-ui{cursor:pointer}.ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.ql-clipboard p{margin:0;padding:0}.ql-editor{box-sizing:border-box;counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;line-height:1.42;height:100%;outline:none;overflow-y:auto;padding:12px 15px;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap;word-wrap:break-word}.ql-editor > *{cursor:text}.ql-editor p,.ql-editor ol,.ql-editor pre,.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{margin:0;padding:0}@supports (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-set:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor table{border-collapse:collapse}.ql-editor td{border:1px solid #000;padding:2px 5px}.ql-editor ol{padding-left:1.5em}.ql-editor li{list-style-type:none;padding-left:1.5em;position:relative}.ql-editor li > .ql-ui:before{display:inline-block;margin-left:-1.5em;margin-right:.3em;text-align:right;white-space:nowrap;width:1.2em}.ql-editor li[data-list=checked] > .ql-ui,.ql-editor li[data-list=unchecked] > .ql-ui{color:#777}.ql-editor li[data-list=bullet] > .ql-ui:before{content:'\2022'}.ql-editor li[data-list=checked] > .ql-ui:before{content:'\2611'}.ql-editor li[data-list=unchecked] > .ql-ui:before{content:'\2610'}@supports (counter-set:none){.ql-editor li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list]{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered]{counter-increment:list-0}.ql-editor li[data-list=ordered] > .ql-ui:before{content:counter(list-0, decimal) '. '}.ql-editor li[data-list=ordered].ql-indent-1{counter-increment:list-1}.ql-editor li[data-list=ordered].ql-indent-1 > .ql-ui:before{content:counter(list-1, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-set:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-2{counter-increment:list-2}.ql-editor li[data-list=ordered].ql-indent-2 > .ql-ui:before{content:counter(list-2, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-set:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-3{counter-increment:list-3}.ql-editor li[data-list=ordered].ql-indent-3 > .ql-ui:before{content:counter(list-3, decimal) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-set:list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-4{counter-increment:list-4}.ql-editor li[data-list=ordered].ql-indent-4 > .ql-ui:before{content:counter(list-4, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-set:list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-5{counter-increment:list-5}.ql-editor li[data-list=ordered].ql-indent-5 > .ql-ui:before{content:counter(list-5, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-set:list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-6{counter-increment:list-6}.ql-editor li[data-list=ordered].ql-indent-6 > .ql-ui:before{content:counter(list-6, decimal) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-set:list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-reset:list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-7{counter-increment:list-7}.ql-editor li[data-list=ordered].ql-indent-7 > .ql-ui:before{content:counter(list-7, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-set:list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-reset:list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-8{counter-increment:list-8}.ql-editor li[data-list=ordered].ql-indent-8 > .ql-ui:before{content:counter(list-8, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-set:list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-reset:list-9}}.ql-editor li[data-list=ordered].ql-indent-9{counter-increment:list-9}.ql-editor li[data-list=ordered].ql-indent-9 > .ql-ui:before{content:counter(list-9, decimal) '. '}.ql-editor .ql-indent-1:not(.ql-direction-rtl){padding-left:3em}.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:4.5em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:3em}.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:4.5em}.ql-editor .ql-indent-2:not(.ql-direction-rtl){padding-left:6em}.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:7.5em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:7.5em}.ql-editor .ql-indent-3:not(.ql-direction-rtl){padding-left:9em}.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:10.5em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:9em}.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:10.5em}.ql-editor .ql-indent-4:not(.ql-direction-rtl){padding-left:12em}.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:13.5em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:13.5em}.ql-editor .ql-indent-5:not(.ql-direction-rtl){padding-left:15em}.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:16.5em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:15em}.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:16.5em}.ql-editor .ql-indent-6:not(.ql-direction-rtl){padding-left:18em}.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:19.5em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:19.5em}.ql-editor .ql-indent-7:not(.ql-direction-rtl){padding-left:21em}.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:22.5em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:21em}.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:22.5em}.ql-editor .ql-indent-8:not(.ql-direction-rtl){padding-left:24em}.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:25.5em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:24em}.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:25.5em}.ql-editor .ql-indent-9:not(.ql-direction-rtl){padding-left:27em}.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:28.5em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:27em}.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:28.5em}.ql-editor li.ql-direction-rtl{padding-right:1.5em}.ql-editor li.ql-direction-rtl > .ql-ui:before{margin-left:.3em;margin-right:-1.5em;text-align:left}.ql-editor table{table-layout:fixed;width:100%}.ql-editor table td{outline:none}.ql-editor .ql-code-block-container{font-family:monospace}.ql-editor .ql-video{display:block;max-width:100%}.ql-editor .ql-video.ql-align-center{margin:0 auto}.ql-editor .ql-video.ql-align-right{margin:0 0 0 auto}.ql-editor .ql-bg-black{background-color:#000}.ql-editor .ql-bg-red{background-color:#e60000}.ql-editor .ql-bg-orange{background-color:#f90}.ql-editor .ql-bg-yellow{background-color:#ff0}.ql-editor .ql-bg-green{background-color:#008a00}.ql-editor .ql-bg-blue{background-color:#06c}.ql-editor .ql-bg-purple{background-color:#93f}.ql-editor .ql-color-white{color:#fff}.ql-editor .ql-color-red{color:#e60000}.ql-editor .ql-color-orange{color:#f90}.ql-editor .ql-color-yellow{color:#ff0}.ql-editor .ql-color-green{color:#008a00}.ql-editor .ql-color-blue{color:#06c}.ql-editor .ql-color-purple{color:#93f}.ql-editor .ql-font-serif{font-family:Georgia,Times New Roman,serif}.ql-editor .ql-font-monospace{font-family:Monaco,Courier New,monospace}.ql-editor .ql-size-small{font-size:.75em}.ql-editor .ql-size-large{font-size:1.5em}.ql-editor .ql-size-huge{font-size:2.5em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor .ql-ui{position:absolute}.ql-editor.ql-blank::before{color:rgba(0,0,0,0.6);content:attr(data-placeholder);font-style:italic;left:15px;pointer-events:none;position:absolute;right:15px}.ql-snow.ql-toolbar:after,.ql-snow .ql-toolbar:after{clear:both;content:'';display:table}.ql-snow.ql-toolbar button,.ql-snow .ql-toolbar button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.ql-snow.ql-toolbar button svg,.ql-snow .ql-toolbar button svg{float:left;height:100%}.ql-snow.ql-toolbar button:active:hover,.ql-snow .ql-toolbar button:active:hover{outline:none}.ql-snow.ql-toolbar input.ql-image[type=file],.ql-snow .ql-toolbar input.ql-image[type=file]{display:none}.ql-snow.ql-toolbar button:hover,.ql-snow .ql-toolbar button:hover,.ql-snow.ql-toolbar button:focus,.ql-snow .ql-toolbar button:focus,.ql-snow.ql-toolbar button.ql-active,.ql-snow .ql-toolbar button.ql-active,.ql-snow.ql-toolbar .ql-picker-label:hover,.ql-snow .ql-toolbar .ql-picker-label:hover,.ql-snow.ql-toolbar .ql-picker-label.ql-active,.ql-snow .ql-toolbar .ql-picker-label.ql-active,.ql-snow.ql-toolbar .ql-picker-item:hover,.ql-snow .ql-toolbar .ql-picker-item:hover,.ql-snow.ql-toolbar .ql-picker-item.ql-selected,.ql-snow .ql-toolbar .ql-picker-item.ql-selected{color:#06c}.ql-snow.ql-toolbar button:hover .ql-fill,.ql-snow .ql-toolbar button:hover .ql-fill,.ql-snow.ql-toolbar button:focus .ql-fill,.ql-snow .ql-toolbar button:focus .ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill{fill:#06c}.ql-snow.ql-toolbar button:hover .ql-stroke,.ql-snow .ql-toolbar button:hover .ql-stroke,.ql-snow.ql-toolbar button:focus .ql-stroke,.ql-snow .ql-toolbar button:focus .ql-stroke,.ql-snow.ql-toolbar button.ql-active .ql-stroke,.ql-snow .ql-toolbar button.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow.ql-toolbar button:hover .ql-stroke-miter,.ql-snow .ql-toolbar button:hover .ql-stroke-miter,.ql-snow.ql-toolbar button:focus .ql-stroke-miter,.ql-snow .ql-toolbar button:focus .ql-stroke-miter,.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter{stroke:#06c}@media (pointer:coarse){.ql-snow.ql-toolbar button:hover:not(.ql-active),.ql-snow .ql-toolbar button:hover:not(.ql-active){color:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill{fill:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter{stroke:#444}}.ql-snow{box-sizing:border-box}.ql-snow *{box-sizing:border-box}.ql-snow .ql-hidden{display:none}.ql-snow .ql-out-bottom,.ql-snow .ql-out-top{visibility:hidden}.ql-snow .ql-tooltip{position:absolute;transform:translateY(10px)}.ql-snow .ql-tooltip a{cursor:pointer;text-decoration:none}.ql-snow .ql-tooltip.ql-flip{transform:translateY(-10px)}.ql-snow .ql-formats{display:inline-block;vertical-align:middle}.ql-snow .ql-formats:after{clear:both;content:'';display:table}.ql-snow .ql-stroke{fill:none;stroke:#444;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.ql-snow .ql-stroke-miter{fill:none;stroke:#444;stroke-miterlimit:10;stroke-width:2}.ql-snow .ql-fill,.ql-snow .ql-stroke.ql-fill{fill:#444}.ql-snow .ql-empty{fill:none}.ql-snow .ql-even{fill-rule:evenodd}.ql-snow .ql-thin,.ql-snow .ql-stroke.ql-thin{stroke-width:1}.ql-snow .ql-transparent{opacity:.4}.ql-snow .ql-direction svg:last-child{display:none}.ql-snow .ql-direction.ql-active svg:last-child{display:inline}.ql-snow .ql-direction.ql-active svg:first-child{display:none}.ql-snow .ql-editor h1{font-size:2em}.ql-snow .ql-editor h2{font-size:1.5em}.ql-snow .ql-editor h3{font-size:1.17em}.ql-snow .ql-editor h4{font-size:1em}.ql-snow .ql-editor h5{font-size:.83em}.ql-snow .ql-editor h6{font-size:.67em}.ql-snow .ql-editor a{text-decoration:underline}.ql-snow .ql-editor blockquote{border-left:4px solid #ccc;margin-bottom:5px;margin-top:5px;padding-left:16px}.ql-snow .ql-editor code,.ql-snow .ql-editor .ql-code-block-container{background-color:#f0f0f0;border-radius:3px}.ql-snow .ql-editor .ql-code-block-container{margin-bottom:5px;margin-top:5px;padding:5px 10px}.ql-snow .ql-editor code{font-size:85%;padding:2px 4px}.ql-snow .ql-editor .ql-code-block-container{background-color:#23241f;color:#f8f8f2;overflow:visible}.ql-snow .ql-editor img{max-width:100%}.ql-snow .ql-picker{color:#444;display:inline-block;float:left;font-size:14px;font-weight:500;height:24px;position:relative;vertical-align:middle}.ql-snow .ql-picker-label{cursor:pointer;display:inline-block;height:100%;padding-left:8px;padding-right:2px;position:relative;width:100%}.ql-snow .ql-picker-label::before{display:inline-block;line-height:22px}.ql-snow .ql-picker-options{background-color:#fff;display:none;min-width:100%;padding:4px 8px;position:absolute;white-space:nowrap}.ql-snow .ql-picker-options .ql-picker-item{cursor:pointer;display:block;padding-bottom:5px;padding-top:5px}.ql-snow .ql-picker.ql-expanded .ql-picker-label{color:#ccc;z-index:2}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill{fill:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke{stroke:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-options{display:block;margin-top:-1px;top:100%;z-index:1}.ql-snow .ql-color-picker,.ql-snow .ql-icon-picker{width:28px}.ql-snow .ql-color-picker .ql-picker-label,.ql-snow .ql-icon-picker .ql-picker-label{padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-label svg,.ql-snow .ql-icon-picker .ql-picker-label svg{right:4px}.ql-snow .ql-icon-picker .ql-picker-options{padding:4px 0}.ql-snow .ql-icon-picker .ql-picker-item{height:24px;width:24px;padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-options{padding:3px 5px;width:152px}.ql-snow .ql-color-picker .ql-picker-item{border:1px solid transparent;float:left;height:16px;margin:2px;padding:0;width:16px}.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg{position:absolute;margin-top:-9px;right:0;top:50%;width:18px}.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before,.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before,.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before{content:attr(data-label)}.ql-snow .ql-picker.ql-header{width:98px}.ql-snow .ql-picker.ql-header .ql-picker-label::before,.ql-snow .ql-picker.ql-header .ql-picker-item::before{content:'Normal'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before{content:'Heading 1'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before{content:'Heading 2'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before{content:'Heading 3'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before{content:'Heading 4'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before{content:'Heading 5'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before{content:'Heading 6'}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before{font-size:2em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before{font-size:1.5em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before{font-size:1.17em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before{font-size:1em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before{font-size:.83em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before{font-size:.67em}.ql-snow .ql-picker.ql-font{width:108px}.ql-snow .ql-picker.ql-font .ql-picker-label::before,.ql-snow .ql-picker.ql-font .ql-picker-item::before{content:'Sans Serif'}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before{content:'Serif'}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before{content:'Monospace'}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before{font-family:Georgia,Times New Roman,serif}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before{font-family:Monaco,Courier New,monospace}.ql-snow .ql-picker.ql-size{width:98px}.ql-snow .ql-picker.ql-size .ql-picker-label::before,.ql-snow .ql-picker.ql-size .ql-picker-item::before{content:'Normal'}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before{content:'Small'}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before{content:'Large'}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before{content:'Huge'}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before{font-size:10px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before{font-size:18px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before{font-size:32px}.ql-snow .ql-color-picker.ql-background .ql-picker-item{background-color:#fff}.ql-snow .ql-color-picker.ql-color .ql-picker-item{background-color:#000}.ql-code-block-container{position:relative}.ql-code-block-container .ql-ui{right:5px;top:5px}.ql-toolbar.ql-snow{border:1px solid #ccc;box-sizing:border-box;font-family:'Helvetica Neue','Helvetica','Arial',sans-serif;padding:8px}.ql-toolbar.ql-snow .ql-formats{margin-right:15px}.ql-toolbar.ql-snow .ql-picker-label{border:1px solid transparent}.ql-toolbar.ql-snow .ql-picker-options{border:1px solid transparent;box-shadow:rgba(0,0,0,0.2) 0 2px 8px}.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label{border-color:#ccc}.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options{border-color:#ccc}.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected,.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover{border-color:#000}.ql-toolbar.ql-snow + .ql-container.ql-snow{border-top:0}.ql-snow .ql-tooltip{background-color:#fff;border:1px solid #ccc;box-shadow:0 0 5px #ddd;color:#444;padding:5px 12px;white-space:nowrap}.ql-snow .ql-tooltip::before{content:"Visit URL:";line-height:26px;margin-right:8px}.ql-snow .ql-tooltip input[type=text]{display:none;border:1px solid #ccc;font-size:13px;height:26px;margin:0;padding:3px 5px;width:170px}.ql-snow .ql-tooltip a.ql-preview{display:inline-block;max-width:200px;overflow-x:hidden;text-overflow:ellipsis;vertical-align:top}.ql-snow .ql-tooltip a.ql-action::after{border-right:1px solid #ccc;content:'Edit';margin-left:16px;padding-right:8px}.ql-snow .ql-tooltip a.ql-remove::before{content:'Remove';margin-left:8px}.ql-snow .ql-tooltip a{line-height:26px}.ql-snow .ql-tooltip.ql-editing a.ql-preview,.ql-snow .ql-tooltip.ql-editing a.ql-remove{display:none}.ql-snow .ql-tooltip.ql-editing input[type=text]{display:inline-block}.ql-snow .ql-tooltip.ql-editing a.ql-action::after{border-right:0;content:'Save';padding-right:0}.ql-snow .ql-tooltip[data-mode=link]::before{content:"Enter link:"}.ql-snow .ql-tooltip[data-mode=formula]::before{content:"Enter formula:"}.ql-snow .ql-tooltip[data-mode=video]::before{content:"Enter video:"}.ql-snow a{color:#06c}.ql-container.ql-snow{border:1px solid #ccc}
+
+/*# sourceMappingURL=quill.snow.css.map*/
\ No newline at end of file
diff --git a/src/test/resources/org/htmlunit/javascript/host/css/ComputedCSSStyleDeclarationTest.properties.FF.txt b/src/test/resources/org/htmlunit/javascript/host/css/ComputedCSSStyleDeclarationTest.properties.FF.txt
index a7597637637..a1302da6566 100644
--- a/src/test/resources/org/htmlunit/javascript/host/css/ComputedCSSStyleDeclarationTest.properties.FF.txt
+++ b/src/test/resources/org/htmlunit/javascript/host/css/ComputedCSSStyleDeclarationTest.properties.FF.txt
@@ -345,7 +345,7 @@ border-right-color=:rgb(0, 0, 0)
border-right-style=:none
border-right-width=:0px
border-right=:0px rgb(0, 0, 0)
-border-spacing=:0px 0px
+border-spacing=:0px
border-start-end-radius=:0px
border-start-start-radius=:0px
border-style=:none
@@ -406,7 +406,7 @@ borderRight=:0px rgb(0, 0, 0)
borderRightColor=:rgb(0, 0, 0)
borderRightStyle=:none
borderRightWidth=:0px
-borderSpacing=:0px 0px
+borderSpacing=:0px
borderStartEndRadius=:0px
borderStartStartRadius=:0px
borderStyle=:none