[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