Skip to content

Commit dc7a25e

Browse files
committed
Fix Browser tests opening new windows on Linux
According to https://webkitgtk.org/reference/webkit2gtk/stable/signal.WebView.create.html 'The new WebKitWebView must be related to web_view, see WebKitWebView:related-view for more details.' To ensure this, org.eclipse.swt.browser.WebKit.create(Composite, int) does the following: Composite parentShell = parent.getParent(); Browser parentBrowser = WebKit.parentBrowser; if (parentBrowser == null && parentShell != null) { Control[] children = parentShell.getChildren(); for (int i = 0; i < children.length; i++) { if (children[i] instanceof Browser) { parentBrowser = (Browser) children[i]; break; } } } if (parentBrowser == null) { webView = WebKitGTK.webkit_web_view_new(); } else { webView = WebKitGTK.webkit_web_view_new_with_related_view(((WebKit)parentBrowser.webBrowser).webView); } 1) A static variable set to true inside NewWindowListeners: /** * Stores the browser which is opening a new browser window, * during a WebKit {@code create} signal. This browser * must be passed to a newly created browser as "related". * * See bug 579257. */ private static Browser parentBrowser; 2) A heuristic for when two browser instances share the parent In the failing tests, we currently have neither. To fix that, use the more 'correct' solution 1) by moving the instantiation of new Browser inside the OpenWindowListener. Resolves #2014.
1 parent f734dc6 commit dc7a25e

File tree

1 file changed

+35
-40
lines changed

1 file changed

+35
-40
lines changed

tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_browser_Browser.java

