[HtmlUnit] SVN: [15543] trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/ javascript/host/Window3Test.java
rbri--- via HtmlUnit-develop <[email protected]> Fri, 24 Aug 2018 17:43:25 +0000
| Newsgroups | gmane.comp.java.htmlunit.devel |
|---|---|
| Message-ID | <[email protected]> |
Revision: 15543
http://sourceforge.net/p/htmlunit/code/15543
Author: rbri
Date: 2018-08-24 17:43:24 +0000 (Fri, 24 Aug 2018)
Log Message:
-----------
next step in event refactoring (wip)
Modified Paths:
--------------
trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Window3Test.java
Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Window3Test.java
===================================================================
--- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Window3Test.java 2018-08-24 17:12:10 UTC (rev 15542)
+++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Window3Test.java 2018-08-24 17:43:24 UTC (rev 15543)
@@ -18,11 +18,16 @@
import java.io.InputStream;
import java.net.URL;
+import java.util.Arrays;
import java.util.Collections;
+import java.util.Comparator;
import java.util.List;
import java.util.Map;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
@@ -29,10 +34,10 @@
import org.openqa.selenium.WebDriver;
import com.gargoylesoftware.htmlunit.BrowserRunner;
-import com.gargoylesoftware.htmlunit.HttpHeader;
import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts;
import com.gargoylesoftware.htmlunit.BrowserRunner.BuggyWebDriver;
import com.gargoylesoftware.htmlunit.BrowserRunner.NotYetImplemented;
+import com.gargoylesoftware.htmlunit.HttpHeader;
import com.gargoylesoftware.htmlunit.WebDriverTestCase;
import com.gargoylesoftware.htmlunit.html.HtmlPageTest;
import com.gargoylesoftware.htmlunit.util.NameValuePair;
@@ -1709,7 +1714,9 @@
"window at load",
"window at load capture",
"body onload"},
- IE = {"document at load capture",
+ IE = {"window at error",
+ "window at error capture",
+ "document at load capture",
"element 1 onload",
"window at error capture",
"document at error capture",
@@ -1766,37 +1773,38 @@
* @throws Exception if the test fails
*/
@Test
- @Alerts(DEFAULT = {"window at error capture",
- "document at error capture",
- "element 2 onerror",
- "document DOMContentLoaded",
- "window DOMContentLoaded",
- "document at load capture",
- "element 1 onload",
- "window at load",
- "window at load capture",
- "body onload"},
- CHROME = {"document DOMContentLoaded",
- "window DOMContentLoaded",
- "window at error capture",
- "document at error capture",
- "element 2 onerror",
- "document at load capture",
- "element 1 onload",
- "window at load",
- "window at load capture",
- "body onload"},
- IE = {"document at load capture",
- "element 1 onload",
- "document DOMContentLoaded",
- "window DOMContentLoaded",
- "window at load",
- "window at load capture",
- "body onload",
- "document at load capture",
- "window at error capture",
- "document at error capture",
- "element 2 onerror"})
+ @Alerts(DEFAULT = {"img2: window at error capture",
+ "img2: document at error capture",
+ "img2: element 2 onerror",
+ "#document: document DOMContentLoaded",
+ "#document: window DOMContentLoaded",
+ "img1: document at load capture",
+ "img1: element 1 onload",
+ "#document: window at load",
+ "#document: window at load capture",
+ "#document: body onload"},
+ CHROME = {"#document: document DOMContentLoaded",
+ "#document: window DOMContentLoaded",
+ "img2: window at error capture",
+ "img2: document at error capture",
+ "img2: element 2 onerror",
+ "img1: document at load capture",
+ "img1: element 1 onload",
+ "#document: window at load",
+ "#document: window at load capture",
+ "#document: body onload"},
+ IE = {"img1: document at load capture",
+ "img1: element 1 onload",
+ "#document: document DOMContentLoaded",
+ "#document: window DOMContentLoaded",
+ "#document: window at load",
+ "#document: window at load capture",
+ "#document: body onload",
+ "SCRIPT: document at load capture",
+ "img2: window at error capture",
+ "img2: document at error capture",
+ "img2: element 2 onerror"})
+ @NotYetImplemented(IE) // The extra SCRIPT is not yet handled (waiting on onloadScript())
public void onloadImg() throws Exception {
final URL urlImage = new URL(URL_FIRST, "img.jpg");
try (InputStream is = getClass().getClassLoader().getResourceAsStream("testfiles/tiny-jpg.img")) {
@@ -1808,36 +1816,56 @@
final String html = HtmlPageTest.STANDARDS_MODE_PREFIX_
+ "<html><head>\n"
+ "<script>\n"
- + " function log(msg) {\n"
+ + " function log(msg, target) {\n"
+ + " if (target) msg = (target.id ? target.id : target.nodeName) + ': ' + msg\n"
+ " window.parent.document.title += msg + ';';\n"
+ " }\n"
- + " window.addEventListener('load', function () { log('window at load') })\n"
- + " window.addEventListener('load', function () { log('window at load capture') }, true)\n"
- + " window.addEventListener('error', function () { log('window at error') })\n"
- + " window.addEventListener('error', function () { log('window at error capture') }, true)\n"
- + " window.addEventListener('DOMContentLoaded', function () { log('window DOMContentLoaded') })\n"
+ + " window.addEventListener('load', function (event) { log('window at load', event.target) })\n"
+ + " window.addEventListener('load', function (event) { "
+ + "log('window at load capture', event.target) }, true)\n"
+ + " window.addEventListener('error', function (event) { log('window at error', event.target) })\n"
+ + " window.addEventListener('error', function (event) { "
+ + "log('window at error capture', event.target) }, true)\n"
+ + " window.addEventListener('DOMContentLoaded', function (event) { "
+ + "log('window DOMContentLoaded', event.target) })\n"
- + " document.addEventListener('load', function () { log('document at load') })\n"
- + " document.addEventListener('load', function () { log('document at load capture') }, true)\n"
- + " document.addEventListener('error', function () { log('document at error') })\n"
- + " document.addEventListener('error', function () { log('document at error capture') }, true)\n"
- + " document.addEventListener('DOMContentLoaded', function () { log('document DOMContentLoaded') })\n"
+ + " document.addEventListener('load', function (event) { log('document at load', event.target) })\n"
+ + " document.addEventListener('load', function (event) { "
+ + "log('document at load capture', event.target) }, true)\n"
+ + " document.addEventListener('error', function (event) { log('document at error', event.target) })\n"
+ + " document.addEventListener('error', function (event) { "
+ + "log('document at error capture', event.target) }, true)\n"
+ + " document.addEventListener('DOMContentLoaded', function (event) { "
+ + "log('document DOMContentLoaded', event.target) })\n"
+ "</script>\n"
+ "</head>\n"
- + "<body onload='log(\"body onload\")'>\n"
- + " <img src='" + urlImage + "' onload='log(\"element 1 onload\")' "
- + "onerror='log(\"element 1 onerror\")'>\n"
- + " <img src='' onload='log(\"element 2 onload\")' "
- + "onerror='log(\"element 2 onerror\")'>\n"
+ + "<body onload='log(\"body onload\", document)'>\n"
+ + " <img id='img1' src='" + urlImage + "' onload='log(\"element 1 onload\", this)' "
+ + "onerror='log(\"element 1 onerror\", this)'>\n"
+ + " <img id='img2' src='' onload='log(\"element 2 onload\", this)' "
+ + "onerror='log(\"element 2 onerror\", this)'>\n"
+ "</body></html>";
+ // Image loads are usually asynchronous in browsers and ordering of these results are somewhat coincidental.
+ //
+ // Chrome/FF/Edge appears be synchronizing 'body.onload' so that it comes after all image loads, while Chrome
+ // alone also seems to be synchronizing 'DOMContentLoaded' so that it fires before image loads. IE11 is a mess
+ // with no clear synchronization between 'body.onload' and image loads.
+ //
+ // To preserve a semblance of sanity, we're sorting the results because this test isn't concerned with the
+ // ordering of img1 vs img2 vs #document (or even images vs 'body.onload'), and instead are only concerned
+ // the events propagate in correct order once triggered.
+ final Comparator<String> sorter = Comparator.comparing(s -> StringUtils.substringBefore(s, ":"));
+
final WebDriver driver = loadPage2(html);
Thread.sleep(200);
- final String text = driver.getTitle().trim().replaceAll(";", "\n").trim();
- assertEquals(String.join("\n", getExpectedAlerts()), text);
+ final String text = Pattern.compile(";").splitAsStream(driver.getTitle())
+ .map(String::trim).sorted(sorter).collect(Collectors.joining("\n"));
+ final String expected = Arrays.stream(getExpectedAlerts()).sorted(sorter).collect(Collectors.joining("\n"));
+ assertEquals(expected, text);
}
/**
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot