From 7e7133e08c4f882f2180187ed84942a6bf1f0fb8 Mon Sep 17 00:00:00 2001 From: GiantLuigi4 <49770992+GiantLuigi4@users.noreply.github.com> Date: Mon, 27 Nov 2023 15:18:30 -0500 Subject: [PATCH] tweaks to js handling --- .../net/montoyo/wd/client/gui/GuiMinePad.java | 52 ++----------------- .../wd/client/renderers/ScreenRenderer.java | 2 +- .../montoyo/wd/entity/ScreenBlockEntity.java | 4 +- .../net/montoyo/wd/entity/ScreenData.java | 18 ++++--- .../wd/utilities/browser/InWorldQueries.java | 14 +++++ .../wd/utilities/browser/WDBrowser.java | 13 ++++- .../wd/utilities/browser/WDClientBrowser.java | 30 +++++++++++ .../utilities/browser/handlers/WDRouter.java | 24 +++++---- .../js/queries/ElementCenterQuery.java | 34 +++++++++--- .../handlers/js/queries/GetSizeQuery.java | 32 ++++++++++++ .../assets/webdisplays/html/wdlib.js | 2 +- .../assets/webdisplays/js/pointer_lock.js | 31 ++++++----- .../assets/webdisplays/js/query_element.js | 28 +++++----- 13 files changed, 178 insertions(+), 106 deletions(-) create mode 100644 src/main/java/net/montoyo/wd/utilities/browser/InWorldQueries.java create mode 100644 src/main/java/net/montoyo/wd/utilities/browser/handlers/js/queries/GetSizeQuery.java diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiMinePad.java b/src/main/java/net/montoyo/wd/client/gui/GuiMinePad.java index f8585bc..392b41b 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiMinePad.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiMinePad.java @@ -17,6 +17,7 @@ import net.minecraft.network.chat.Component; import net.minecraftforge.api.distmarker.OnlyIn; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.client.ClientProxy; +import net.montoyo.wd.utilities.browser.WDBrowser; import net.montoyo.wd.utilities.browser.handlers.js.Scripts; import net.montoyo.wd.utilities.browser.handlers.WDRouter; import net.montoyo.wd.utilities.data.BlockSide; @@ -342,55 +343,10 @@ public class GuiMinePad extends WDScreen { } } - private static WDRouter.Task activeTask; - private static long futureStart = 0; protected void pollElement() { - if (activeTask != null) { - if (System.currentTimeMillis() - 1000 > futureStart) { - activeTask.cancel(); - activeTask = null; - } else return; + if (pad.view instanceof WDBrowser browser) { + JsonObject object = browser.pointerLockElement().getObj(); + if (object != null) updateCrd(object); } - -//@formatter:off -activeTask = WDRouter.INSTANCE.requestJson(pad.view, "PointerElement", """ -try { - let focusedElement = document.pointerLockElement; - if (focusedElement == null || focusedElement == document.body) { - window.cefQuery({ - request: 'WebDisplays_PointerElement{exists: false}', - onSuccess: function(response) {}, - onFailure: function(error_code, error_message) {} - }); - } else { - let bodyRect = document.body.getBoundingClientRect(); - let elemRect = focusedElement.getBoundingClientRect(); - - window.cefQuery({ - request: 'WebDisplays_PointerElement{exists: true,'+ - 'x: ' + (elemRect.left) + ',' + - 'y: ' + (elemRect.top) + ',' + - 'w: ' + ((elemRect.right - elemRect.left)) + ',' + - 'h: ' + ((elemRect.bottom - elemRect.top)) + ',' + - 'unadjust: ' + document.webdisplays__unadjustPointerMotion + - '}', - onSuccess: function(response) {}, - onFailure: function(error_code, error_message) {} - }); - } -} catch (err) { - console.error(err); - window.cefQuery({ - request: 'WebDisplays_PointerElement{exists: false}', - onSuccess: function(response) {}, - onFailure: function(error_code, error_message) {} - }); -}""".replace("\n", "") - ).thenAccept((o1) -> { - updateCrd(o1); - activeTask = null; - }); - futureStart = System.currentTimeMillis(); -//@formatter:on } } diff --git a/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java b/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java index 51b9fa6..631ffa8 100644 --- a/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java +++ b/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java @@ -51,7 +51,7 @@ public class ScreenRenderer implements BlockEntityRenderer { if (scr.browser == null) { double dist = WebDisplays.PROXY.distanceTo(te, Minecraft.getInstance().getEntityRenderDispatcher().camera.getPosition()); if (dist <= WebDisplays.INSTANCE.loadDistance2 * 16) - scr.createBrowser(true); + scr.createBrowser(te, true); else continue; } diff --git a/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java b/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java index c5ac793..bf51f6e 100644 --- a/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java +++ b/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java @@ -135,7 +135,7 @@ public class ScreenBlockEntity extends BlockEntity { public void handleUpdateTag(CompoundTag tag) { load(tag); for (ScreenData screen : screens) { - if (screen.browser == null) screen.createBrowser(false); + if (screen.browser == null) screen.createBrowser(this, false); if (screen.browser != null) screen.browser.loadURL(screen.url); } updateAABB(); @@ -1085,7 +1085,7 @@ public class ScreenBlockEntity extends BlockEntity { public void activate() { for (ScreenData screen : screens) { if (screen.browser == null) - screen.createBrowser(false); + screen.createBrowser(this, false); } } diff --git a/src/main/java/net/montoyo/wd/entity/ScreenData.java b/src/main/java/net/montoyo/wd/entity/ScreenData.java index 2a551b4..3e79256 100644 --- a/src/main/java/net/montoyo/wd/entity/ScreenData.java +++ b/src/main/java/net/montoyo/wd/entity/ScreenData.java @@ -10,11 +10,13 @@ import net.minecraft.nbt.ListTag; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.client.ClientProxy; import net.montoyo.wd.config.CommonConfig; import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.utilities.*; +import net.montoyo.wd.utilities.browser.InWorldQueries; import net.montoyo.wd.utilities.browser.WDBrowser; import net.montoyo.wd.utilities.data.BlockSide; import net.montoyo.wd.utilities.data.Rotation; @@ -183,21 +185,23 @@ public class ScreenData { } } - public void createBrowser(boolean doAnim) { - if (WebDisplays.PROXY instanceof ClientProxy clientProxy) { + public void createBrowser(ScreenBlockEntity be, boolean doAnim) { + if (WebDisplays.PROXY instanceof ClientProxy) { browser = WDBrowser.createBrowser(WebDisplays.applyBlacklist(url != null ? url : "https://www.google.com"), false); + // set screen if (browser instanceof MCEFBrowser mcefBrowser) { if (rotation.isVertical) mcefBrowser.resize(resolution.y, resolution.x); else mcefBrowser.resize(resolution.x, resolution.y); - // uh yes this is intentional - // basically: on my laptop, this line caused an error inexplicably - // reason: the compiler didn't update this file, so it stayed as a Consumer in the bytecode - //noinspection RedundantCast - mcefBrowser.setCursorChangeListener((MCEFCursorChangeListener) (type) -> mouseType = type); + mcefBrowser.setCursorChangeListener((type) -> mouseType = type); + } + + // setup screen as in world + if (browser instanceof WDBrowser wdBrowser) { + InWorldQueries.attach(be, side, wdBrowser); } doTurnOnAnim = doAnim; diff --git a/src/main/java/net/montoyo/wd/utilities/browser/InWorldQueries.java b/src/main/java/net/montoyo/wd/utilities/browser/InWorldQueries.java new file mode 100644 index 0000000..9b2a3e0 --- /dev/null +++ b/src/main/java/net/montoyo/wd/utilities/browser/InWorldQueries.java @@ -0,0 +1,14 @@ +package net.montoyo.wd.utilities.browser; + +import net.montoyo.wd.entity.ScreenBlockEntity; +import net.montoyo.wd.utilities.browser.handlers.js.queries.GetSizeQuery; +import net.montoyo.wd.utilities.data.BlockSide; + +public class InWorldQueries { + private static final GetSizeQuery getSize = new GetSizeQuery(); + + public static void attach(ScreenBlockEntity blockEntity, BlockSide side, WDBrowser browser) { + browser.setBe(blockEntity, side); + browser.queryHandlers().put(getSize.getName(), getSize); + } +} diff --git a/src/main/java/net/montoyo/wd/utilities/browser/WDBrowser.java b/src/main/java/net/montoyo/wd/utilities/browser/WDBrowser.java index 7815427..50e4deb 100644 --- a/src/main/java/net/montoyo/wd/utilities/browser/WDBrowser.java +++ b/src/main/java/net/montoyo/wd/utilities/browser/WDBrowser.java @@ -1,8 +1,10 @@ package net.montoyo.wd.utilities.browser; import com.cinemamod.mcef.MCEF; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.browser.handlers.js.queries.ElementCenterQuery; import net.montoyo.wd.utilities.browser.handlers.js.JSQueryHandler; +import net.montoyo.wd.utilities.data.BlockSide; import org.cef.browser.CefBrowser; import java.util.HashMap; @@ -20,10 +22,19 @@ public interface WDBrowser { static void registerQueries(WDBrowser browser) { Map handlerMap = browser.queryHandlers(); - JSQueryHandler handler = browser.focusedElement(); + JSQueryHandler handler; + + handler = browser.focusedElement(); + handlerMap.put(handler.getName(), handler); + handler = browser.pointerLockElement(); handlerMap.put(handler.getName(), handler); } HashMap queryHandlers(); ElementCenterQuery focusedElement(); + ElementCenterQuery pointerLockElement(); + + void setBe(ScreenBlockEntity blockEntity, BlockSide side); + ScreenBlockEntity getBe(); + BlockSide getSide(); } diff --git a/src/main/java/net/montoyo/wd/utilities/browser/WDClientBrowser.java b/src/main/java/net/montoyo/wd/utilities/browser/WDClientBrowser.java index 528fee0..093a900 100644 --- a/src/main/java/net/montoyo/wd/utilities/browser/WDClientBrowser.java +++ b/src/main/java/net/montoyo/wd/utilities/browser/WDClientBrowser.java @@ -2,15 +2,24 @@ package net.montoyo.wd.utilities.browser; import com.cinemamod.mcef.MCEFBrowser; import com.cinemamod.mcef.MCEFClient; +import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.browser.handlers.js.queries.ElementCenterQuery; import net.montoyo.wd.utilities.browser.handlers.js.JSQueryHandler; +import net.montoyo.wd.utilities.data.BlockSide; import java.util.HashMap; public class WDClientBrowser extends MCEFBrowser implements WDBrowser { ElementCenterQuery focusedEl = new ElementCenterQuery("ActiveElement", "document.activeElement"); + ElementCenterQuery pointerLockEl = + new ElementCenterQuery("PointerElement", "document.pointerLockElement") + .addAdditional("unadjust", "document.webdisplays__unadjustPointerMotion") + ; HashMap handlerHashMap = new HashMap<>(); + ScreenBlockEntity be; + BlockSide side; + public WDClientBrowser(MCEFClient client, String url, boolean transparent) { super(client, url, transparent); } @@ -24,4 +33,25 @@ public class WDClientBrowser extends MCEFBrowser implements WDBrowser { public ElementCenterQuery focusedElement() { return focusedEl; } + + @Override + public ElementCenterQuery pointerLockElement() { + return pointerLockEl; + } + + @Override + public void setBe(ScreenBlockEntity blockEntity, BlockSide side) { + this.be = blockEntity; + this.side = side; + } + + @Override + public ScreenBlockEntity getBe() { + return be; + } + + @Override + public BlockSide getSide() { + return side; + } } diff --git a/src/main/java/net/montoyo/wd/utilities/browser/handlers/WDRouter.java b/src/main/java/net/montoyo/wd/utilities/browser/handlers/WDRouter.java index 7626615..b38a46d 100644 --- a/src/main/java/net/montoyo/wd/utilities/browser/handlers/WDRouter.java +++ b/src/main/java/net/montoyo/wd/utilities/browser/handlers/WDRouter.java @@ -66,26 +66,28 @@ public class WDRouter extends CefMessageRouterHandlerAdapter { int i0 = request.indexOf('('); // legacy, TODO: support int i1 = request.indexOf('{'); if (i0 == -1) i0 = i1; + if (i1 == -1) i1 = i0; + if (i1 == -1) { if (handlerMap.containsKey(request)) { if (!handlerMap.get(request).handle(browser, frame, null, persistent, callback)) { callback.failure(-1, "Query " + queryId + " with data " + request + " completed, but wasn't marked as successful."); } } - } + } else { + int min = Math.min(i0, i1); + String text = request.substring(0, min); + if (handlerMap.containsKey(text)) { + JsonObject obj = null; + if (request.charAt(min) == '{') + obj = gson.fromJson(request.substring(min), JsonObject.class); - int min = Math.min(i0, i1); - String text = request.substring(0, min); - if (handlerMap.containsKey(text)) { - JsonObject obj = null; - if (request.charAt(min) == '{') - obj = gson.fromJson(request.substring(min), JsonObject.class); - - if (!handlerMap.get(text).handle(browser, frame, obj, persistent, callback)) { - callback.failure(-1, "Query " + queryId + " with data " + request + " completed, but wasn't marked as successful."); + if (!handlerMap.get(text).handle(browser, frame, obj, persistent, callback)) { + callback.failure(-1, "Query " + queryId + " with data " + request + " completed, but wasn't marked as successful."); + } } + callback.failure(-1, "Query " + queryId + " with data " + request + " completed, but there was no active request waiting for the result."); } - callback.failure(-1, "Query " + queryId + " with data " + request + " completed, but there was no active request waiting for the result."); } } diff --git a/src/main/java/net/montoyo/wd/utilities/browser/handlers/js/queries/ElementCenterQuery.java b/src/main/java/net/montoyo/wd/utilities/browser/handlers/js/queries/ElementCenterQuery.java index cf2ca37..4a4c6d2 100644 --- a/src/main/java/net/montoyo/wd/utilities/browser/handlers/js/queries/ElementCenterQuery.java +++ b/src/main/java/net/montoyo/wd/utilities/browser/handlers/js/queries/ElementCenterQuery.java @@ -10,15 +10,24 @@ import org.cef.callback.CefQueryCallback; public class ElementCenterQuery extends JSQueryHandler { boolean exists = false; double x, y; + JsonObject obj; long start = -1; + String extra; String elementName; + String script = null; public ElementCenterQuery(String queryName, String name) { super(queryName); elementName = name; } + public ElementCenterQuery addAdditional(String key, String value) { + extra += "'" + key + "':" + value + " + "; + script = null; + return this; + } + @Override public boolean handle(CefBrowser browser, CefFrame frame, JsonObject data, boolean persistent, CefQueryCallback callback) { exists = data.getAsJsonPrimitive("exists").getAsBoolean(); @@ -26,18 +35,25 @@ public class ElementCenterQuery extends JSQueryHandler { x = data.getAsJsonPrimitive("x").getAsDouble() + data.getAsJsonPrimitive("w").getAsDouble() / 2; y = data.getAsJsonPrimitive("y").getAsDouble() + data.getAsJsonPrimitive("h").getAsDouble() / 2; } + obj = data; start = -1; - callback.success(""); + callback.success("Success"); return true; } public void dispatch(CefBrowser browser) { + if (script == null) { + script = Scripts.QUERY_ELEMENT + .replace("%type%", elementName) + .replace("%Type%", name) + .replace("%extra%", extra) + ; + } + if (start == -1) { browser.executeJavaScript( - Scripts.QUERY_ELEMENT - .replace("%type%", elementName) - .replace("%Type%", name), + script, "CenterQuery", 0 ); @@ -46,10 +62,8 @@ public class ElementCenterQuery extends JSQueryHandler { long ms = System.currentTimeMillis(); if (start + 1000 < ms) { browser.executeJavaScript( - Scripts.QUERY_ELEMENT - .replace("%type%", elementName) - .replace("%Type%", name), - "KeyboardCamera", + script, + "CenterQuery", 0 ); start = System.currentTimeMillis(); @@ -68,4 +82,8 @@ public class ElementCenterQuery extends JSQueryHandler { public double getY() { return y; } + + public JsonObject getObj() { + return obj; + } } diff --git a/src/main/java/net/montoyo/wd/utilities/browser/handlers/js/queries/GetSizeQuery.java b/src/main/java/net/montoyo/wd/utilities/browser/handlers/js/queries/GetSizeQuery.java new file mode 100644 index 0000000..f81ab92 --- /dev/null +++ b/src/main/java/net/montoyo/wd/utilities/browser/handlers/js/queries/GetSizeQuery.java @@ -0,0 +1,32 @@ +package net.montoyo.wd.utilities.browser.handlers.js.queries; + +import com.google.gson.JsonObject; +import net.montoyo.wd.utilities.browser.WDBrowser; +import net.montoyo.wd.utilities.browser.handlers.js.JSQueryHandler; +import net.montoyo.wd.utilities.math.Vector2i; +import org.cef.browser.CefBrowser; +import org.cef.browser.CefFrame; +import org.cef.callback.CefQueryCallback; + +public class GetSizeQuery extends JSQueryHandler { + public GetSizeQuery() { + super("GetSize"); + } + + @Override + public boolean handle(CefBrowser browser, CefFrame frame, JsonObject data, boolean persistent, CefQueryCallback callback) { + if (browser instanceof WDBrowser wdBrowser) { + if (wdBrowser.getSide() != null) { + Vector2i sz = wdBrowser.getBe().getScreen( + wdBrowser.getSide() + ).size; + callback.success( + "{\"x\":" + sz.x + ",\"y\":" + sz.y + "}" + ); + return true; + } + } + callback.failure(404, "Screen has been removed."); + return true; + } +} diff --git a/src/main/resources/assets/webdisplays/html/wdlib.js b/src/main/resources/assets/webdisplays/html/wdlib.js index b4a6679..9491b70 100644 --- a/src/main/resources/assets/webdisplays/html/wdlib.js +++ b/src/main/resources/assets/webdisplays/html/wdlib.js @@ -5,7 +5,7 @@ */ function wdExecRequest(name, func) { - window.mcefQuery({ request: "WebDisplays_" + name, + window.cefQuery({ request: "WebDisplays_" + name, persistent: true, onSuccess: function(response) { try { diff --git a/src/main/resources/assets/webdisplays/js/pointer_lock.js b/src/main/resources/assets/webdisplays/js/pointer_lock.js index d407f91..ce4d15f 100644 --- a/src/main/resources/assets/webdisplays/js/pointer_lock.js +++ b/src/main/resources/assets/webdisplays/js/pointer_lock.js @@ -11,21 +11,26 @@ elemRef['element'] = this; elemRef['unadjusted'] = unadjustedMovement; document.pointerLockElement = elemRef['element']; - document.dispatchEvent(new Event("pointerlockchange")); - let bodyRect = document.body.getBoundingClientRect(); let elemRect = this.getBoundingClientRect(); + let doc = document; window.cefQuery({ - request: 'WebDisplays_ActiveElement{exists: true,'+ - 'x: ' + (elemRect.left) + ',' + - 'y: ' + (elemRect.top) + ',' + - 'w: ' + ((elemRect.right - elemRect.left)) + ',' + - 'h: ' + ((elemRect.bottom - elemRect.top)) + - '}', - onSuccess: function(response) {}, - onFailure: function(error_code, error_message) {} + request: + 'WebDisplays_PointerElement{' + + 'exists:true,' + + 'x:' + (elemRect.left) + ',' + + 'y:' + (elemRect.top) + ',' + + 'w:' + ((elemRect.right - elemRect.left)) + ',' + + 'h:' + ((elemRect.bottom - elemRect.top)) + ',' + + 'unadjust:' + document.webdisplays__unadjustPointerMotion + + '}', onSuccess: function(response) { + doc.dispatchEvent(new Event("pointerlockchange")); + }, + onFailure: function(error_code, error_message) { + doc.dispatchEvent(new Event("pointerlockerror")); + } }); } Document.prototype.exitPointerLock = () => { @@ -34,9 +39,9 @@ document.pointerLockElement = elemRef['element']; window.cefQuery({ - request: 'WebDisplays_ActiveElement{exists: false}', - onSuccess: function(response) {}, - onFailure: function(error_code, error_message) {} + request: 'WebDisplays_PointerElement{exists: false}', + onSuccess: function(response) {}, + onFailure: function(error_code, error_message) {} }); } } diff --git a/src/main/resources/assets/webdisplays/js/query_element.js b/src/main/resources/assets/webdisplays/js/query_element.js index ef09f45..ce1d161 100644 --- a/src/main/resources/assets/webdisplays/js/query_element.js +++ b/src/main/resources/assets/webdisplays/js/query_element.js @@ -2,30 +2,30 @@ try { let focusedElement = %type%; if (focusedElement == null || focusedElement == document.body) { window.cefQuery({ - request: 'WebDisplays_%Type%{exists: false}', - onSuccess: function(response) {}, - onFailure: function(error_code, error_message) {} + request: 'WebDisplays_%Type%{exists: false}', + onSuccess: function(response) {}, + onFailure: function(error_code, error_message) {} }); } else { let bodyRect = document.body.getBoundingClientRect(); let elemRect = focusedElement.getBoundingClientRect(); window.cefQuery({ - request: 'WebDisplays_%Type%{exists: true,'+ - 'x: ' + (elemRect.left) + ',' + - 'y: ' + (elemRect.top) + ',' + - 'w: ' + ((elemRect.right - elemRect.left)) + ',' + - 'h: ' + ((elemRect.bottom - elemRect.top)) + - '}', - onSuccess: function(response) {}, - onFailure: function(error_code, error_message) {} + request: 'WebDisplays_%Type%{' + + 'exists:true,' + + 'x:' + (elemRect.left) + ',' + + 'y:' + (elemRect.top) + ',' + + 'w:' + ((elemRect.right - elemRect.left)) + ',' + + 'h:' + ((elemRect.bottom - elemRect.top)) + %extra% + '}', onSuccess: function(response) {}, + onFailure: function(error_code, error_message) {} }); } } catch (err) { console.error(err); window.cefQuery({ - request: 'WebDisplays_%Type%{exists: false}', - onSuccess: function(response) {}, - onFailure: function(error_code, error_message) {} + request: 'WebDisplays_%Type%{exists: false}', + onSuccess: function(response) {}, + onFailure: function(error_code, error_message) {} }); } \ No newline at end of file