Lines changed: 35 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import java.util.ArrayList;
4545
import java.util.Collection;
4646
import java.util.Collections;
47+
import java.util.LinkedHashSet;
4748
import java.util.List;
4849
import java.util.Locale;
4950
import java.util.Map.Entry;
@@ -824,8 +825,8 @@ public void test_OpenWindowListener_addAndRemove() {
824825
@Test
825826
public void test_OpenWindowListener_openHasValidEventDetails() {
826827
AtomicBoolean openFiredCorrectly = new AtomicBoolean(false);
827-
final Browser browserChild = createBrowser(shell, swtBrowserSettings);
828828
browser.addOpenWindowListener(event -> {
829+
final Browser browserChild = createBrowser(shell, swtBrowserSettings);
829830
assertSame("Expected Browser1 instance, but have another instance", browser, event.widget);
830831
assertNull("Expected event.browser to be null", event.browser);
831832
openFiredCorrectly.set(true);
@@ -845,24 +846,23 @@ public void test_OpenWindowListener_openHasValidEventDetails() {
845846
/** Test that a script 'window.open()' opens a child popup shell. */
846847
@Test
847848
public void test_OpenWindowListener_open_ChildPopup() {
848-
assumeFalse("Not currently working on Linux, see https://github.com/eclipse-platform/eclipse.platform.swt/issues/1564", SwtTestUtil.isGTK);
849849
AtomicBoolean childCompleted = new AtomicBoolean(false);
850850

851851
Shell childShell = new Shell(shell, SWT.None);
852852
childShell.setText("Child shell");
853853
childShell.setLayout(new FillLayout());
854-
final Browser browserChild = createBrowser(childShell, swtBrowserSettings);
855854

856855
browser.addOpenWindowListener(event -> {
856+
Browser browserChild = createBrowser(childShell, swtBrowserSettings);
857+
browserChild.addVisibilityWindowListener(showAdapter(event2 -> {
858+
childShell.open();
859+
browserChild.setText("Child Browser");
860+
}));
861+
//Triggers test to finish.
862+
browserChild.addProgressListener(completedAdapter(event2 -> childCompleted.set(true)));
857863
event.browser = browserChild;
858864
});
859865

860-
browserChild.addVisibilityWindowListener(showAdapter(event -> {
861-
childShell.open();
862-
browserChild.setText("Child Browser");
863-
}));
864-
//Triggers test to finish.
865-
browserChild.addProgressListener(completedAdapter(event -> childCompleted.set(true)));
866866

867867
shell.open();
868868

@@ -883,37 +883,32 @@ public void test_OpenWindowListener_open_ChildPopup() {
883883
/** Validate event order : Child's visibility should come before progress completed event */
884884
@Test
885885
public void test_OpenWindow_Progress_Listener_ValidateEventOrder() {
886-
assumeFalse("Not currently working on Linux, see https://github.com/eclipse-platform/eclipse.platform.swt/issues/1564", SwtTestUtil.isGTK);
887886

888-
AtomicBoolean windowOpenFired = new AtomicBoolean(false);
889887
AtomicBoolean childCompleted = new AtomicBoolean(false);
890888
AtomicBoolean visibilityShowed = new AtomicBoolean(false);
889+
// there might be more than one progress event, use a linked hash set to keep the order but only track unique events
890+
Set<String> eventOrder = Collections.synchronizedSet(new LinkedHashSet<String>());
891891

892892
Shell childShell = new Shell(shell, SWT.None);
893893
childShell.setText("Child shell");
894894
childShell.setLayout(new FillLayout());
895-
final Browser browserChild = createBrowser(childShell, swtBrowserSettings);
896895

897896
browser.addOpenWindowListener(event -> {
897+
final Browser browserChild = createBrowser(childShell, swtBrowserSettings);
898898
event.browser = browserChild;
899-
assertFalse("OpenWindowListener should have been fired first",
900-
visibilityShowed.get() || childCompleted.get()); // Validate event order.
901-
windowOpenFired.set(true);
902-
});
903899

904-
browserChild.addVisibilityWindowListener(showAdapter(event -> {
905-
childShell.open();
906-
assertTrue("Child Visibility.show should have fired before progress completed",
907-
windowOpenFired.get() && !childCompleted.get()); // Validate event order.
908-
visibilityShowed.set(true);
909-
}));
900+
browserChild.addVisibilityWindowListener(showAdapter(event2 -> {
901+
eventOrder.add("Visibility.show");
902+
visibilityShowed.set(true);
903+
childShell.open();
904+
}));
910905

911-
browserChild.addProgressListener(completedAdapter(event -> {
912-
assertTrue("Child's Progress Completed before parent's expected events",
913-
windowOpenFired.get() && visibilityShowed.get()); // Validate event order.
914-
childCompleted.set(true); // Triggers test to finish.
915-
browserChild.setText("Child Browser!");
916-
}));
906+
browserChild.addProgressListener(completedAdapter(event2 -> {
907+
eventOrder.add("Progress.completed");
908+
childCompleted.set(true); // Triggers test to finish.
909+
browserChild.setText("Child Browser!");
910+
}));
911+
});
917912

918913
shell.open();
919914

@@ -925,14 +920,16 @@ public void test_OpenWindow_Progress_Listener_ValidateEventOrder() {
925920
<body>This test uses javascript to open a new window.</body>
926921
</html>""");
927922

928-
boolean passed = waitForPassCondition(() -> windowOpenFired.get() && visibilityShowed.get() && childCompleted.get());
923+
boolean passed = waitForPassCondition(() -> visibilityShowed.get() && childCompleted.get());
929924

930925
String errMsg = "\nTest timed out."
931926
+"\nExpected true for the below, but have:"
932-
+"\nWindoOpenFired:" + windowOpenFired.get()
933927
+"\nVisibilityShowed:" + visibilityShowed.get()
934928
+"\nChildCompleted:" + childCompleted.get();
935929
assertTrue(errMsg, passed);
930+
931+
assertEquals("Child Visibility.show should have fired before progress completed",
932+
List.of("Visibility.show", "Progress.completed"), List.copyOf(eventOrder));
936933
}
937934

938935
@Test
@@ -1384,7 +1381,6 @@ public void completed(ProgressEvent event) {
13841381
*/
13851382
@Test
13861383
public void test_VisibilityWindowListener_eventSize() {
1387-
assumeFalse("Not currently working on Linux, see https://github.com/eclipse-platform/eclipse.platform.swt/issues/1564", SwtTestUtil.isGTK);
13881384

13891385
shell.setSize(200,300);
13901386
AtomicBoolean childCompleted = new AtomicBoolean(false);
@@ -1394,20 +1390,19 @@ public void test_VisibilityWindowListener_eventSize() {
13941390
childShell.setSize(250, 350);
13951391
childShell.setText("Child shell");
13961392
childShell.setLayout(new FillLayout());
1397-
final Browser browserChild = createBrowser(childShell, swtBrowserSettings);
13981393

13991394
browser.addOpenWindowListener(event -> {
1395+
final Browser browserChild = createBrowser(childShell, swtBrowserSettings);
1396+
browserChild.addVisibilityWindowListener(showAdapter(event2 -> {
1397+
testLog.append("Visibilty show eventfired.\nEvent size: " + event2.size);
1398+
result.set(event2.size);
1399+
childShell.open();
1400+
childCompleted.set(true);
1401+
}));
14001402
event.browser = browserChild;
14011403
testLog.append("openWindowListener fired");
14021404
});
14031405

1404-
browserChild.addVisibilityWindowListener(showAdapter(event -> {
1405-
testLog.append("Visibilty show eventfired.\nEvent size: " + event.size);
1406-
result.set(event.size);
1407-
childShell.open();
1408-
childCompleted.set(true);
1409-
}));
1410-
14111406
shell.open();
14121407
browser.setText("""
14131408
<html>
@@ -1418,7 +1413,7 @@ public void test_VisibilityWindowListener_eventSize() {
14181413
</html>""");
14191414

14201415
boolean finishedWithoutTimeout = waitForPassCondition(childCompleted::get);
1421-
browserChild.dispose();
1416+
childShell.dispose();
14221417

14231418
boolean passed = false;
14241419
if (!SwtTestUtil.isWindows) {

0 commit comments

Comments
 (0)