33#AutoIt3Wrapper_Run_AU3Check=Y
44#AutoIt3Wrapper_AU3Check_Stop_OnWarning=y
55#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
6+ #Au3Stripper_Ignore_Funcs=__NetWebView2_WebEvents_*,__NetWebView2_JSEvents_*
67
78#include <Array.au3>
89#include <GUIConstantsEx.au3>
10+ #include <WinAPIShPath.au3>
911#include <WindowsConstants.au3>
1012
11-
1213; Global objects
1314Global $_g_hNetWebView2Lib_DLL = ''
1415Global $_g_oWeb
1516Global $g_DebugInfo = True
16- _Example()
1717
1818#Region ; NetWebView2Lib UDF
1919Func _NetWebView2_StartUp($sDLLFileFullPath)
20+ #RegistrationFree is WorkInProgress
21+ $sDLLFileFullPath = _WinAPI_PathCanonicalize($sDLLFileFullPath)
22+ ;~ ConsoleWrite($sDLLFileFullPath & @CRLF)
2023 $_g_hNetWebView2Lib_DLL = DllOpen($sDLLFileFullPath)
24+
25+ ;~ ConsoleWrite("! " & VarGetType($_g_hNetWebView2Lib_DLL) & @CRLF)
26+ ;~ ConsoleWrite("! " & $_g_hNetWebView2Lib_DLL & @CRLF)
27+ If $_g_hNetWebView2Lib_DLL = -1 Then
28+ __NetWebView2_Log(@ScriptLineNumber, 'Error loading AcitevX DLL : ' & $_g_hNetWebView2Lib_DLL)
29+ Return SetError(1, @extended, $_g_hNetWebView2Lib_DLL)
30+ EndIf
2131 Return SetError(@error, @extended, $_g_hNetWebView2Lib_DLL)
2232EndFunc ;==>_NetWebView2_StartUp
2333
34+ Func _NetWebView2_ShutDown()
35+ DllClose($_g_hNetWebView2Lib_DLL)
36+ EndFunc ;==>_NetWebView2_ShutDown
37+
2438; #FUNCTION# ====================================================================================================================
2539; Name ..........: _NetWebView2_CreateManager
2640; Description ...:
@@ -37,8 +51,10 @@ EndFunc ;==>_NetWebView2_StartUp
3751Func _NetWebView2_CreateManager()
3852 Local $oMyError = ObjEvent("AutoIt.Error", __NetWebView2_COMErrFunc) ; Local COM Error Handler
3953 #forceref $oMyError
40- Local $oWebV2M = ObjCreate("NetWebView2.Manager", "{CCB12345-6789-4ABC-DEF0-1234567890AB}", $_g_hNetWebView2Lib_DLL) ; NOT REGISTERED VERSION
54+ Local $oWebV2M = ObjCreate("NetWebView2.Manager") ; REGISTERED VERSION
55+ ;~ Local $oWebV2M = ObjCreate("NetWebView2.Manager", "{CCB12345-6789-4ABC-DEF0-1234567890AB}", $_g_hNetWebView2Lib_DLL) ; NOT REGISTERED VERSION
4156;~ _NetWebView2_ObjName_FlagsValue($oWebV2M)
57+ If @error Then __NetWebView2_Log(@ScriptLineNumber, "! [NetWebView2Lib]: Manager Creation ERROR")
4258 Return SetError(@error, @extended, $oWebV2M)
4359EndFunc ;==>_NetWebView2_CreateManager
4460
@@ -59,7 +75,8 @@ Func _NetJson_CreateParser($sInitialJson = "{}")
5975 Local $oMyError = ObjEvent("AutoIt.Error", __NetWebView2_COMErrFunc) ; Local COM Error Handler
6076 #forceref $oMyError
6177 If $sInitialJson = "" Or $sInitialJson = Default Then $sInitialJson = "{}"
62- Local $oParser = ObjCreate("NetJson.Parser", "{D1E2F3A4-B5C6-4D7E-8F9A-0B1C2D3E4F5A}", $_g_hNetWebView2Lib_DLL) ; NOT REGISTERED VERSION
78+ Local $oParser = ObjCreate("NetJson.Parser") ; REGISTERED VERSION
79+ ;~ Local $oParser = ObjCreate("NetJson.Parser", "{D1E2F3A4-B5C6-4D7E-8F9A-0B1C2D3E4F5A}", $_g_hNetWebView2Lib_DLL) ; NOT REGISTERED VERSION
6380 If Not IsObj($oParser) Then Return SetError(1, 0, 0)
6481 $oParser.Parse($sInitialJson)
6582 Return $oParser
@@ -235,14 +252,14 @@ Func __NetWebView2_JSEvents_OnMessageReceived($sMsg)
235252 If UBound($aClickData) >= 2 Then
236253 Local $sKey = StringStripWS($aClickData[0], 3)
237254 Local $sVal = StringStripWS($aClickData[1], 3)
238- __NetWebView2_Log(@ScriptLineNumber, "+++ [JavaScriptEvents]: Property: " & $sKey & " | Value: " & $sVal & @CRLF )
255+ __NetWebView2_Log(@ScriptLineNumber, "+++ [JavaScriptEvents]: Property: " & $sKey & " | Value: " & $sVal)
239256 EndIf
240257
241258 Case "COM_TEST"
242- __NetWebView2_Log(@ScriptLineNumber, "- [JavaScriptEvents]: Status: Legacy COM_TEST: " & $sData & @CRLF )
259+ __NetWebView2_Log(@ScriptLineNumber, "- [JavaScriptEvents]: Status: Legacy COM_TEST: " & $sData)
243260
244261 Case "ERROR"
245- __NetWebView2_Log(@ScriptLineNumber, "! [JavaScriptEvents]: Status: " & $sData & @CRLF )
262+ __NetWebView2_Log(@ScriptLineNumber, "! [JavaScriptEvents]: Status: " & $sData)
246263 EndSwitch
247264 EndIf
248265EndFunc ;==>__NetWebView2_JSEvents_OnMessageReceived
@@ -256,226 +273,3 @@ EndFunc ;==>__NetWebView2_WebEvents_OnContextMenuRequested
256273#EndRegion ; === EVENT HANDLERS ===
257274
258275#EndRegion ; NetWebView2Lib UDF
259-
260- #Region ; UDF TESTING EXAMPLE
261- Func _Example()
262- Local $oMyError = ObjEvent("AutoIt.Error", __NetWebView2_COMErrFunc)
263- #forceref $oMyError
264- ; Create GUI with resizing support
265- Local $hGUI = GUICreate("WebView2AutoIt JSON Viewer", 500, 650, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPCHILDREN))
266- GUISetBkColor(0x2B2B2B, $hGUI)
267-
268- ; GUI Controls for JSON Tree interaction
269- Local $idExpand = GUICtrlCreateLabel("Expand All", 10, 10, 90, 30)
270- GUICtrlSetFont(-1, 12, Default, $GUI_FONTUNDER, "Segoe UI")
271- GUICtrlSetResizing(-1, $GUI_DOCKALL)
272- GUICtrlSetColor(-1, 0x00FF00) ; Green
273-
274- Local $idCollapse = GUICtrlCreateLabel("Collapse All", 110, 10, 90, 30)
275- GUICtrlSetFont(-1, 12, Default, $GUI_FONTUNDER, "Segoe UI")
276- GUICtrlSetResizing(-1, $GUI_DOCKALL)
277- GUICtrlSetColor(-1, 0xFF4D4D) ; Red
278-
279- Local $idFind = GUICtrlCreateLabel("Search", 210, 10, 60, 30)
280- GUICtrlSetFont(-1, 12, Default, $GUI_FONTUNDER, "Segoe UI")
281- GUICtrlSetResizing(-1, $GUI_DOCKALL)
282- GUICtrlSetColor(-1, 0xFFD700) ; Gold
283-
284- Local $idLoadFile = GUICtrlCreateLabel("Load JSON", 280, 10, 90, 30)
285- GUICtrlSetFont(-1, 12, Default, $GUI_FONTUNDER, "Segoe UI")
286- GUICtrlSetResizing(-1, $GUI_DOCKALL)
287- GUICtrlSetColor(-1, 0x00CCFF) ; Light Blue
288-
289- _NetWebView2_StartUp(@ScriptDir & '\bin\NetWebView2Lib.dll')
290-
291- ; Initialize WebView2 Manager and register events
292- Local $oWebV2M = _NetWebView2_CreateManager()
293- $_g_oWeb = $oWebV2M
294- If @error Then Return SetError(@error, @extended, $oWebV2M)
295-
296- ObjEvent($oWebV2M, "__NetWebView2_WebEvents_", "IWebViewEvents")
297-
298- ; Important: Pass $hGUI in parentheses to maintain Pointer type for COM
299- Local $sProfileDirectory = @TempDir & "\NetWebView2Lib-UserDataFolder"
300- $oWebV2M.Initialize($hGUI, $sProfileDirectory, 0, 50, 500, 600)
301-
302- ; Initialize JavaScript Bridge
303- Local $oJS = $oWebV2M.GetBridge()
304- ObjEvent($oJS, "__NetWebView2_JSEvents_", "IBridgeEvents")
305-
306- ; Wait for WebView2 to be ready
307- Do
308- Sleep(50)
309- Until $oWebV2M.IsReady
310-
311- ; WebView2 Configuration
312- $oWebV2M.SetAutoResize(True) ; Using SetAutoResize(True) to skip WM_SIZE
313- $oWebV2M.BackColor = "0x2B2B2B"
314- $oWebV2M.AreDevToolsEnabled = True ; Allow F12
315- $oWebV2M.ZoomFactor = 1.2
316-
317- ; Initial JSON display
318- Local $sMyJson = '{"Game": "Witcher 3", "ID": 1, "Meta": {"Developer": "CD Projekt", "Year": 2015 }, "Tags": ["RPG", "Open World"]}'
319-
320- _Web_jsonTree($oWebV2M, $sMyJson) ; 🏆 https://github.com/summerstyle/jsonTreeViewer
321-
322- GUISetState(@SW_SHOW)
323-
324- Local $sLastSearch = ""
325-
326- ; Main Application Loop
327- While 1
328- Switch GUIGetMsg()
329- Case $GUI_EVENT_CLOSE
330- Exit
331-
332- Case $idExpand
333- ; Call JavaScript expand method on the global tree object
334- $oWebV2M.ExecuteScript("if(window.tree) window.tree.expand();")
335-
336- Case $idCollapse
337- ; Call JavaScript collapse method
338- $oWebV2M.ExecuteScript("if(window.tree) window.tree.collapse();")
339-
340- Case $idFind
341- Local $sInput = InputBox("JSON Search", "Enter key or value:", $sLastSearch, "", 200, 130, Default, Default, Default, $hGUI)
342- If Not @error And StringLen(StringStripWS($sInput, 3)) > 0 Then
343- $sLastSearch = StringStripWS($sInput, 3)
344- _Web_jsonTreeFind($oWebV2M, $sLastSearch, False) ; New search
345- EndIf
346-
347- Case $idLoadFile
348- Local $sFilePath = FileOpenDialog("Select JSON File", @ScriptDir, "JSON Files (*.json;*.txt)", 1)
349- If Not @error Then
350- Local $sFileData = FileRead($sFilePath)
351- If $sFileData <> "" Then
352- _Web_jsonTree($oWebV2M, $sFileData) ; Re-render tree with new data
353- __NetWebView2_Log(@ScriptLineNumber, "+ Loaded JSON from: " & $sFilePath)
354- EndIf
355- EndIf
356-
357- EndSwitch
358- WEnd
359-
360- If IsObj($oWebV2M) Then $oWebV2M.Cleanup()
361- $oWebV2M = 0
362- $oJS = 0
363-
364- EndFunc ;==>Main
365-
366- #Region ; === UTILS ===
367-
368- ; #FUNCTION# ====================================================================================================================
369- ; Name...........: _Web_jsonTree
370- ; Description....: Renders JSON data using the jsonTree library by summerstyle.
371- ; Author.........: summerstyle (https://github.com/summerstyle/jsonTreeViewer)
372- ; Integration....: Adapted for AutoIt WebView2
373- ; ===============================================================================================================================
374- Func _Web_jsonTree(ByRef $oWebV2M, $sJson)
375- ; 1. Prepare JSON (Minify to prevent script errors from line breaks)
376- Local $oJSON = _NetJson_CreateParser($sJson)
377- ;~ _NetWebView2_ObjName_FlagsValue($oJSON)
378- $sJson = $oJSON.GetMinifiedJson()
379-
380- ; 2. Load local library files
381- Local $sJsLib = FileRead(@ScriptDir & "\examples\v1.4.2_jsonTree\JS_Lib\jsonTree.js")
382- Local $sCssLib = FileRead(@ScriptDir & "\examples\v1.4.2_jsonTree\JS_Lib\jsonTreeDark.css")
383-
384- ; 3. Build HTML with embedded Logic
385- Local $sHTML = "<html><head><meta charset=""utf-8""><style>" & _
386- $sCssLib & _
387- "</style></head><body>" & _
388- "<div id='tree-container' class='jsontree_tree'></div>" & _
389- " <div style='position:fixed; bottom:5px; right:10px; font-size:10px; color:#555; font-family:sans-serif;'>" & _
390- " Powered by <a href='https://github.com/summerstyle/jsonTreeViewer' style='color:#777; text-decoration:none;'>jsonTree</a>" & _
391- " </div>" & _
392- "<script>" & @CRLF & _
393- $sJsLib & @CRLF & _
394- ";" & @CRLF & _ ; Ensure library/code separation
395- "try {" & @CRLF & _
396- " var data = " & $sJson & ";" & @CRLF & _
397- " var container = document.getElementById('tree-container');" & @CRLF & _
398- " if (typeof jsonTree !== 'undefined') {" & @CRLF & _
399- " window.tree = jsonTree.create(data, container);" & @CRLF & _ ; Assign to window for global access
400- " window.tree.expand(1);" & @CRLF & _
401- " container.addEventListener('click', function(e) {" & @CRLF & _
402- " var node = e.target.closest('.jsontree_node');" & @CRLF & _
403- " if (node) {" & @CRLF & _
404- " var labelEl = node.querySelector('.jsontree_label');" & @CRLF & _
405- " var valueEl = node.querySelector('.jsontree_value');" & @CRLF & _
406- " if (labelEl && valueEl) {" & @CRLF & _
407- " var msg = 'JSON_CLICKED|' + labelEl.innerText + ' = ' + valueEl.innerText;" & @CRLF & _
408- " window.chrome.webview.postMessage(msg);" & @CRLF & _
409- " }" & @CRLF & _
410- " }" & @CRLF & _
411- " });" & @CRLF & _
412- " } else {" & @CRLF & _
413- " throw new Error('jsonTree library not loaded');" & @CRLF & _
414- " }" & @CRLF & _
415- "} catch(e) {" & @CRLF & _
416- " window.chrome.webview.postMessage('DEBUG:' + e.message);" & @CRLF & _
417- " document.body.innerHTML = '<b style=""color:red"">JS Error:</b> ' + e.message;" & @CRLF & _
418- "}" & @CRLF & _
419- "</script></body></html>"
420-
421- ; 4. Navigate to the generated HTML
422- $oWebV2M.NavigateToString($sHTML)
423- __NetWebView2_Log(@ScriptLineNumber, "+ JSON Tree Rendered & Listeners Active")
424- EndFunc ;==>_Web_jsonTree
425-
426- ; #FUNCTION# ====================================================================================================================
427- ; Name...........: _Web_jsonTreeFind
428- ; Description....: Searches for a string in labels and values and highlights matching nodes.
429- ; Parameters.....: $sSearch - The string to find
430- ; ===============================================================================================================================
431- Func _Web_jsonTreeFind(ByRef $oWebV2M, $sSearch, $bNext = False)
432- Local $sJS = _
433- "var term = '" & $sSearch & "'.toLowerCase();" & _
434- "if (!window.searchIndices || window.lastTerm !== term) {" & _
435- " window.searchIndices = [];" & _
436- " window.currentSearchIndex = -1;" & _
437- " window.lastTerm = term;" & _
438- "}" & _
439- "" & _
440- "/* 1. If it's a new search, find all targets */" & _
441- "if (!" & StringLower($bNext) & " || window.searchIndices.length === 0) {" & _
442- " document.querySelectorAll('.jsontree_node_marked').forEach(el => el.classList.remove('jsontree_node_marked', 'jsontree_node_active'));" & _
443- " var targets = document.querySelectorAll('.jsontree_label, .jsontree_value');" & _
444- " window.searchIndices = [];" & _
445- " targets.forEach(function(el) {" & _
446- " var text = el.innerText.toLowerCase();" & _
447- " var isBracket = (text === '{' || text === '}' || text === '[' || text === ']' || text === '{ }' || text === '[ ]');" & _
448- " if (!isBracket && (el.classList.contains('jsontree_label') || el.children.length === 0) && text.includes(term)) {" & _
449- " el.classList.add('jsontree_node_marked');" & _
450- " window.searchIndices.push(el);" & _
451- " }" & _
452- " });" & _
453- "}" & _
454- "" & _
455- "/* 2. Move to next index */" & _
456- "if (window.searchIndices.length > 0) {" & _
457- " /* Remove active class from previous */" & _
458- " if (window.currentSearchIndex >= 0) window.searchIndices[window.currentSearchIndex].classList.remove('jsontree_node_active');" & _
459- " " & _
460- " window.currentSearchIndex++;" & _
461- " if (window.currentSearchIndex >= window.searchIndices.length) window.currentSearchIndex = 0;" & _
462- " " & _
463- " var activeEl = window.searchIndices[window.currentSearchIndex];" & _
464- " activeEl.classList.add('jsontree_node_active');" & _
465- " " & _
466- " /* Expand parents of active element */" & _
467- " var p = activeEl.closest('.jsontree_node');" & _
468- " while (p && p.id !== 'tree-container') {" & _
469- " if (p.classList.contains('jsontree_node_complex')) p.classList.add('jsontree_node_expanded');" & _
470- " p = p.parentElement;" & _
471- " }" & _
472- " activeEl.scrollIntoView({behavior: 'smooth', block: 'center'});" & _
473- "}"
474-
475- ; Replace the AutoIt variable $bNext with JS boolean
476- ;~ $sJS = StringReplace($sJS, "$bNext", ($bNext ? "true" : "false"))
477- ConsoleWrite("$sJS=" & $sJS & @CRLF)
478- $oWebV2M.ExecuteScript($sJS)
479- EndFunc ;==>_Web_jsonTreeFind
480- #EndRegion ; === UTILS ===
481- #EndRegion ; UDF TESTING EXAMPLE
0 commit comments