Skip to content

Commit 8c20556

Browse files
authored
Merge pull request #61 from mlipok/patch-2
Update NetWebView2Lib.au3 - prevent recursion in EVENTS handling + $NETWEBVIEW2_MESSAGE__DOWNLOAD_STARTING
2 parents 8522db4 + ab46bae commit 8c20556

1 file changed

Lines changed: 96 additions & 20 deletions

File tree

NetWebView2Lib.au3

Lines changed: 96 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ Global Enum _ ; $NETWEBVIEW2_MESSAGE__* are set by __NetWebView2_WebViewEvents__
6161
$NETWEBVIEW2_MESSAGE__COOKIES_ERROR, _
6262
$NETWEBVIEW2_MESSAGE__COOKIE_ADD_ERROR, _
6363
$NETWEBVIEW2_MESSAGE__BLOCKED_AD, _
64+
$NETWEBVIEW2_MESSAGE__DOWNLOAD_STARTING, _
65+
$NETWEBVIEW2_MESSAGE__DOWNLOAD_IN_PROGRESS, _
66+
$NETWEBVIEW2_MESSAGE__DOWNLOAD_INTERRUPTED, _
67+
$NETWEBVIEW2_MESSAGE__DOWNLOAD_COMPLETED, _
6468
$NETWEBVIEW2_MESSAGE___FAKE_COUNTER
6569

6670
#Region ; NetWebView2Lib UDF - _NetWebView2_* core functions
@@ -142,7 +146,14 @@ Func _NetWebView2_CreateManager($sUserAgent = '', $s_fnEventPrefix = "", $s_AddB
142146
If @error Then __NetWebView2_Log(@ScriptLineNumber, $s_Prefix & " Manager Creation ERROR", 1)
143147
If $sUserAgent Then $oWebV2M.SetUserAgent($sUserAgent)
144148
If $s_AddBrowserArgs Then $oWebV2M.AdditionalBrowserArguments = $s_AddBrowserArgs
145-
If $s_fnEventPrefix Then $_g_sNetWebView2_User_WebViewEvents = $s_fnEventPrefix
149+
If $s_fnEventPrefix Then
150+
If $_g_sNetWebView2_User_WebViewEvents = '__NetWebView2_WebViewEvents__' Then ; prevent Recursion
151+
__NetWebView2_Log(@ScriptLineNumber, $s_Prefix & ' : Please do not use UDF defined prefix: "__NetWebView2_WebViewEvents__"', 1)
152+
$_g_sNetWebView2_User_WebViewEvents = ''
153+
Else
154+
$_g_sNetWebView2_User_WebViewEvents = $s_fnEventPrefix
155+
EndIf
156+
EndIf
146157
ObjEvent($oWebV2M, "__NetWebView2_WebViewEvents__", "IWebViewEvents")
147158
Return SetError(@error, @extended, $oWebV2M)
148159
EndFunc ;==>_NetWebView2_CreateManager
@@ -169,7 +180,14 @@ Func _NetWebView2_GetBridge(ByRef $oWebV2M, $s_fnEventPrefix = "")
169180
Local $oWebJS = $oWebV2M.GetBridge()
170181
If @error Then __NetWebView2_Log(@ScriptLineNumber, $s_Prefix & " : Manager.GetBridge() ERROR", 1)
171182

172-
If $s_fnEventPrefix Then $_g_sNetWebView2_User_JSEvents = $s_fnEventPrefix
183+
If $s_fnEventPrefix Then
184+
If $_g_sNetWebView2_User_JSEvents = '__NetWebView2_JSEvents__' Then ; prevent Recursion
185+
__NetWebView2_Log(@ScriptLineNumber, $s_Prefix & ' : Please do not use UDF defined prefix: "__NetWebView2_JSEvents__"', 1)
186+
$_g_sNetWebView2_User_JSEvents = ''
187+
Else
188+
$_g_sNetWebView2_User_JSEvents = $s_fnEventPrefix
189+
EndIf
190+
EndIf
173191
ObjEvent($oWebJS, "__NetWebView2_JSEvents__", "IBridgeEvents")
174192

175193
Return SetError(@error, @extended, $oWebJS)
@@ -727,7 +745,7 @@ EndFunc ;==>__Get_Core_Bridge_JS
727745
; Link ..........:
728746
; Example .......: No
729747
; ===============================================================================================================================
730-
Func __NetWebView2_COMErrFunc($oError) ; COM Error Function used by COM Error Handler
748+
Func __NetWebView2_COMErrFunc(ByRef $oError) ; COM Error Function used by COM Error Handler
731749
If @Compiled Then Return
732750
ConsoleWrite("NetWebView2Lib UDF (" & $oError.scriptline & ") : ==> COM Error intercepted !" & @CRLF & _
733751
@TAB & "err.number is: " & @TAB & @TAB & "0x" & Hex($oError.number) & @CRLF & _
@@ -741,9 +759,8 @@ Func __NetWebView2_COMErrFunc($oError) ; COM Error Function used by COM Error Ha
741759
@TAB & "err.retcode is: " & @TAB & "0x" & Hex($oError.retcode) & @CRLF & @CRLF)
742760
EndFunc ;==>__NetWebView2_COMErrFunc
743761

744-
; Handles native WebView2 events
745762
#TODO => Func __NetWebView2_WebViewEvents__OnMessageReceived(ByRef $oWebV2M, $hGUI, $sMsg)
746-
Func __NetWebView2_WebViewEvents__OnMessageReceived($sMsg)
763+
Func __NetWebView2_WebViewEvents__OnMessageReceived($sMsg) ; Handles native WebView2 events
747764
Local Const $s_Prefix = "[WebViewEvents__OnMessageReceived]:"
748765
Local $oMyError = ObjEvent("AutoIt.Error", __NetWebView2_COMErrFunc) ; Local COM Error Handler
749766
#forceref $oMyError
@@ -762,12 +779,18 @@ Func __NetWebView2_WebViewEvents__OnMessageReceived($sMsg)
762779

763780
Switch $sCommand
764781
Case "WINDOW_RESIZED"
765-
$aParts = StringSplit($sData, "|")
766-
If $aParts[0] >= 2 Then
767-
Local $iW = Int($aParts[1]), $iH = Int($aParts[2])
768-
; Filter minor resize glitches
769-
If $iW > 50 And $iH > 50 Then __NetWebView2_Log(@ScriptLineNumber, $s_Prefix & $iW & "x" & $iH, 1)
782+
Local Static $sData_static = Null
783+
If $sData_static <> $sData Then
784+
$sData_static = $sData
785+
$aParts = StringSplit($sData, "|")
786+
787+
If $aParts[0] >= 2 Then
788+
Local $iW = Int($aParts[1]), $iH = Int($aParts[2])
789+
; Filter minor resize glitches
790+
If $iW > 50 And $iH > 50 Then __NetWebView2_Log(@ScriptLineNumber, $s_Prefix & ' WINDOW_RESIZED:' & $iW & "x" & $iH, 1)
791+
EndIf
770792
EndIf
793+
771794
Case "NAV_STARTING"
772795
__NetWebView2_Log(@ScriptLineNumber, $s_Prefix & ' COMMAND:' & $sCommand, 1)
773796
__NetWebView2_LastMessageReceived($NETWEBVIEW2_MESSAGE__NAV_STARTING)
@@ -889,6 +912,10 @@ Func __NetWebView2_WebViewEvents__OnMessageReceived($sMsg)
889912
__NetWebView2_Log(@ScriptLineNumber, $s_Prefix & ' COMMAND:' & $sCommand, 1)
890913
__NetWebView2_LastMessageReceived($NETWEBVIEW2_MESSAGE__BLOCKED_AD)
891914

915+
Case "DOWNLOAD_STARTING"
916+
__NetWebView2_Log(@ScriptLineNumber, $s_Prefix & ' COMMAND:' & $sCommand, 1)
917+
__NetWebView2_LastMessageReceived($NETWEBVIEW2_MESSAGE__DOWNLOAD_STARTING)
918+
892919
;~ Case "*"
893920
;~ __NetWebView2_Log(@ScriptLineNumber, $s_Prefix & ' COMMAND:' & $sCommand, 1)
894921
;~ __NetWebView2_LastMessageReceived($NETWEBVIEW2_MESSAGE__*)
@@ -904,9 +931,8 @@ Func __NetWebView2_WebViewEvents__OnMessageReceived($sMsg)
904931

905932
EndFunc ;==>__NetWebView2_WebViewEvents__OnMessageReceived
906933

907-
; Handles custom messages from JavaScript (window.chrome.webview.postMessage)
908-
#TODO => Func __NetWebView2_JSEvents__OnMessageReceived(ByRef $oWebV2M, ByRef $oWebJS, $hGUI, $sMsg)
909-
Func __NetWebView2_JSEvents__OnMessageReceived($sMsg)
934+
#TODO => Func __NetWebView2_JSEvents__OnMessageReceived(ByRef $oWebV2M, $hGUI, ByRef $oWebJS, $hGUI, $sMsg)
935+
Func __NetWebView2_JSEvents__OnMessageReceived($sMsg) ; Handles custom messages from JavaScript (window.chrome.webview.postMessage)
910936
Local Const $s_Prefix = "[JSEvents__OnMessageReceived]:"
911937
Local $oMyError = ObjEvent("AutoIt.Error", __NetWebView2_COMErrFunc) ; Local COM Error Handler
912938
#forceref $oMyError
@@ -973,51 +999,101 @@ Func __NetWebView2_JSEvents__OnMessageReceived($sMsg)
973999

9741000
EndFunc ;==>__NetWebView2_JSEvents__OnMessageReceived
9751001

1002+
#TODO => Func __NetWebView2_WebViewEvents__OnBrowserGotFocus(ByRef $oWebV2M, $hGUI, $iReason)
9761003
Func __NetWebView2_WebViewEvents__OnBrowserGotFocus($iReason)
9771004
Local Const $s_Prefix = "[WebViewEvents__OnBrowserGotFocus]: REASON: " & $iReason
9781005
__NetWebView2_Log(@ScriptLineNumber, $s_Prefix, 1)
9791006
EndFunc ;==>__NetWebView2_WebViewEvents__OnBrowserGotFocus
9801007

1008+
#TODO => Func __NetWebView2_WebViewEvents__OnBrowserLostFocus(ByRef $oWebV2M, $hGUI, $iReason)
9811009
Func __NetWebView2_WebViewEvents__OnBrowserLostFocus($iReason)
9821010
Local Const $s_Prefix = "[WebViewEvents__OnBrowserLostFocus]: REASON: " & $iReason
9831011
__NetWebView2_Log(@ScriptLineNumber, $s_Prefix, 1)
9841012
EndFunc ;==>__NetWebView2_WebViewEvents__OnBrowserLostFocus
9851013

1014+
#TODO => Func __NetWebView2_WebViewEvents__OnZoomChanged(ByRef $oWebV2M, $hGUI, $iFactor)
9861015
Func __NetWebView2_WebViewEvents__OnZoomChanged($iFactor)
9871016
Local Const $s_Prefix = "[WebViewEvents__OnZoomChanged]: FACTOR: " & $iFactor
9881017
__NetWebView2_Log(@ScriptLineNumber, $s_Prefix, 1)
9891018
EndFunc ;==>__NetWebView2_WebViewEvents__OnZoomChanged
9901019

991-
Func __NetWebView2_WebViewEvents__OnURLChanged($sNewUrl)
992-
Local Const $s_Prefix = "[WebViewEvents__OnURLChanged]: URL: " & $sNewUrl
1020+
#TODO => Func __NetWebView2_WebViewEvents__OnURLChanged(ByRef $oWebV2M, $hGUI, $sURL)
1021+
Func __NetWebView2_WebViewEvents__OnURLChanged($sURL)
1022+
Local Const $s_Prefix = "[WebViewEvents__OnURLChanged]: URL: " & $sURL
9931023
__NetWebView2_Log(@ScriptLineNumber, $s_Prefix, 1)
9941024
EndFunc ;==>__NetWebView2_WebViewEvents__OnURLChanged
9951025

996-
Func __NetWebView2_WebViewEvents__OnTitleChanged($sNewTitle)
997-
Local Const $s_Prefix = "[WebViewEvents__OnTitleChanged]: TITLE: " & $sNewTitle
1026+
#TODO => Func __NetWebView2_WebViewEvents__OnTitleChanged(ByRef $oWebV2M, $hGUI, $sTITLE)
1027+
Func __NetWebView2_WebViewEvents__OnTitleChanged($sTITLE)
1028+
Local Const $s_Prefix = "[WebViewEvents__OnTitleChanged]: TITLE: " & $sTITLE
9981029
__NetWebView2_Log(@ScriptLineNumber, $s_Prefix, 1)
9991030
EndFunc ;==>__NetWebView2_WebViewEvents__OnTitleChanged
10001031

1001-
Func __NetWebView2_WebViewEvents__OnNavigationStarting($sNewUrl)
1002-
Local Const $s_Prefix = "[WebViewEvents__OnNavigationStarting]: URL: " & $sNewUrl
1032+
#TODO => Func __NetWebView2_WebViewEvents__OnNavigationStarting(ByRef $oWebV2M, $hGUI, $sURL)
1033+
Func __NetWebView2_WebViewEvents__OnNavigationStarting($sURL)
1034+
Local Const $s_Prefix = "[WebViewEvents__OnNavigationStarting]: URL: " & $sURL
10031035
__NetWebView2_Log(@ScriptLineNumber, $s_Prefix, 1)
10041036
EndFunc ;==>__NetWebView2_WebViewEvents__OnNavigationStarting
10051037

1038+
#TODO => Func __NetWebView2_WebViewEvents__OnNavigationCompleted(ByRef $oWebV2M, $hGUI, $bIsSuccess, $iWebErrorStatus)
10061039
Func __NetWebView2_WebViewEvents__OnNavigationCompleted($bIsSuccess, $iWebErrorStatus)
10071040
Local Const $s_Prefix = "[WebViewEvents__OnNavigationCompleted]: IsSuccess: " & $bIsSuccess & " WebErrorStatus: " & $iWebErrorStatus
10081041
__NetWebView2_Log(@ScriptLineNumber, $s_Prefix, 1)
10091042
EndFunc ;==>__NetWebView2_WebViewEvents__OnNavigationCompleted
10101043

1011-
#TODO => Func __NetWebView2_WebViewEvents__OnContextMenuRequested(ByRef $oWebV2M, $sLink, $iX, $iY, $sSelection)
1044+
#TODO => Func __NetWebView2_WebViewEvents__OnContextMenuRequested(ByRef $oWebV2M, $hGUI, $sLink, $iX, $iY, $sSelection)
10121045
Func __NetWebView2_WebViewEvents__OnContextMenuRequested($sLink, $iX, $iY, $sSelection)
10131046
Local Const $s_Prefix = "[WebViewEvents__OnContextMenuRequested]: LINK: " & $sLink & " X: " & $iX & " Y: " & $iY & " SELECTION: " & $sSelection
10141047
__NetWebView2_Log(@ScriptLineNumber, $s_Prefix, 1)
10151048
EndFunc ;==>__NetWebView2_WebViewEvents__OnContextMenuRequested
10161049

1050+
#TODO => Func __NetWebView2_WebViewEvents__OnContextMenu(ByRef $oWebV2M, $hGUI, $sMenuData)
10171051
Func __NetWebView2_WebViewEvents__OnContextMenu($sMenuData)
10181052
Local Const $s_Prefix = "[WebViewEvents__OnContextMenu]: MENUDATA: " & $sMenuData
10191053
__NetWebView2_Log(@ScriptLineNumber, $s_Prefix, 1)
10201054
EndFunc ;==>__NetWebView2_WebViewEvents__OnContextMenu
1055+
1056+
#TODO => Func __NetWebView2_WebViewEvents__OnDownloadStarting(ByRef $oWebV2M, $hGUI, $sUri, $sDefaultPath)
1057+
Func __NetWebView2_WebViewEvents__OnDownloadStarting($sUri, $sDefaultPath) ; Listen for Manager OnDownloadStarting Events
1058+
ConsoleWrite("-> [OnDownloadStarting]:: $sUri: " & $sUri & ", $sDefaultPath: " & $sDefaultPath & @CRLF)
1059+
1060+
; --- STANDARD MODE (EDGE) ---
1061+
; If you do nothing, Edge will download to the $sDefaultPath.
1062+
; If you previously set $oWeb.SetDownloadPath("C:\MyFolder"), it will go there.
1063+
1064+
; --- MANUAL MODE (BYPASS EDGE) ---
1065+
; If you want to handle the download yourself with InetGet:
1066+
; $oWeb.IsDownloadHandled = True
1067+
; InetGet($sUri, @ScriptDir & "\Manual_Download.zip", 1, 1) ; 1 = wait for completion, 1 = force reload
1068+
; ConsoleWrite("--> Edge download CANCELLED. AutoIt is handling it via InetGet." & @CRLF)
1069+
1070+
ConsoleWrite("<- OnDownloadStarting event finished. Standard Edge download proceeds unless IsDownloadHandled=True." & @CRLF)
1071+
EndFunc ;==>__NetWebView2_WebViewEvents__OnDownloadStarting
1072+
1073+
#TODO => Func __NetWebView2_WebViewEvents__OnDownloadStateChanged(ByRef $oWebV2M, $hGUI, $sState, $sUri, $iTotalBytes, $iReceivedBytes)
1074+
Func __NetWebView2_WebViewEvents__OnDownloadStateChanged($sState, $sUri, $iTotal_Bytes, $iReceived_Bytes) ; Listen for Manager OnDownloadStateChanged Events
1075+
Local Const $s_Prefix = "[WebViewEvents__OnDownloadStateChanged]: State: " & $sState & " Uri: " & $sUri & " Total_Bytes: " & $iTotal_Bytes & " Received_Bytes: " & $iReceived_Bytes
1076+
Local $iPercent = 0
1077+
If $iTotal_Bytes > 0 Then $iPercent = Round(($iReceived_Bytes / $iTotal_Bytes) * 100)
1078+
1079+
; Convert to MB for easy-to-read log
1080+
Local $iReceived_MegaBytes = Round($iReceived_Bytes / 1024 / 1024)
1081+
Local $iTotal_MegaBytes = Round($iTotal_Bytes / 1024 / 1024)
1082+
1083+
Local Const $s_Message = " " & $iPercent & "% (" & $iReceived_MegaBytes & " / " & $iTotal_MegaBytes & " Mega Bytes)"
1084+
Switch $sState
1085+
Case "InProgress"
1086+
__NetWebView2_Log(@ScriptLineNumber, $s_Prefix & $s_Message, 1)
1087+
__NetWebView2_LastMessageReceived($NETWEBVIEW2_MESSAGE__DOWNLOAD_IN_PROGRESS)
1088+
Case "Interrupted"
1089+
__NetWebView2_Log(@ScriptLineNumber, $s_Prefix & $s_Message, 1)
1090+
__NetWebView2_LastMessageReceived($NETWEBVIEW2_MESSAGE__DOWNLOAD_INTERRUPTED)
1091+
Case "Completed"
1092+
ConsoleWrite("--> DOWNLOAD_COMPLETED: Finished: " & $sUri & @CRLF)
1093+
__NetWebView2_Log(@ScriptLineNumber, $s_Prefix & $s_Message, 1)
1094+
__NetWebView2_LastMessageReceived($NETWEBVIEW2_MESSAGE__DOWNLOAD_COMPLETED)
1095+
EndSwitch
1096+
EndFunc ;==>__NetWebView2_WebViewEvents__OnDownloadStateChanged
10211097
#EndRegion ; NetWebView2Lib UDF - === EVENT HANDLERS ===
10221098

10231099

0 commit comments

Comments
 (0)