Event fixes
This commit is contained in:
@@ -11,6 +11,8 @@ import org.w3c.dom.events.EventTarget;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
/**
|
||||
* EventHost implementation for JavaFX WebView using W3C DOM EventTarget listeners.
|
||||
@@ -22,19 +24,31 @@ public final class FxEventHost implements EventHost {
|
||||
private static final String GLOBAL_TARGET_ID = "__global__";
|
||||
|
||||
private final FxDomHost dom;
|
||||
private final LuaEventRouter router;
|
||||
private volatile LuaEventRouter router;
|
||||
|
||||
private final ConcurrentHashMap<String, EventListener> elementListeners = new ConcurrentHashMap<>();
|
||||
private final ConcurrentHashMap<String, EventListener> globalListeners = new ConcurrentHashMap<>();
|
||||
private final ExecutorService dispatchExecutor = Executors.newSingleThreadExecutor(r -> {
|
||||
Thread t = new Thread(r, "oac-fx-event-dispatch");
|
||||
t.setDaemon(true);
|
||||
return t;
|
||||
});
|
||||
|
||||
/**
|
||||
* Creates a new FxEventHost.
|
||||
*
|
||||
* @param dom fx dom host
|
||||
*/
|
||||
public FxEventHost(FxDomHost dom) {
|
||||
this.dom = Objects.requireNonNull(dom, "dom");
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the active Lua router for this host.
|
||||
*
|
||||
* @param router lua router
|
||||
*/
|
||||
public FxEventHost(FxDomHost dom, LuaEventRouter router) {
|
||||
this.dom = Objects.requireNonNull(dom, "dom");
|
||||
public void setRouter(LuaEventRouter router) {
|
||||
this.router = Objects.requireNonNull(router, "router");
|
||||
}
|
||||
|
||||
@@ -49,7 +63,7 @@ public final class FxEventHost implements EventHost {
|
||||
elementListeners.computeIfAbsent(key, k -> {
|
||||
EventListener listener = ev -> {
|
||||
Map<String, Object> payload = FxEventPayloadExtractor.extract(ev);
|
||||
router.emit(elementId, evt, payload);
|
||||
dispatchExecutor.execute(() -> emitSafely(elementId, evt, payload));
|
||||
};
|
||||
|
||||
FxThreadBridge.runAndWait(() -> {
|
||||
@@ -87,7 +101,7 @@ public final class FxEventHost implements EventHost {
|
||||
globalListeners.computeIfAbsent(evt, k -> {
|
||||
EventListener listener = ev -> {
|
||||
Map<String, Object> payload = FxEventPayloadExtractor.extract(ev);
|
||||
router.emit(GLOBAL_TARGET_ID, evt, payload);
|
||||
dispatchExecutor.execute(() -> emitSafely(GLOBAL_TARGET_ID, evt, payload));
|
||||
};
|
||||
|
||||
FxThreadBridge.runAndWait(() -> {
|
||||
@@ -113,4 +127,18 @@ public final class FxEventHost implements EventHost {
|
||||
((EventTarget) doc).removeEventListener(evt, listener, false);
|
||||
});
|
||||
}
|
||||
|
||||
private void emitSafely(String elementId, String eventName, Map<String, Object> payload) {
|
||||
try {
|
||||
LuaEventRouter activeRouter = router;
|
||||
if (activeRouter == null) {
|
||||
System.err.println("[oac.event] Dropping '" + eventName + "' for '" + elementId + "': router not initialized");
|
||||
return;
|
||||
}
|
||||
activeRouter.emit(elementId, eventName, payload);
|
||||
} catch (RuntimeException ex) {
|
||||
System.err.println("[oac.event] Failed to dispatch '" + eventName + "' for '" + elementId + "': " + ex.getMessage());
|
||||
ex.printStackTrace(System.err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user