Skip to content

Commit 77e1afd

Browse files
authored
Merge pull request #81 from ioa747/mod
modified
2 parents 52c3571 + d99f6e6 commit 77e1afd

10 files changed

+390
-340
lines changed

NetWebView2Lib.au3

Lines changed: 184 additions & 116 deletions
Large diffs are not rendered by default.

examples/000-NetJson.Parser.au3

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
;~ #AutoIt3Wrapper_UseX64=y
22

33
; NetWebView2Lib.JsonParser - Tutorial Script
4+
; 000-NetJson.Parser.au3
45

56
#include <Array.au3>
67
#include <MsgBoxConstants.au3>

examples/002-Html_Gui.au3

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,10 @@ Func _Create_Form(ByRef $oWebV2M, ByRef $oBridge)
5151

5252
$idBlue = GUICtrlCreateLabel("Blue Theme", 10, 10, 100, 30)
5353
GUICtrlSetFont(-1, 12, Default, $GUI_FONTUNDER, "Segoe UI")
54-
GUICtrlSetResizing(-1, $GUI_DOCKALL)
5554
GUICtrlSetColor(-1, 0x0078D7)
5655

5756
$idRed = GUICtrlCreateLabel("Red Theme", 120, 10, 100, 30)
5857
GUICtrlSetFont(-1, 12, Default, $GUI_FONTUNDER, "Segoe UI")
59-
GUICtrlSetResizing(-1, $GUI_DOCKALL)
6058
GUICtrlSetColor(-1, 0xFF0000)
6159

6260
; Create WebView2 Manager object and register events
@@ -71,16 +69,16 @@ Func _Create_Form(ByRef $oWebV2M, ByRef $oBridge)
7169
$oWebV2M.IsZoomControlEnabled = False
7270

7371
; Create bridge object and register events
74-
$oBridge = _NetWebView2_GetBridge($oWebV2M, "__USER_Events_Bridge_")
72+
$oBridge = _NetWebView2_GetBridge($oWebV2M, "__MyEVENTS_Bridge_")
7573
#forceref $oBridge
7674

7775
Local $sHTML = "<html><head><meta charset='UTF-8'><style>:" & __FormCSS() & "</style></head><body>" & __FormHTML() & "</body></html>"
78-
_NetWebView2_NavigateToString($oWebV2M, $sHTML, $NETWEBVIEW2_MESSAGE__TITLE_CHANGED, 5000)
76+
$oWebV2M.NavigateToString($sHTML)
7977
GUISetState(@SW_SHOW, $hGUI)
8078
EndFunc ;==>_Create_Form
8179

8280
; Handles data received from the JavaScript 'postMessage'
83-
Func __USER_Events_Bridge_OnMessageReceived($oWebV2M, $hGUI, $sMessage) ; fork from __NetWebView2_JSEvents__OnMessageReceived()
81+
Func __MyEVENTS_Bridge_OnMessageReceived($oWebV2M, $hGUI, $sMessage) ; fork from __NetWebView2_JSEvents__OnMessageReceived()
8482
#forceref $hGUI
8583
__Example_Log(@ScriptLineNumber, "$sMessage=" & $sMessage)
8684

@@ -117,7 +115,7 @@ Func __USER_Events_Bridge_OnMessageReceived($oWebV2M, $hGUI, $sMessage) ; fork f
117115
EndIf
118116
EndIf
119117
EndIf
120-
EndFunc ;==>__USER_Events_Bridge_OnMessageReceived
118+
EndFunc ;==>__MyEVENTS_Bridge_OnMessageReceived
121119

122120
; Generates the CSS block with dynamic variables
123121
Func __FormCSS()

examples/003-Multi-Basic.au3

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,11 +127,11 @@ Func __UserEventHandler_Web2__Bridge__OnMessageReceived($oWebView, $hWindow, $sM
127127
$iMsgCnt += 1
128128
_UpdateWebUI($oWebView, "mainTitle", "Counter: " & $iMsgCnt)
129129
_UpdateWebUI($oWebView, "statusMsg", "Last Message: " & $sMsg)
130-
If $sMsg = "PING" Then
131-
GUISetState(@SW_HIDE, $hWindow)
132-
Sleep(200)
133-
GUISetState(@SW_SHOW, $hWindow)
134-
EndIf
130+
;~ If $sMsg = "PING" Then
131+
;~ GUISetState(@SW_HIDE, $hWindow)
132+
;~ Sleep(200)
133+
;~ GUISetState(@SW_SHOW, $hWindow)
134+
;~ EndIf
135135
EndIf
136136
EndFunc ;==>__UserEventHandler_Web2__Bridge__OnMessageReceived
137137
#EndRegion ; USER DEFINED EVENTS HANDLER FUNCTION

examples/005-SaveDemo.au3

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ Func _Example()
3535
#EndRegion ; GUI CREATION
3636

3737
; navigate to the page
38-
_NetWebView2_Navigate($oWebV2M, "https://www.microsoft.com/", $NETWEBVIEW2_MESSAGE__NAVIGATION_COMPLETED)
38+
_NetWebView2_Navigate($oWebV2M, "https://www.microsoft.com/")
39+
_NetWebView2_WaitForReadyState($oWebV2M)
3940

4041
#Region ; PDF
4142
; get Browser content as PDF Base64 encoded binary data
@@ -60,7 +61,7 @@ Func _Example()
6061
#EndRegion ; HTML
6162

6263
#Region ; MHTML
63-
; This trick is because Responsive Design (CSS) stored inside MHTML, and loading="lazy" ; 👈
64+
; This trick is because Responsive Design (CSS) stored inside MHTML, and loading="lazy"
6465
$oWebV2M.ZoomFactor = 0.5
6566
Sleep(500)
6667
Local $s_MHTML_content = _NetWebView2_ExportPageData($oWebV2M, 1, "")
@@ -87,3 +88,50 @@ Func _Example()
8788
#EndRegion ; GUI Loop
8889

8990
EndFunc ;==>_Example
91+
92+
; #FUNCTION# ====================================================================================================================
93+
; Name...........: _NetWebView2_WaitForReadyState
94+
; Description ...: Polls the browser until the document.readyState reaches 'complete'.
95+
; Syntax.........: _NetWebView2_WaitForReadyState($oWebV2M, $iTimeout_ms = 5000)
96+
; Parameters ....: $oWebV2M - The WebView2 Manager object.
97+
; $iTimeout_ms - Maximum time to wait in milliseconds. 0 for infinite.
98+
; Return values .: Success: True
99+
; Failure: False, sets @error:
100+
; 1 - Timeout reached before document was complete.
101+
; 2 - WebView2 object is not valid or ready.
102+
; Author ........: ioa747
103+
; Modified.......:
104+
; Remarks .......: This function uses JavaScript execution to check the internal state of the page.
105+
; Useful for tasks like PDF printing where 'complete' state is mandatory.
106+
; ===============================================================================================================================
107+
Func _NetWebView2_WaitForReadyState($oWebV2M, $iTimeout_ms = 5000)
108+
Local Const $s_Prefix = ">>>[_NetWebView2_WaitForReadyState]:"
109+
110+
If Not IsObj($oWebV2M) Then Return SetError(2, 0, False)
111+
Local $hTimer = TimerInit()
112+
Local $sReadyState = ""
113+
114+
While 1
115+
; Execute JS via the Bridge (Mode 2)
116+
$sReadyState = _NetWebView2_ExecuteScript($oWebV2M, "document.readyState", $NETWEBVIEW2_EXECUTEJS_MODE2_RESULT)
117+
118+
; Check for the 'complete' state
119+
If $sReadyState == "complete" Then
120+
__NetWebView2_Log(@ScriptLineNumber, $s_Prefix & " SUCCESS: Document is ready. Timeout_ms: " & Round(TimerDiff($hTimer), 0), 0)
121+
Return True
122+
EndIf
123+
124+
; Check for C# Bridge internal errors (Timeout/Init)
125+
If StringLeft($sReadyState, 6) == "ERROR:" Then
126+
__NetWebView2_Log(@ScriptLineNumber, $s_Prefix & " BRIDGE " & $sReadyState & " Timeout_ms: " & Round(TimerDiff($hTimer), 0), 1)
127+
Return SetError(3, 0, False)
128+
EndIf
129+
130+
; Check for AutoIt-side Timeout
131+
If $iTimeout_ms > 0 And TimerDiff($hTimer) > $iTimeout_ms Then
132+
__NetWebView2_Log(@ScriptLineNumber, $s_Prefix & " TIMEOUT: Document state is " & $sReadyState & " Timeout_ms: " & Round(TimerDiff($hTimer), 0), 1)
133+
Return SetError(1, 0, False)
134+
EndIf
135+
Sleep(100)
136+
WEnd
137+
EndFunc ;==>_NetWebView2_WaitForReadyState

examples/006-DownloadDemo.au3

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
#include "..\NetWebView2Lib.au3"
66

7-
; 6-DownloadDemo.au3
7+
; 006-DownloadDemo.au3
88

99
Global $_sURLDownload_InProgress = ''
1010
_Example()
Lines changed: 61 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -1,103 +1,92 @@
11
#include <GUIConstantsEx.au3>
22
#include <WindowsConstants.au3>
3-
4-
; Register exit function to ensure clean WebView2 shutdown
5-
OnAutoItExitRegister("_ExitApp")
3+
#include "..\NetWebView2Lib.au3"
64

75
; Global objects
8-
Global $oWeb, $oJS
96
Global $oMyError = ObjEvent("AutoIt.Error", "_ErrFunc") ; COM Error Handler
10-
Global $g_DebugInfo = True
11-
Global $sProfileDirectory = @ScriptDir & "\UserDataFolder"
12-
Global $hGUI
137

148
_Example_HTTP_Tracking()
159

1610
Func _Example_HTTP_Tracking()
17-
$hGUI = GUICreate("WebView2 HTTP Status Tracker", 1000, 600)
11+
Local $hGUI = GUICreate("WebView2 HTTP Status Tracker", 1000, 600)
12+
13+
; Initialize WebView2 Manager and register events
14+
Local $oWebV2M = _NetWebView2_CreateManager("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36 Edg/144.0.0.0", "WebEvents_")
15+
If @error Then Return SetError(@error, @extended, $oWebV2M)
1816

19-
$oWeb = ObjCreate("NetWebView2.Manager")
20-
If Not IsObj($oWeb) Then Return MsgBox(16, "Error", "WebView2 Library not registered!")
21-
ObjEvent($oWeb, "WebEvents_", "IWebViewEvents")
17+
; create JavaScript Bridge object
18+
Local $oJSBridge = _NetWebView2_GetBridge($oWebV2M, "JavaScript_")
19+
If @error Then Return SetError(@error, @extended, $oWebV2M)
2220

23-
; Initialize JavaScript Bridge
24-
$oJS = $oWeb.GetBridge()
25-
ObjEvent($oJS, "JavaScript_", "IBridgeEvents")
21+
; initialize browser - put it on the GUI
22+
Local $sProfileDirectory = @ScriptDir & "\NetWebView2Lib-UserDataFolder"
23+
_NetWebView2_Initialize($oWebV2M, $hGUI, $sProfileDirectory, 0, 0, 0, 0, True, True, True, 1.2, "0x2B2B2B")
2624

27-
; 2. Ρύθμιση του HTTP Tracking
28-
$oWeb.HttpStatusCodeEventsEnabled = True
25+
; Ρύθμιση του HTTP Tracking
26+
$oWebV2M.HttpStatusCodeEventsEnabled = True
2927

3028
; Φιλτράρισμα μόνο για το Main Document
3129
; Πολύ σημαντικό για να μην κολλάει το GUI από εκατοντάδες αιτήματα (εικόνες, scripts κλπ)
32-
$oWeb.HttpStatusCodeDocumentOnly = True
30+
$oWebV2M.HttpStatusCodeDocumentOnly = True
3331

34-
$oWeb.Initialize(($hGUI), $sProfileDirectory, 0, 0, 1000, 600)
35-
36-
Do
37-
Sleep(10)
38-
Until $oWeb.IsReady
3932

4033
; Δοκιμή με μια σελίδα που δεν υπάρχει για να δούμε το 404
41-
$oWeb.Navigate("https://google.com/this-page-does-not-exist")
42-
;~ $oWeb.Navigate("https://google.com")
34+
;~ $oWebV2M.Navigate("https://google.com/this-page-does-not-exist")
35+
_NetWebView2_Navigate($oWebV2M, "https://google.com/this-page-does-not-exist")
36+
;~ $oWebV2M.Navigate("https://google.com")
4337

4438
GUISetState(@SW_SHOW)
4539

4640
While 1
4741
Switch GUIGetMsg()
4842
Case $GUI_EVENT_CLOSE
49-
$oWeb.Cleanup()
50-
Exit
43+
ExitLoop
5144
EndSwitch
5245
WEnd
46+
47+
_NetWebView2_CleanUp($oWebV2M, $oJSBridge)
48+
5349
EndFunc ;==>_Example_HTTP_Tracking
5450

5551
#Region ; === EVENT HANDLERS ===
56-
5752
; Handles native WebView2 events
58-
Func WebEvents_OnMessageReceived($sMsg)
59-
__DW("+++ [WebEvents]: " & (StringLen($sMsg) > 150 ? StringLeft($sMsg, 150) & "..." : $sMsg) & @CRLF, 0)
53+
Func WebEvents_OnMessageReceived($oWebV2M, $hGUI, $sMsg)
54+
ConsoleWrite(">>> [WebEvents]: " & (StringLen($sMsg) > 150 ? StringLeft($sMsg, 150) & "..." : $sMsg) & @CRLF)
6055
Local $iSplitPos = StringInStr($sMsg, "|")
6156
Local $sCommand = $iSplitPos ? StringStripWS(StringLeft($sMsg, $iSplitPos - 1), 3) : $sMsg
6257
Local $sData = $iSplitPos ? StringTrimLeft($sMsg, $iSplitPos) : ""
6358
Local $aParts
6459

6560
Switch $sCommand
6661
Case "INIT_READY"
67-
$oWeb.ExecuteScript('window.chrome.webview.postMessage(JSON.stringify({ "type": "COM_TEST", "status": "OK" }));')
68-
69-
Case "WINDOW_RESIZED"
70-
$aParts = StringSplit($sData, "|")
71-
If $aParts[0] >= 2 Then
72-
Local $iW = Int($aParts[1]), $iH = Int($aParts[2])
73-
; Filter minor resize glitches
74-
If $iW > 50 And $iH > 50 Then __DW("WINDOW_RESIZED : " & $iW & "x" & $iH & @CRLF)
75-
EndIf
62+
_NetWebView2_ExecuteScript($oWebV2M, _
63+
'window.chrome.webview.postMessage(JSON.stringify({ "type": "COM_TEST", "status": "OK" }));', _
64+
$NETWEBVIEW2_EXECUTEJS_MODE0_FIREANDFORGET)
65+
7666
EndSwitch
7767
EndFunc ;==>WebEvents_OnMessageReceived
7868

7969
; Handles custom messages from JavaScript (window.chrome.webview.postMessage)
80-
Func JavaScript_OnMessageReceived($sMsg)
81-
__DW(">>> [JavaScript]: " & (StringLen($sMsg) > 150 ? StringLeft($sMsg, 150) & "..." : $sMsg) & @CRLF, 0)
70+
Func JavaScript_OnMessageReceived($oWebV2M, $hGUI, $sMsg)
71+
#forceref $oWebV2M
72+
ConsoleWrite(">>> [JavaScript]: " & (StringLen($sMsg) > 150 ? StringLeft($sMsg, 150) & "..." : $sMsg) & @CRLF)
8273
Local $sFirstChar = StringLeft($sMsg, 1)
8374

8475
; 1. JSON Messaging
8576
If $sFirstChar = "{" Or $sFirstChar = "[" Then
86-
__DW("+> : Processing JSON Messaging..." & @CRLF)
87-
Local $oJson = ObjCreate("NetJson.Parser")
88-
If Not IsObj($oJson) Then Return ConsoleWrite("!> Error: Failed to create NetJson object." & @CRLF)
77+
ConsoleWrite("+>>> : Processing JSON Messaging..." & @CRLF)
78+
Local $oJson = _NetJson_CreateParser($sMsg)
79+
If @error Then Return ConsoleWrite("!> Error: Failed to create NetJson object." & @CRLF)
8980

90-
$oJson.Parse($sMsg)
9181
Local $sJobType = $oJson.GetTokenValue("type")
92-
9382
Switch $sJobType
9483
Case "COM_TEST"
95-
__DW("- COM_TEST Confirmed: " & $oJson.GetTokenValue("status") & @CRLF)
84+
ConsoleWrite("-- COM_TEST Confirmed: " & $oJson.GetTokenValue("status") & @CRLF)
9685
EndSwitch
9786

9887
Else
9988
; 2. Legacy / Native Pipe-Delimited Messaging
100-
__DW("+> : Legacy / Native Pipe-Delimited Messaging..." & @CRLF, 0)
89+
ConsoleWrite("+>>> : Legacy / Native Pipe-Delimited Messaging..." & @CRLF)
10190
Local $sCommand, $sData, $iSplitPos
10291
$iSplitPos = StringInStr($sMsg, "|") - 1
10392

@@ -111,70 +100,39 @@ Func JavaScript_OnMessageReceived($sMsg)
111100

112101
Switch $sCommand
113102
Case "COM_TEST"
114-
__DW("- Status: Legacy COM_TEST: " & $sData & @CRLF)
103+
ConsoleWrite("- Status: Legacy COM_TEST: " & $sData & @CRLF)
115104

116105
Case "ERROR"
117-
__DW("! Status: " & $sData & @CRLF)
106+
ConsoleWrite("! Status: " & $sData & @CRLF)
118107
EndSwitch
119108
EndIf
120109
EndFunc ;==>JavaScript_OnMessageReceived
121110

122111
; OnWebResourceResponseReceived
123-
Func WebEvents_OnWebResourceResponseReceived($iStatusCode, $sReasonPhrase, $sRequestUrl)
124-
Local $sLog = StringFormat("! [HTTP %d] | %s | URL: %s", $iStatusCode, $sReasonPhrase, $sRequestUrl)
125-
ConsoleWrite($sLog & @CRLF)
126-
127-
; Management example:
128-
If $iStatusCode >= 400 Then
129-
__DW("Navigation Issue detected on: " & $sRequestUrl)
130-
131-
; If it is the main URL and not an iframe/sub-resource
132-
If $iStatusCode = 404 Then
133-
; We use a small Ad-hoc HTML for the error
134-
Local $sErrorHTML = "<html><body style='background:#222;color:#ff4c4c;text-align:center;padding-top:50px;'>" & _
135-
"<h1>😟 Navigation Error " & $iStatusCode & " 🫢</h1>" & _
136-
"<p>The requested URL was not found.</p>" & _
137-
"<button onclick='history.back()'>Go Back</button></body></html>"
138-
139-
$oWeb.NavigateToString($sErrorHTML)
140-
EndIf
141-
EndIf
112+
Func WebEvents_OnWebResourceResponseReceived($oWebV2M, $hGUI, $iStatusCode, $sReasonPhrase, $sRequestUrl)
113+
Local $sLog = StringFormat("! [HTTP %d] | %s | URL: %s", $iStatusCode, $sReasonPhrase, $sRequestUrl)
114+
ConsoleWrite($sLog & @CRLF)
115+
116+
Local $oGuard = ObjEvent("AutoIt.Error", "_NetWebView2_SilentErrorHandler")
117+
#forceref $oGuard
118+
119+
; Management example:
120+
If $iStatusCode >= 400 Then
121+
ConsoleWrite("Navigation Issue detected on: " & @CRLF & $sRequestUrl)
122+
123+
; If it is the main URL and not an iframe/sub-resource
124+
If $iStatusCode = 404 Then
125+
; We use a small Ad-hoc HTML for the error
126+
Local $sErrorHTML = "<html><body style='background:#222;color:#ff4c4c;text-align:center;padding-top:50px;'>" & _
127+
"<h1>😟 Navigation Error " & $iStatusCode & " 🫢</h1>" & _
128+
"<p>The requested URL was not found.</p>" & _
129+
"<button onclick='history.back()'>Go Back</button></body></html>"
130+
131+
; direct - call without LoadWait (ms matters)
132+
$oWebV2M.NavigateToString($sErrorHTML)
133+
EndIf
134+
EndIf
142135
EndFunc ;==>WebEvents_OnWebResourceResponseReceived
143136

144137
#EndRegion ; === EVENT HANDLERS ===
145138

146-
#Region ; === UTILS ===
147-
Func _ErrFunc($oError) ; Global COM Error Handler
148-
ConsoleWrite('@@ Line(' & $oError.scriptline & ') : COM Error Number: (0x' & Hex($oError.number, 8) & ') ' & $oError.windescription & @CRLF)
149-
EndFunc ;==>_ErrFunc
150-
151-
; Debug Write utility
152-
Func __DW($sString, $iErrorNoLineNo = 1, $iLine = @ScriptLineNumber, $iError = @error, $iExtended = @extended)
153-
If Not $g_DebugInfo Then Return SetError($iError, $iExtended, 0)
154-
Local $iReturn
155-
If $iErrorNoLineNo = 1 Then
156-
If $iError Then
157-
$iReturn = ConsoleWrite("@@(" & $iLine & ") :: @error:" & $iError & ", @extended:" & $iExtended & ", " & $sString)
158-
Else
159-
$iReturn = ConsoleWrite("+>(" & $iLine & ") :: " & $sString)
160-
EndIf
161-
Else
162-
$iReturn = ConsoleWrite($sString)
163-
EndIf
164-
Return SetError($iError, $iExtended, $iReturn)
165-
EndFunc ;==>__DW
166-
167-
Func _NetJson_New($sInitialJson = "{}")
168-
Local $oParser = ObjCreate("NetJson.Parser")
169-
If Not IsObj($oParser) Then Return SetError(1, 0, 0)
170-
If $sInitialJson <> "" Then $oParser.Parse($sInitialJson)
171-
Return $oParser
172-
EndFunc ;==>_NetJson_New
173-
174-
Func _ExitApp()
175-
If IsObj($oWeb) Then $oWeb.Cleanup()
176-
$oWeb = 0
177-
$oJS = 0
178-
Exit
179-
EndFunc ;==>_ExitApp
180-
#EndRegion ; === UTILS ===

0 commit comments

Comments
 (0)