Javafx-WebView-Debugger icon indicating copy to clipboard operation
Javafx-WebView-Debugger copied to clipboard

JavaFX 17 on JDK 17 and Chrome 114

Open TWiStErRob opened this issue 2 years ago • 0 comments

Hey, I was trying this out without making changes to my dev env. The result, surprisingly good:

  • DOM is visible (highlight not working)
  • Console not working (as described in README)
  • Sources show some empty files, but where it shows content I can place breakpoints.
  • Breakpoints are hit (page is paused), but Dev Tools doesn't show it visually.

Here's my setup code: below you can see comments on things that were not really working by default.

private fun setupDebugger(webView: WebView) {
	// Patch default LogHandler... the initialization order is wrong: LOG_HANDLER forward-references NULL.
	//LogHandler.LOG_HANDLER = LogHandler.NULL
	// Optionally override LogHandler with my own implementation to log wherever I want it to route.
	LogHandler.LOG_HANDLER = @Suppress("StringLiteralDuplication") object : LogHandler() {
		// @formatter:off
		override fun error(message: String) { log("error", message) }
		override fun error(message: String, t: Throwable) { log("error", message, t) }
		override fun error(t: Throwable) { log("error", null, t) }
		override fun info(message: String) { log("info", message) }
		override fun info(message: String, t: Throwable) { log("info", message, t) }
		override fun info(t: Throwable) { log("info", null, t) }
		override fun warn(message: String) { log("warn", message) }
		override fun warn(message: String, t: Throwable) { log("warn", message, t) }
		override fun warn(t: Throwable) { log("warn",null, t) }
		// Disable debug logging in JfxWebSocketServer about the Dev Tools protocol,
		// because it causes unconditional logs to System.out/err rather than to debug().
		override fun isDebugEnabled(): Boolean = false
		override fun debug(message: String) { log("debug", message) }
		override fun debug(message: String, t: Throwable) { log("debug", message, t) }
		override fun debug(t: Throwable) { log("debug", null, t) }
		override fun isTraceEnabled(): Boolean = true
		override fun trace(message: String) { log("trace", message) }
		override fun trace(message: String, t: Throwable) { log("trace", message, t) }
		override fun trace(t: Throwable) { log("trace", null, t) }
		// @formatter:on
		private fun log(level: String, message: String? = null, t: Throwable? = null) {
			println("[$level] $message")
			t?.printStackTrace()
		}
	}
	val bridge = DevToolsDebuggerJsBridge(webView, webView.engine, 0, null, false)
	webView.engine.loadWorker.stateProperty().addListener { _, _, newState ->
		when (newState) {
			Worker.State.SCHEDULED -> {
				// According to docs, there's no need for custom load() method,
				// this event will fire at the right time.
				bridge.pageReloading()
			}
			Worker.State.RUNNING -> {
				// Required since Debugger.globalObjectCleared appears to be not called.
				webView.engine.executeScript(
					bridge::class.java
						.getDeclaredField("myJfxDebuggerAccess")
						.apply { isAccessible = true }
						.get(bridge)
						.let { it as JfxDebuggerAccess }
						.jsBridgeHelperScript()
				)
			}
			Worker.State.SUCCEEDED -> {
				bridge.connectJsBridge()
				val port = @Suppress("MagicNumber") 9222
				bridge.startDebugServer(port, Throwable::printStackTrace) {
					// Note: URL protocol changed at one point from chrome-devtools:// to devtools://.
					println("Ready at devtools://devtools/bundled/inspector.html?ws=localhost:${port}")
				}
			}
			else -> {} // Nothing to do.
		}
	}
}

It would be amazing to see this project revived with the latest dev tools protocol!

TWiStErRob avatar Jun 13 '23 09:06 TWiStErRob