Skip to content

Conversation

@trancexpress
Copy link
Contributor

This changes adds a search dialog to WebKit browsers. The search dialog is opened with Ctrl+F and has next/previous word matching capabilities.

Fixes: #2222

@trancexpress
Copy link
Contributor Author

trancexpress commented Jun 10, 2025

SWT snippet to test with:

package test.browser;

import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class TestBrowser {

	public static void main(String[] args) throws InterruptedException {
		Display display = new Display();
		Shell shell = new Shell(display);
		shell.setSize(600, 800);
		shell.setLayout(new FillLayout());
		shell.setText("Test Browser");

		Browser b = new Browser(shell, SWT.NONE);
		b.setText(
				"""
				<html>
				 <head>
				 </head>
				 <body>
				   Hello World
				   <h1>Hello World</h1>
				   <p>Hello World</p>
				 </body>
				</html>
				""");

		shell.open();

		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();
	}

}

Problems that I see so far:

  1. When switching focus between the Browser and the new Shell, the search next button (down arrow) doesn't work properly.
  2. Searching for parts of words doesn't work, I don't know why. I see no mention of being able to search only for words here:
    2.1. https://webkitgtk.org/reference/webkit2gtk/2.27.4/WebKitFindController.html#webkit-find-controller-search
    2.2. https://webkitgtk.org/reference/webkit2gtk/2.27.4/WebKitFindController.html#WebKitFindOptions
  3. The new dialog will need to be made prettier, with more width and with better positioning.
  4. The code will need refactoring, once we arrive at a solution we agree on.
  5. Unclear how to close the search dialog on minimizing the window with the Browser, also whether it should be an always-on-top Shell.

@github-actions
Copy link
Contributor

github-actions bot commented Jun 10, 2025

Test Results

   545 files     545 suites   30m 17s ⏱️
 4 403 tests  4 385 ✅  18 💤 0 ❌
16 733 runs  16 593 ✅ 140 💤 0 ❌

Results for commit 6904ea2.

♻️ This comment has been updated with latest results.

@trancexpress
Copy link
Contributor Author

trancexpress commented Jun 10, 2025

  1. When switching focus between the Browser and the new Shell, the search next button (down arrow) doesn't work properly.

For that we need the option: WEBKIT_FIND_OPTIONS_WRAP_AROUND

  1. Searching for parts of words doesn't work, I don't know why.

A native snippet works fine for this, so there must be something wrong in how we handle SWT events... Maybe its bad to finish the search on text modify events.

GTK3+WebKit Snippet:

#include <gtk/gtk.h>
#include <webkit2/webkit2.h>

// gcc -g browser_search.c  `pkg-config --cflags --libs  webkit2gtk-4.0 gtk+-3.0` -o BrowserSearchExample && ./BrowserSearchExample

static WebKitWebView *webView;

static void destroyWindowCb(GtkWidget* widget, GtkWidget* window);
static gboolean closeWebViewCb(WebKitWebView* webView, GtkWidget* window);


gboolean on_key_pressed (GtkWidget *widget, GdkEventButton *event, gpointer userdata)
{
    WebKitFindController *findController = webkit_web_view_get_find_controller(webView);
    webkit_find_controller_search(findController, "llo", WEBKIT_FIND_OPTIONS_NONE, G_MAXUINT);
}


int main(int argc, char* argv[])
{
    // Initialize GTK+
    gtk_init(&argc, &argv);

    // Create a window that will contain the browser instance
    GtkWidget *main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(main_window), 400, 300);


    // Create a browser instance
    webView = WEBKIT_WEB_VIEW(webkit_web_view_new());

    g_signal_connect (webView, "key-press-event", G_CALLBACK(on_key_pressed), NULL);

    // Put the browser area into the main window
    gtk_container_add(GTK_CONTAINER(main_window), GTK_WIDGET(webView));

    // Set up callbacks so that if either the main window or the browser instance is
    // closed, the program will exit
    g_signal_connect(main_window, "destroy", G_CALLBACK(destroyWindowCb), NULL);
    g_signal_connect(webView, "close", G_CALLBACK(closeWebViewCb), main_window);

    // Load a web page into the browser instance
    webkit_web_view_load_uri(webView, "file:///home/sandreev/gtk/examples/hello.html");

    // Make sure that when the browser area becomes visible, it will get mouse
    // and keyboard events
    gtk_widget_grab_focus(GTK_WIDGET(webView));

    // Make sure the main window and all its contents are visible
    gtk_widget_show_all(main_window);

    // Run the main GTK+ event loop
    gtk_main();

    return 0;
}

