[HtmlUnit] SVN: [15515] trunk/htmlunit/src
rbri--- via HtmlUnit-develop <[email protected]> Fri, 10 Aug 2018 18:13:26 +0000
| Newsgroups | gmane.comp.java.htmlunit.devel |
|---|---|
| Message-ID | <[email protected]> |
Revision: 15515
http://sourceforge.net/p/htmlunit/code/15515
Author: rbri
Date: 2018-08-10 18:13:24 +0000 (Fri, 10 Aug 2018)
Log Message:
-----------
fix the order of the windows returned by WebClient.getTopLevelWindows()
Issue 1979
Modified Paths:
--------------
trunk/htmlunit/src/changes/changes.xml
trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java
trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebClientTest.java
Modified: trunk/htmlunit/src/changes/changes.xml
===================================================================
--- trunk/htmlunit/src/changes/changes.xml 2018-08-10 16:51:51 UTC (rev 15514)
+++ trunk/htmlunit/src/changes/changes.xml 2018-08-10 18:13:24 UTC (rev 15515)
@@ -8,6 +8,10 @@
<body>
<release version="2.33" date="xxxx, 2018" description="Bugfixes">
+ <action type="fix" dev="rbri" issue="1979" due-to="Atsushi Nakagawa">
+ Fix the order of the windows returned by WebClient.getTopLevelWindows()
+ to be again the same as WebClient.getWebWindows().
+ </action>
<action type="fix" dev="rbri" issue="1980" due-to="Atsushi Nakagawa">
Improved support for javascript named function expressions.
</action>
Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java
===================================================================
--- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java 2018-08-10 16:51:51 UTC (rev 15514)
+++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java 2018-08-10 18:13:24 UTC (rev 15515)
@@ -37,12 +37,10 @@
import java.net.URLDecoder;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
-import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
import java.util.ConcurrentModificationException;
import java.util.Date;
-import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -171,7 +169,8 @@
private PageCreator pageCreator_ = new DefaultPageCreator();
private final Set<WebWindowListener> webWindowListeners_ = new HashSet<>(5);
- private final Deque<TopLevelWindow> topLevelWindows_ = new ArrayDeque<>(); // top-level windows
+ private final List<TopLevelWindow> topLevelWindows_ =
+ Collections.synchronizedList(new ArrayList<TopLevelWindow>()); // top-level windows
private final List<WebWindow> windows_ = Collections.synchronizedList(new ArrayList<WebWindow>()); // all windows
private transient List<WeakReference<JavaScriptJobManager>> jobManagers_ =
Collections.synchronizedList(new ArrayList<WeakReference<JavaScriptJobManager>>());
@@ -1502,6 +1501,8 @@
/**
* Returns an immutable list of open web windows (whether they are top level windows or not).
* This is a snapshot; future changes are not reflected by this list.
+ * <p>
+ * The list is ordered by age, the oldest one first.
*
* @return an immutable list of open web windows (whether they are top level windows or not)
* @see #getWebWindowByName(String)
@@ -1528,6 +1529,8 @@
/**
* Returns an immutable list of open top level windows.
* This is a snapshot; future changes are not reflected by this list.
+ * <p>
+ * The list is ordered by age, the oldest one first.
*
* @return an immutable list of open top level windows
* @see #getWebWindowByName(String)
@@ -1816,18 +1819,25 @@
if (webClient_.topLevelWindows_.isEmpty()) {
// Must always have at least window, and there are no top-level windows left; must create one.
final TopLevelWindow newWindow = new TopLevelWindow("", webClient_);
- webClient_.topLevelWindows_.push(newWindow);
+ webClient_.topLevelWindows_.add(newWindow);
webClient_.setCurrentWindow(newWindow);
}
else {
// The current window is now the previous top-level window.
- webClient_.setCurrentWindow(webClient_.topLevelWindows_.peek());
+ webClient_.setCurrentWindow(
+ webClient_.topLevelWindows_.get(webClient_.topLevelWindows_.size() - 1));
}
}
}
else if (window == webClient_.getCurrentWindow()) {
// The current window is now the last top-level window.
- webClient_.setCurrentWindow(webClient_.topLevelWindows_.peek());
+ if (webClient_.topLevelWindows_.isEmpty()) {
+ webClient_.setCurrentWindow(null);
+ }
+ else {
+ webClient_.setCurrentWindow(
+ webClient_.topLevelWindows_.get(webClient_.topLevelWindows_.size() - 1));
+ }
}
}
@@ -1876,7 +1886,7 @@
final WebWindow window = event.getWebWindow();
if (window instanceof TopLevelWindow) {
final TopLevelWindow tlw = (TopLevelWindow) window;
- webClient_.topLevelWindows_.push(tlw);
+ webClient_.topLevelWindows_.add(tlw);
}
// Page is not loaded yet, don't set it now as current window.
}
Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebClientTest.java
===================================================================
--- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebClientTest.java 2018-08-10 16:51:51 UTC (rev 15514)
+++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebClientTest.java 2018-08-10 18:13:24 UTC (rev 15515)
@@ -2173,28 +2173,59 @@
conn.setResponse(URL_SECOND, "<html><body></body></html>");
client.setWebConnection(conn);
+ final WebWindow firstWindow = client.getWebWindows().get(0);
+
assertEquals(1, client.getWebWindows().size());
assertEquals(1, client.getTopLevelWindows().size());
+ assertEquals(client.getCurrentWindow(), client.getWebWindows().get(0));
+ assertEquals(client.getCurrentWindow(), client.getTopLevelWindows().get(0));
+ assertEquals(firstWindow, client.getWebWindows().get(0));
+ assertEquals(firstWindow, client.getTopLevelWindows().get(0));
client.getPage(URL_FIRST);
assertEquals(2, client.getWebWindows().size());
assertEquals(1, client.getTopLevelWindows().size());
+ assertEquals(client.getCurrentWindow(), client.getWebWindows().get(0));
+ assertEquals(client.getCurrentWindow(), client.getTopLevelWindows().get(0));
+ assertEquals(firstWindow, client.getWebWindows().get(0));
+ assertEquals(firstWindow, client.getTopLevelWindows().get(0));
client.getPage(URL_SECOND);
assertEquals(1, client.getWebWindows().size());
assertEquals(1, client.getTopLevelWindows().size());
+ assertEquals(client.getCurrentWindow(), client.getWebWindows().get(0));
+ assertEquals(client.getCurrentWindow(), client.getTopLevelWindows().get(0));
+ assertEquals(firstWindow, client.getWebWindows().get(0));
+ assertEquals(firstWindow, client.getTopLevelWindows().get(0));
client.openWindow(URL_SECOND, "a");
assertEquals(2, client.getWebWindows().size());
assertEquals(2, client.getTopLevelWindows().size());
+ assertEquals(client.getCurrentWindow(), client.getWebWindows().get(1));
+ assertEquals(client.getCurrentWindow(), client.getTopLevelWindows().get(1));
+ assertEquals(client.getWebWindows().get(1), client.getTopLevelWindows().get(1));
+ assertEquals(firstWindow, client.getWebWindows().get(0));
+ assertEquals(firstWindow, client.getTopLevelWindows().get(0));
+ assertNotEquals(firstWindow, client.getWebWindows().get(1));
+ assertNotEquals(firstWindow, client.getTopLevelWindows().get(1));
client.openWindow(URL_SECOND, "b");
assertEquals(3, client.getWebWindows().size());
assertEquals(3, client.getTopLevelWindows().size());
+ assertEquals(client.getCurrentWindow(), client.getWebWindows().get(2));
+ assertEquals(client.getCurrentWindow(), client.getTopLevelWindows().get(2));
+ assertEquals(firstWindow, client.getWebWindows().get(0));
+ assertEquals(firstWindow, client.getTopLevelWindows().get(0));
+ assertEquals(client.getWebWindows().get(1), client.getTopLevelWindows().get(1));
+ assertNotEquals(firstWindow, client.getWebWindows().get(1));
+ assertNotEquals(firstWindow, client.getTopLevelWindows().get(1));
+ assertEquals(client.getWebWindows().get(2), client.getTopLevelWindows().get(2));
+ assertNotEquals(firstWindow, client.getWebWindows().get(2));
+ assertNotEquals(firstWindow, client.getTopLevelWindows().get(2));
client.close();
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot