From dc7a25e473d9fdeffd51028720c4dc6122da45c9 Mon Sep 17 00:00:00 2001 From: Sebastian Ratz Date: Tue, 15 Apr 2025 12:33:00 +0200 Subject: [PATCH 1/2] 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. --- .../Test_org_eclipse_swt_browser_Browser.java | 75 +++++++++---------- 1 file changed, 35 insertions(+), 40 deletions(-) diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_browser_Browser.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_browser_Browser.java index 07311486f82..b740880fa91 100644 --- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_browser_Browser.java +++ b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_browser_Browser.java @@ -44,6 +44,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Map.Entry; @@ -824,8 +825,8 @@ public void test_OpenWindowListener_addAndRemove() { @Test public void test_OpenWindowListener_openHasValidEventDetails() { AtomicBoolean openFiredCorrectly = new AtomicBoolean(false); - final Browser browserChild = createBrowser(shell, swtBrowserSettings); browser.addOpenWindowListener(event -> { + final Browser browserChild = createBrowser(shell, swtBrowserSettings); assertSame("Expected Browser1 instance, but have another instance", browser, event.widget); assertNull("Expected event.browser to be null", event.browser); openFiredCorrectly.set(true); @@ -845,24 +846,23 @@ public void test_OpenWindowListener_openHasValidEventDetails() { /** Test that a script 'window.open()' opens a child popup shell. */ @Test public void test_OpenWindowListener_open_ChildPopup() { - assumeFalse("Not currently working on Linux, see https://github.com/eclipse-platform/eclipse.platform.swt/issues/1564", SwtTestUtil.isGTK); AtomicBoolean childCompleted = new AtomicBoolean(false); Shell childShell = new Shell(shell, SWT.None); childShell.setText("Child shell"); childShell.setLayout(new FillLayout()); - final Browser browserChild = createBrowser(childShell, swtBrowserSettings); browser.addOpenWindowListener(event -> { + Browser browserChild = createBrowser(childShell, swtBrowserSettings); + browserChild.addVisibilityWindowListener(showAdapter(event2 -> { + childShell.open(); + browserChild.setText("Child Browser"); + })); + //Triggers test to finish. + browserChild.addProgressListener(completedAdapter(event2 -> childCompleted.set(true))); event.browser = browserChild; }); - browserChild.addVisibilityWindowListener(showAdapter(event -> { - childShell.open(); - browserChild.setText("Child Browser"); - })); - //Triggers test to finish. - browserChild.addProgressListener(completedAdapter(event -> childCompleted.set(true))); shell.open(); @@ -883,37 +883,32 @@ public void test_OpenWindowListener_open_ChildPopup() { /** Validate event order : Child's visibility should come before progress completed event */ @Test public void test_OpenWindow_Progress_Listener_ValidateEventOrder() { - assumeFalse("Not currently working on Linux, see https://github.com/eclipse-platform/eclipse.platform.swt/issues/1564", SwtTestUtil.isGTK); - AtomicBoolean windowOpenFired = new AtomicBoolean(false); AtomicBoolean childCompleted = new AtomicBoolean(false); AtomicBoolean visibilityShowed = new AtomicBoolean(false); + // there might be more than one progress event, use a linked hash set to keep the order but only track unique events + Set eventOrder = Collections.synchronizedSet(new LinkedHashSet()); Shell childShell = new Shell(shell, SWT.None); childShell.setText("Child shell"); childShell.setLayout(new FillLayout()); - final Browser browserChild = createBrowser(childShell, swtBrowserSettings); browser.addOpenWindowListener(event -> { + final Browser browserChild = createBrowser(childShell, swtBrowserSettings); event.browser = browserChild; - assertFalse("OpenWindowListener should have been fired first", - visibilityShowed.get() || childCompleted.get()); // Validate event order. - windowOpenFired.set(true); - }); - browserChild.addVisibilityWindowListener(showAdapter(event -> { - childShell.open(); - assertTrue("Child Visibility.show should have fired before progress completed", - windowOpenFired.get() && !childCompleted.get()); // Validate event order. - visibilityShowed.set(true); - })); + browserChild.addVisibilityWindowListener(showAdapter(event2 -> { + eventOrder.add("Visibility.show"); + visibilityShowed.set(true); + childShell.open(); + })); - browserChild.addProgressListener(completedAdapter(event -> { - assertTrue("Child's Progress Completed before parent's expected events", - windowOpenFired.get() && visibilityShowed.get()); // Validate event order. - childCompleted.set(true); // Triggers test to finish. - browserChild.setText("Child Browser!"); - })); + browserChild.addProgressListener(completedAdapter(event2 -> { + eventOrder.add("Progress.completed"); + childCompleted.set(true); // Triggers test to finish. + browserChild.setText("Child Browser!"); + })); + }); shell.open(); @@ -925,14 +920,16 @@ public void test_OpenWindow_Progress_Listener_ValidateEventOrder() { This test uses javascript to open a new window. """); - boolean passed = waitForPassCondition(() -> windowOpenFired.get() && visibilityShowed.get() && childCompleted.get()); + boolean passed = waitForPassCondition(() -> visibilityShowed.get() && childCompleted.get()); String errMsg = "\nTest timed out." +"\nExpected true for the below, but have:" - +"\nWindoOpenFired:" + windowOpenFired.get() +"\nVisibilityShowed:" + visibilityShowed.get() +"\nChildCompleted:" + childCompleted.get(); assertTrue(errMsg, passed); + + assertEquals("Child Visibility.show should have fired before progress completed", + List.of("Visibility.show", "Progress.completed"), List.copyOf(eventOrder)); } @Test @@ -1384,7 +1381,6 @@ public void completed(ProgressEvent event) { */ @Test public void test_VisibilityWindowListener_eventSize() { - assumeFalse("Not currently working on Linux, see https://github.com/eclipse-platform/eclipse.platform.swt/issues/1564", SwtTestUtil.isGTK); shell.setSize(200,300); AtomicBoolean childCompleted = new AtomicBoolean(false); @@ -1394,20 +1390,19 @@ public void test_VisibilityWindowListener_eventSize() { childShell.setSize(250, 350); childShell.setText("Child shell"); childShell.setLayout(new FillLayout()); - final Browser browserChild = createBrowser(childShell, swtBrowserSettings); browser.addOpenWindowListener(event -> { + final Browser browserChild = createBrowser(childShell, swtBrowserSettings); + browserChild.addVisibilityWindowListener(showAdapter(event2 -> { + testLog.append("Visibilty show eventfired.\nEvent size: " + event2.size); + result.set(event2.size); + childShell.open(); + childCompleted.set(true); + })); event.browser = browserChild; testLog.append("openWindowListener fired"); }); - browserChild.addVisibilityWindowListener(showAdapter(event -> { - testLog.append("Visibilty show eventfired.\nEvent size: " + event.size); - result.set(event.size); - childShell.open(); - childCompleted.set(true); - })); - shell.open(); browser.setText(""" @@ -1418,7 +1413,7 @@ public void test_VisibilityWindowListener_eventSize() { """); boolean finishedWithoutTimeout = waitForPassCondition(childCompleted::get); - browserChild.dispose(); + childShell.dispose(); boolean passed = false; if (!SwtTestUtil.isWindows) { From 0f43a3a882f23e7e4bc2289133ec4e83b445e384 Mon Sep 17 00:00:00 2001 From: Sebastian Ratz Date: Tue, 15 Apr 2025 11:38:23 +0100 Subject: [PATCH 2/2] Revert "Downgrade WebKit for the Linux GH runner" This reverts commit f8979dca6c710fa00d97fe04af28d67e12d7d69d. --- .github/workflows/maven.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index ab88c120c92..034d6f2f673 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -48,7 +48,7 @@ jobs: if: ${{ matrix.config.native == 'gtk.linux.x86_64'}} run: | sudo apt-get update -qq - WEBKIT_VERSION=2.44.0-2 && sudo apt-get install -qq -y libgtk-3-dev libgtk-4-dev freeglut3-dev webkit2gtk-driver=${WEBKIT_VERSION} libwebkit2gtk-4.1-0=${WEBKIT_VERSION} libjavascriptcoregtk-4.1-0=${WEBKIT_VERSION} + sudo apt-get install -qq -y libgtk-3-dev libgtk-4-dev freeglut3-dev webkit2gtk-driver - name: Pull large static Windows binaries if: ${{ matrix.config.native == 'win32.win32.x86_64'}} run: |