static void destroyWindowCb(GtkWidget* widget, GtkWidget* window)
{
    gtk_main_quit();
}

static gboolean closeWebViewCb(WebKitWebView* webView, GtkWidget* window)
{
    gtk_widget_destroy(window);
    return TRUE;
}

(I'm not a 100% sure how the search is meant to be done in this case, but pressing buttons shows at last flashing search results)

HTML:

<html>
 <head>
 </head>
 <body>
   Hello World
   <h1>Hello World</h1>
   <p>Hello World</p>
 </body>
</html>

@trancexpress
Copy link
Contributor Author

I've refactored the code and fixed the finish search logic.

What remains is making the new dialog look good / behave well and the odd behavior of the search for some search strings.

I'm trying to compile WebKit locally, to debug this... What we have installed doesn't have debug symbols for me to check what is going on during webkit_find_controller_search. So far I'm unable to build WebKit though (I run into various build issues).

@trancexpress trancexpress force-pushed the gh2222 branch 3 times, most recently from 4c30cc6 to 1f27baa Compare June 12, 2025 10:44
@trancexpress
Copy link
Contributor Author

trancexpress commented Jun 12, 2025

Looks like I had to use org.eclipse.swt.internal.Converter.wcsToMbcs(String, boolean) for the conversion between Java String and const gchar *. Now the search works as expected, from my POV.

Next we must decide how we want the dialog to behave/look, where to place it and so on.

My main issues with the current change are:

1. The search text field is too short. Will fix that next.
2. Maybe we want a checkbox for toggling case sensitive search (right now we use a case sensitive search, but WebKit can search also case insensitive).
3. The search dialog doesn't close when the SWT window is minimized. No idea how to change this, since we want to keep the search dialog open above the browser (I assume) while clicking on the browser. A focus lost / deactivation listener on the browser widget makes the search dialog close immediately after opening. Probably we copy what the find dialog does in Eclipse, that one works as expected.
4. The dialog is always on top and is not transparent... We should let the user move it and remember the position? Or maybe use some status bar if any exists, for the search widgets? As to not cover the browser client area and hide text.
5. Do we need anything special for different DPI? We set the size of the search dialog shell, do we need to use some special method for that?
6. Are we adding tests? I'm not sure if we can, but we can look into it.

@trancexpress trancexpress changed the title [WIP] Add search capabilities to WebKit based Browser Add search capabilities to WebKit based Browser Jun 12, 2025
@trancexpress trancexpress marked this pull request as ready for review June 12, 2025 11:27
@trancexpress
Copy link
Contributor Author

trancexpress commented Jun 12, 2025

The build job error so far is:

 Error:  Failed to execute goal org.eclipse.tycho.extras:tycho-p2-extras-plugin:5.0.0-SNAPSHOT:compare-version-with-baselines (compare-attached-artifacts-with-release) on project org.eclipse.swt.svg: Baseline and reactor have the same fully qualified version, but different content
Error:  different
Error:     META-INF/ECLIPSE_.RSA: not present in baseline
Error:     META-INF/ECLIPSE_.SF: not present in baseline
Error:  -> [Help 1]
Error:  Failed to execute goal org.eclipse.tycho.extras:tycho-p2-extras-plugin:5.0.0-SNAPSHOT:compare-version-with-baselines (compare-attached-artifacts-with-release) on project org.eclipse.swt.tools: Baseline and reactor have the same fully qualified version, but different content
Error:  different
Error:     META-INF/ECLIPSE_.RSA: not present in baseline
Error:     META-INF/ECLIPSE_.SF: not present in baseline
Error:  -> [Help 1]
Error:  Failed to execute goal org.eclipse.tycho.extras:tycho-p2-extras-plugin:5.0.0-SNAPSHOT:compare-version-with-baselines (compare-attached-artifacts-with-release) on project org.eclipse.swt.tools.base: Baseline and reactor have the same fully qualified version, but different content
Error:  different
Error:     META-INF/ECLIPSE_.RSA: not present in baseline
Error:     META-INF/ECLIPSE_.SF: not present in baseline
Error:  -> [Help 1]
Error:  Failed to execute goal org.eclipse.tycho.extras:tycho-p2-extras-plugin:5.0.0-SNAPSHOT:compare-version-with-baselines (compare-attached-artifacts-with-release) on project org.eclipse.swt.examples.views: Baseline and reactor have the same fully qualified version, but different content
Error:  different
Error:     META-INF/ECLIPSE_.RSA: not present in baseline
Error:     META-INF/ECLIPSE_.SF: not present in baseline
Error:  -> [Help 1]
Error:  Failed to execute goal org.eclipse.tycho.extras:tycho-p2-extras-plugin:5.0.0-SNAPSHOT:compare-version-with-baselines (compare-attached-artifacts-with-release) on project org.eclipse.swt.examples.launcher: Baseline and reactor have the same fully qualified version, but different content
Error:  different
Error:     META-INF/ECLIPSE_.RSA: not present in baseline
Error:     META-INF/ECLIPSE_.SF: not present in baseline
Error:  -> [Help 1]
Error:  Failed to execute goal org.eclipse.tycho.extras:tycho-p2-extras-plugin:5.0.0-SNAPSHOT:compare-version-with-baselines (compare-attached-artifacts-with-release) on project org.eclipse.swt.examples.browser.demos: Baseline and reactor have the same fully qualified version, but different content
Error:  different
Error:     META-INF/ECLIPSE_.RSA: not present in baseline
Error:     META-INF/ECLIPSE_.SF: not present in baseline
Error:  -> [Help 1]
Error:  Failed to execute goal org.eclipse.tycho.extras:tycho-p2-extras-plugin:5.0.0-SNAPSHOT:compare-version-with-baselines (compare-attached-artifacts-with-release) on project org.eclipse.swt.examples.ole.win32: Baseline and reactor have the same fully qualified version, but different content
Error:  different
Error:     META-INF/ECLIPSE_.RSA: not present in baseline
Error:     META-INF/ECLIPSE_.SF: not present in baseline
Error:  -> [Help 1]
Error:  
Error:  To see the full stack trace of the errors, re-run Maven with the -e switch.
Error:  Re-run Maven using the -X switch to enable full debug logging.
Error:  
Error:  For more information about the errors and possible solutions, please read the following articles:
Error:  [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
Error:  
Error:  After correcting the problems, you can resume the build with the command
Error:    mvn <args> -rf :org.eclipse.swt.svg
Error: Process returned exit code 1

I'm not sure what that means.

@iloveeclipse
Copy link
Member

Are you on top of master branch? If not, please rebase

@trancexpress
Copy link
Contributor Author

Are you on top of master branch? If not, please rebase

I think so, last commit I see is:

commit 52607ae876bcd499422cde4bbde9c1fc8aad65a1 (HEAD -> gh2222, origin/gh2222)
Author: Simeon Andreev <[email protected]>
Date:   Tue Jun 10 14:14:25 2025 +0200

    Add search capabilities to WebKit based Browser
    
    This changes adds a search dialog to WebKit browsers. The search dialog
    is opened with Ctrl+F and has next/previous word matching capabilities.
    
    Fixes: #2222

commit 0a68deaba8a3a6e8017fbee4c7e16299140bd63f (tag: I20250611-1800, origin/master, master)
Author: Aleksandar Kurtakov <[email protected]>
Date:   Wed Jun 11 20:22:15 2025 +0300

    [GTK] Allow buttons to be 0/0 on Gtk 4.x

I don't receive anything new if I pull from master.

});
browser.addControlListener(ControlListener.controlResizedAdapter(e -> closeSearchDialog()));
browser.addControlListener(ControlListener.controlMovedAdapter(e -> closeSearchDialog()));
browser.getShell().addControlListener(shellMoveListener);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be nice if there is a way to close the search shell without needing to add this listener to the browsers shell. The move listener on the browser will get notifications only if the browser moves within the parent... Not if the whole window moves.

Since the search shell is opened at a specific location, it looks odd when moving the browsers shell - the search shell remains where it was opened.

@iloveeclipse
Copy link
Member

3. The new dialog will need to be made prettier, with more width and with better positioning.

Yes, that is a must have, positioning at least.

Currently if I use it inside IDE on a dynamic Help view opened on the right side of the screen, the search dialog is shown over Package Explorer bottom on the left side :-)

At least it should be able to move / resize the dialog?

Should we re-target the change to the JFace or even workbench code / platform UI?

So we will add support for the HelpView / EmbeddedBrowserAdapter etc?

I mean, we provide a callback interface that can be used by workbench parts to hook into the "show find dialog" trigger on SWT side and show default find dialog that we redirect to webkit API?

So SWT uses "simple" find dialog by default if nothing is set, and if it is running from workbench views that supports the "better" dialog, if would use that?

@trancexpress
Copy link
Contributor Author

trancexpress commented Jun 12, 2025

Should we re-target the change to the JFace or even workbench code / platform UI?

I don't know how this would work, any API we add will have to be at org.eclipse.swt.browser.Browser. And so it will have to work on all platforms, not just WebKit and GTK+.

I agree, ideally we only add rudimentary search APIs, that can be used by a client. But I don't see how. Even with internal methods I'm not sure we will achieve anything in our own product... I've commented this on the Advantest ticket.

org.eclipse.swt.browser.Browser doesn't have (working) API to access org.eclipse.swt.browser.WebKit or even org.eclipse.swt.browser.WebBrowser. And even then, we have several platforms to support.

IMO best to try to get some SWT based dialog working. It should be enough for searching.

@trancexpress trancexpress force-pushed the gh2222 branch 2 times, most recently from db3f27b to 147f501 Compare June 13, 2025 10:22
@trancexpress
Copy link
Contributor Author

trancexpress commented Jun 13, 2025

@iloveeclipse can you check the search dialog now? Here is my intent for its behavior:

  1. Opens at the bottom left of the Browser, similar to how search bars are shown in browsers.
  2. Pressing enter in the text field advances the search going down in the document.
  3. The buttons for next and previous should be self-explanatory.
  4. The dialog can be moved by dragging it at any non-button, non-text area of the dialog. There is a cursor that indicates it can be moved when the mouse is over draggable area.
  5. The last used location of the dialog is re-used. If the browser is moved or resized, the remembered location is dropped - the dialog will again be shown at the bottom left. This known location last only as long as the browser does.
  6. The search is case sensitive and has wrapping, i.e. will start from start/end of document when reaching the end resp. start (on forward resp. backward searching).

The only thing that is hard-coded right now is the dialog (Shell) size and margins. I don't know if this will be bad for different DPIs.

We also have a problem with e.g. the JavaDoc hover - Ctrl+F on a focused JavaDoc hover shows the search dialogs and closes the JavaDoc hover... I don't know how we want to fix that. I am guessing searching should be explicitly enabled per Browser. But that leads us to the problem of having to define any API on org.eclipse.swt.browser.Browser and not having any access (aside from reflection I guess) to the WebKit specific stuff.

Maybe we add some internal method "browser.enableWebKitSearch()"...?

@trancexpress
Copy link
Contributor Author

Only test fail is this one, from what I can tell: #1991

@iloveeclipse is on a vacation this week, I'm not sure if there is anyone else interested in this new addition to WebKit based browsers. So probably this change will wait for @iloveeclipse to review it.

@trancexpress
Copy link
Contributor Author

@iloveeclipse can you review this change?

I'll think on how we can enable/disable the search per Browser instance when I find some time.

@iloveeclipse
Copy link
Member

Unfortunately I had a crash after playing a bit with the new search.
I've opened / searched few times in the "Help view" and after that opened Help -> Help Contents and also did few searches there. After one or two attempts Eclipse disappeared with a crash dump. I wasn't able to find core dump file...

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007fd2c209f051, pid=217483, tid=217490
#
# JRE version: OpenJDK Runtime Environment Temurin-21.0.6+7 (21.0.6+7) (build 21.0.6+7-LTS)
# Java VM: OpenJDK 64-Bit Server VM Temurin-21.0.6+7 (21.0.6+7-LTS, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, linux-amd64)
# Problematic frame:
# C  [libgobject-2.0.so.0+0x37051]  g_type_check_instance_is_fundamentally_a+0x11
#
# Core dump will be written. Default location: Core dumps may be processed with "/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h" (or dumping to /data2/SDK/eclipse4.37/eclipse/core.217483)
#
# If you would like to submit a bug report, please visit:
#   https://github.com/adoptium/adoptium-support/issues
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

---------------  S U M M A R Y ------------

Command Line: -XX:+ShowCodeDetailsInExceptionMessages -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:46699 -Dorg.eclipse.swt.graphics.Resource.reportNonDisposed=true -Dorg.eclipse.swt.internal.gtk.noThemingFixes -Dorg.eclipse.swt.internal.gtk.cssFile=/opt/ate/devtools/bin/theme_patches.css -Declipse.pde.launch=true --add-modules=ALL-SYSTEM -Djava.security.manager=allow -Dfile.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 org.eclipse.equinox.launcher.Main -launcher /data2/SDK/eclipse4.37/eclipse/eclipse -name Eclipse -showsplash 600 -product org.eclipse.sdk.ide -data /data/4x_platform_workspace/../runtime-Java_21 -configuration file:///data/4x_platform_workspace/.metadata/.plugins/org.eclipse.pde.core/Java_21/ -dev file:///data/4x_platform_workspace/.metadata/.plugins/org.eclipse.pde.core/Java_21/dev.properties -debug /data/4x_platform_workspace/.metadata/.plugins/org.eclipse.pde.core/Java_21/.options -os linux -ws gtk -arch x86_64 -nl en_US -consoleLog

Host: Intel(R) Xeon(R) w5-2465X, 32 cores, 250G, Red Hat Enterprise Linux release 9.2 (Plow)
Time: Mon Jun 23 17:18:14 2025 CEST elapsed time: 2214.535021 seconds (0d 0h 36m 54s)

---------------  T H R E A D  ---------------

Current thread (0x00007fd31002eeb0):  JavaThread "main"             [_thread_in_native, id=217490, stack(0x00007fd315c25000,0x00007fd315d25000) (1024K)]

Stack: [0x00007fd315c25000,0x00007fd315d25000],  sp=0x00007fd315d22578,  free space=1013k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [libgobject-2.0.so.0+0x37051]  g_type_check_instance_is_fundamentally_a+0x11
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
J 26789  org.eclipse.swt.internal.gtk.GDK.gdk_window_set_cursor(JJ)V (0 bytes) @ 0x00007fd302019ffc [0x00007fd302019fa0+0x000000000000005c]
j  org.eclipse.swt.widgets.Control.setCursor(J)V+32
j  org.eclipse.swt.widgets.Control.setCursor(Lorg/eclipse/swt/graphics/Cursor;)V+38
j  org.eclipse.e4.ui.workbench.renderers.swt.SashLayout.onMouseMove(Lorg/eclipse/swt/events/MouseEvent;)V+102
j  org.eclipse.e4.ui.workbench.renderers.swt.SashLayout$$Lambda+0x00007fd2744d5fa8.mouseMove(Lorg/eclipse/swt/events/MouseEvent;)V+5
J 26703 c1 org.eclipse.swt.widgets.TypedListener.handleEvent(Lorg/eclipse/swt/widgets/Event;)V (1291 bytes) @ 0x00007fd2fba3ec5c [0x00007fd2fba38a80+0x00000000000061dc]
J 27252 c2 org.eclipse.swt.widgets.EventTable.sendEvent(Lorg/eclipse/swt/widgets/Event;)V (619 bytes) @ 0x00007fd3021373f8 [0x00007fd302137180+0x0000000000000278]
J 27809 c2 org.eclipse.swt.widgets.Display.runDeferredEvents()Z (109 bytes) @ 0x00007fd30054f910 [0x00007fd30054f360+0x00000000000005b0]
J 31867 c2 org.eclipse.swt.widgets.Display.readAndDispatch()Z (88 bytes) @ 0x00007fd301ffc468 [0x00007fd301ffc320+0x0000000000000148]

@iloveeclipse
Copy link
Member

I've fully removed locally created "move" cursor & rebased.
With that the change is OK for merge.

@iloveeclipse
Copy link
Member

Build is broken due #2200.

This changes adds a search dialog to WebKit browsers. The search dialog
is opened with Ctrl+F and has next/previous word matching capabilities.
The search dialog is not available for Browsers in a Shell with the
SWT.TOOL style.

The search capabilities can be disabled with the following system
property:

-Dorg.eclipse.swt.internal.webkitgtk.disableBrowserSearch=true

Fixes eclipse-platform#2222
@iloveeclipse
Copy link
Member

Yet another unrelated issue:

16:35:10  [ERROR] Could not acquire lock(s)
16:35:10  java.lang.IllegalStateException: Could not acquire lock(s)
16:35:10      at org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapter$AdaptedLockSyncContext.acquire (NamedLockFactoryAdapter.java:219)
16:35:10      at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve (DefaultArtifactResolver.java:276)
16:35:10      at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts (DefaultArtifactResolver.java:261)
16:35:10      at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact (DefaultArtifactResolver.java:243)
16:35:10      at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom (DefaultArtifactDescriptorReader.java:243)
16:35:10      at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.readArtifactDescriptor (DefaultArtifactDescriptorReader.java:183)
16:35:10      at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.resolveCachedArtifactDescriptor (DfDependencyCollector.java:382)
16:35:10      at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.getArtifactDescriptorResult (DfDependencyCollector.java:368)
16:35:10      at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:218)
16:35:10      at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:156)
16:35:10      at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.process (DfDependencyCollector.java:138)
16:35:10      at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.doRecurse (DfDependencyCollector.java:343)
16:35:10      at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:277)
16:35:10      at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:156)
16:35:10      at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.process (DfDependencyCollector.java:138)
16:35:10      at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.doCollectDependencies (DfDependencyCollector.java:108)
16:35:10      at org.eclipse.aether.internal.impl.collect.DependencyCollectorDelegate.collectDependencies (DependencyCollectorDelegate.java:222)
16:35:10      at org.eclipse.aether.internal.impl.collect.DefaultDependencyCollector.collectDependencies (DefaultDependencyCollector.java:87)
16:35:10      at org.eclipse.aether.internal.impl.DefaultRepositorySystem.collectDependencies (DefaultRepositorySystem.java:306)
16:35:10      at org.apache.maven.project.DefaultProjectDependenciesResolver.resolve (DefaultProjectDependenciesResolver.java:151)
16:35:10      at org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies (LifecycleDependencyResolver.java:224)
16:35:10      at org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.resolveProjectDependencies (LifecycleDependencyResolver.java:136)
16:35:10      at org.apache.maven.lifecycle.internal.MojoExecutor.ensureDependenciesAreResolved (MojoExecutor.java:355)
16:35:10      at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:313)
16:35:10      at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
16:35:10      at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
16:35:10      at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
16:35:10      at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
16:35:10      at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
16:35:10      at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
16:35:10      at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
16:35:10      at io.takari.maven.builder.smart.SmartBuilderImpl.buildProject (SmartBuilderImpl.java:206)
16:35:10      at io.takari.maven.builder.smart.SmartBuilderImpl$ProjectBuildTask.run (SmartBuilderImpl.java:71)
16:35:10      at java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:572)
16:35:10      at java.util.concurrent.FutureTask.run (FutureTask.java:317)
16:35:10      at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1144)
16:35:10      at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:642)
16:35:10      at java.lang.Thread.run (Thread.java:1583)
16:35:10      Suppressed: java.lang.IllegalStateException: Attempt 1: Could not acquire read lock for 'artifact:junit:junit:4.13.2' in 30 SECONDS
16:35:10          at org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapter$AdaptedLockSyncContext.acquire (NamedLockFactoryAdapter.java:202)
16:35:10          at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve (DefaultArtifactResolver.java:276)
16:35:10          at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts (DefaultArtifactResolver.java:261)
16:35:10          at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact (DefaultArtifactResolver.java:243)
16:35:10          at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom (DefaultArtifactDescriptorReader.java:243)
16:35:10          at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.readArtifactDescriptor (DefaultArtifactDescriptorReader.java:183)
16:35:10          at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.resolveCachedArtifactDescriptor (DfDependencyCollector.java:382)
16:35:10          at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.getArtifactDescriptorResult (DfDependencyCollector.java:368)
16:35:10          at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:218)
16:35:10          at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:156)
16:35:10          at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.process (DfDependencyCollector.java:138)
16:35:10          at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.doRecurse (DfDependencyCollector.java:343)
16:35:10          at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:277)
16:35:10          at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:156)
16:35:10          at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.process (DfDependencyCollector.java:138)
16:35:10          at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.doCollectDependencies (DfDependencyCollector.java:108)
16:35:10          at org.eclipse.aether.internal.impl.collect.DependencyCollectorDelegate.collectDependencies (DependencyCollectorDelegate.java:222)
16:35:10          at org.eclipse.aether.internal.impl.collect.DefaultDependencyCollector.collectDependencies (DefaultDependencyCollector.java:87)
16:35:10          at org.eclipse.aether.internal.impl.DefaultRepositorySystem.collectDependencies (DefaultRepositorySystem.java:306)
16:35:10          at org.apache.maven.project.DefaultProjectDependenciesResolver.resolve (DefaultProjectDependenciesResolver.java:151)
16:35:10          at org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies (LifecycleDependencyResolver.java:224)
16:35:10          at org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.resolveProjectDependencies (LifecycleDependencyResolver.java:136)
16:35:10          at org.apache.maven.lifecycle.internal.MojoExecutor.ensureDependenciesAreResolved (MojoExecutor.java:355)
16:35:10          at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:313)
16:35:10          at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
16:35:10          at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
16:35:10          at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
16:35:10          at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
16:35:10          at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
16:35:10          at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
16:35:10          at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
16:35:10          at io.takari.maven.builder.smart.SmartBuilderImpl.buildProject (SmartBuilderImpl.java:206)
16:35:10          at io.takari.maven.builder.smart.SmartBuilderImpl$ProjectBuildTask.run (SmartBuilderImpl.java:71)
16:35:10          at java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:572)
16:35:10          at java.util.concurrent.FutureTask.run (FutureTask.java:317)
16:35:10          at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1144)
16:35:10          at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:642)
16:35:10          at java.lang.Thread.run (Thread.java:1583)
16:35:10  [ERROR] [bundle] Standard Widget Toolkit for Windows on x86_64: Could not acquire lock(s)
16:35:10  java.lang.RuntimeException: [bundle] Standard Widget Toolkit for Windows on x86_64: Could not acquire lock(s)
16:35:10      at io.takari.maven.builder.smart.SmartBuilderImpl.buildProject (SmartBuilderImpl.java:209)
16:35:10      at io.takari.maven.builder.smart.SmartBuilderImpl$ProjectBuildTask.run (SmartBuilderImpl.java:71)
16:35:10      at java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:572)
16:35:10      at java.util.concurrent.FutureTask.run (FutureTask.java:317)
16:35:10      at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1144)
16:35:10      at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:642)
16:35:10      at java.lang.Thread.run (Thread.java:1583)
16:35:10  Caused by: java.lang.IllegalStateException: Could not acquire lock(s)
16:35:10      at org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapter$AdaptedLockSyncContext.acquire (NamedLockFactoryAdapter.java:219)
16:35:10      at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve (DefaultArtifactResolver.java:276)
16:35:10      at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts (DefaultArtifactResolver.java:261)
16:35:10      at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact (DefaultArtifactResolver.java:243)
16:35:10      at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom (DefaultArtifactDescriptorReader.java:243)
16:35:10      at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.readArtifactDescriptor (DefaultArtifactDescriptorReader.java:183)
16:35:10      at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.resolveCachedArtifactDescriptor (DfDependencyCollector.java:382)
16:35:10      at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.getArtifactDescriptorResult (DfDependencyCollector.java:368)
16:35:10      at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:218)
16:35:10      at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:156)
16:35:10      at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.process (DfDependencyCollector.java:138)
16:35:10      at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.doRecurse (DfDependencyCollector.java:343)
16:35:10      at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:277)
16:35:10      at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:156)
16:35:10      at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.process (DfDependencyCollector.java:138)
16:35:10      at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.doCollectDependencies (DfDependencyCollector.java:108)
16:35:10      at org.eclipse.aether.internal.impl.collect.DependencyCollectorDelegate.collectDependencies (DependencyCollectorDelegate.java:222)
16:35:10      at org.eclipse.aether.internal.impl.collect.DefaultDependencyCollector.collectDependencies (DefaultDependencyCollector.java:87)
16:35:10      at org.eclipse.aether.internal.impl.DefaultRepositorySystem.collectDependencies (DefaultRepositorySystem.java:306)
16:35:10      at org.apache.maven.project.DefaultProjectDependenciesResolver.resolve (DefaultProjectDependenciesResolver.java:151)
16:35:10      at org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies (LifecycleDependencyResolver.java:224)
16:35:10      at org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.resolveProjectDependencies (LifecycleDependencyResolver.java:136)
16:35:10      at org.apache.maven.lifecycle.internal.MojoExecutor.ensureDependenciesAreResolved (MojoExecutor.java:355)
16:35:10      at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:313)
16:35:10      at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
16:35:10      at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
16:35:10      at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
16:35:10      at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
16:35:10      at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
16:35:10      at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
16:35:10      at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
16:35:10      at io.takari.maven.builder.smart.SmartBuilderImpl.buildProject (SmartBuilderImpl.java:206)
16:35:10      at io.takari.maven.builder.smart.SmartBuilderImpl$ProjectBuildTask.run (SmartBuilderImpl.java:71)
16:35:10      at java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:572)
16:35:10      at java.util.concurrent.FutureTask.run (FutureTask.java:317)
16:35:10      at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1144)
16:35:10      at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:642)
16:35:10      at java.lang.Thread.run (Thread.java:1583)
16:35:10      Suppressed: java.lang.IllegalStateException: Attempt 1: Could not acquire read lock for 'artifact:junit:junit:4.13.2' in 30 SECONDS
16:35:10          at org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapter$AdaptedLockSyncContext.acquire (NamedLockFactoryAdapter.java:202)
16:35:10          at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve (DefaultArtifactResolver.java:276)
16:35:10          at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts (DefaultArtifactResolver.java:261)
16:35:10          at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact (DefaultArtifactResolver.java:243)
16:35:10          at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom (DefaultArtifactDescriptorReader.java:243)
16:35:10          at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.readArtifactDescriptor (DefaultArtifactDescriptorReader.java:183)
16:35:10          at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.resolveCachedArtifactDescriptor (DfDependencyCollector.java:382)
16:35:10          at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.getArtifactDescriptorResult (DfDependencyCollector.java:368)
16:35:10          at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:218)
16:35:10          at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:156)
16:35:10          at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.process (DfDependencyCollector.java:138)
16:35:10          at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.doRecurse (DfDependencyCollector.java:343)
16:35:10          at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:277)
16:35:10          at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.processDependency (DfDependencyCollector.java:156)
16:35:10          at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.process (DfDependencyCollector.java:138)
16:35:10          at org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector.doCollectDependencies (DfDependencyCollector.java:108)
16:35:10          at org.eclipse.aether.internal.impl.collect.DependencyCollectorDelegate.collectDependencies (DependencyCollectorDelegate.java:222)
16:35:10          at org.eclipse.aether.internal.impl.collect.DefaultDependencyCollector.collectDependencies (DefaultDependencyCollector.java:87)
16:35:10          at org.eclipse.aether.internal.impl.DefaultRepositorySystem.collectDependencies (DefaultRepositorySystem.java:306)
16:35:10          at org.apache.maven.project.DefaultProjectDependenciesResolver.resolve (DefaultProjectDependenciesResolver.java:151)
16:35:10          at org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies (LifecycleDependencyResolver.java:224)
16:35:10          at org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.resolveProjectDependencies (LifecycleDependencyResolver.java:136)
16:35:10          at org.apache.maven.lifecycle.internal.MojoExecutor.ensureDependenciesAreResolved (MojoExecutor.java:355)
16:35:10          at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:313)
16:35:10          at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
16:35:10          at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
16:35:10          at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
16:35:10          at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
16:35:10          at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
16:35:10          at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
16:35:10          at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
16:35:10          at io.takari.maven.builder.smart.SmartBuilderImpl.buildProject (SmartBuilderImpl.java:206)
16:35:10          at io.takari.maven.builder.smart.SmartBuilderImpl$ProjectBuildTask.run (SmartBuilderImpl.java:71)
16:35:10          at java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:572)
16:35:10          at java.util.concurrent.FutureTask.run (FutureTask.java:317)
16:35:10          at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1144)
16:35:10          at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:642)
16:35:10          at java.lang.Thread.run (Thread.java:1583)
16:35:10  [ERROR] 
16:35:10  [ERROR] Re-run Maven using the -X switch to enable full debug logging.

@iloveeclipse
Copy link
Member

Finally!

@trancexpress : please add N&N for the new feature on Linux.

@iloveeclipse iloveeclipse merged commit 87577bd into eclipse-platform:master Jun 25, 2025
17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[WebKit] Add search capabilities to WebKit based Browser

2 participants