pascal
1unit RaboBrowser;
2
3interface
4
5uses
6 Winapi.Windows, Winapi.Messages, Winapi.TlHelp32, Winapi.PsAPI, Winapi.ActiveX, System.SysUtils, System.Variants,
7 System.UITypes, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls,
8 Vcl.ExtCtrls, Vcl.Menus, Vcl.AxCtrls, uWVTypes, uWVTypeLibrary, uWVLoader, uWVCoreWebView2Args,
9 uWVCoreWebView2DownloadOperation, uWVBrowserBase, uWVWindowParent, uWVWinControl, uWVBrowser, TL.Components;
10
11type
12 TfrmRaboBrowser = class(TLForm)
13 WVWindowParent1: TWVWindowParent;
14 WVBrowser1: TWVBrowser;
15 Timer1: TTimer;
16 procedure FormShow(Sender: TObject);
17 procedure FormCreate(Sender: TObject);
18 procedure FormDestroy(Sender: TObject);
19 procedure Timer1Timer(Sender: TObject);
20 procedure WVBrowser1AfterCreated(Sender: TObject);
21 procedure WVBrowser1DownloadStarting(
22 Sender: TObject;
23 const aWebView: ICoreWebView2;
24 const aArgs: ICoreWebView2DownloadStartingEventArgs);
25 procedure WVBrowser1DownloadStateChanged(
26 Sender: TObject;
27 const aDownloadOperation: ICoreWebView2DownloadOperation;
28 aDownloadID: integer);
29 procedure WVBrowser1BytesReceivedChanged(
30 Sender: TObject;
31 const aDownloadOperation: ICoreWebView2DownloadOperation;
32 aDownloadID: integer);
33 procedure WVBrowser1WebResourceResponseReceived(
34 Sender: TObject;
35 const aWebView: ICoreWebView2;
36 const aArgs: ICoreWebView2WebResourceResponseReceivedEventArgs);
37 procedure WVBrowser1InitializationError(
38 Sender: TObject;
39 aErrorCode: HRESULT;
40 const aErrorMessage: wvstring);
41 procedure FormClose(
42 Sender: TObject;
43 var Action: TCloseAction);
44 protected
45 FDownloadOperation: TCoreWebView2DownloadOperation;
46 FDownloadIDGen: integer;
47 FBlockImages: Boolean;
48 FGetHeaders: Boolean;
49 FHeaders: TStringList;
50 procedure UpdateDownloadInfo(aDownloadID: integer);
51 function GetNextDownloadID: integer;
52 procedure WMMove(var aMessage: TWMMove); message WM_MOVE;
53 procedure WMMoving(var aMessage: TMessage); message WM_MOVING;
54 public
55 { Public declarations }
56 FResultFilePath: string;
57 end;
58
59var
60 frmRaboBrowser: TfrmRaboBrowser;
61
62implementation
63
64{$R *.dfm}
65
66uses
67 uWVCoreWebView2WebResourceResponseView, uWVCoreWebView2HttpResponseHeaders,
68 uWVCoreWebView2HttpHeadersCollectionIterator, uWVCoreWebView2Delegates, MessageForm;
69
70procedure TfrmRaboBrowser.FormClose(
71 Sender: TObject;
72 var Action: TCloseAction);
73begin
74 SaveConfig;
75 if FResultFilePath <> '' then
76 if frmMessage.Execute('Information', FResultFilePath + ' succesvol gedownload.') = mrOk then
77 Action:= caHide
78 else
79 Action:= caNone;
80end;
81
82procedure TfrmRaboBrowser.FormCreate(Sender: TObject);
83begin
84 FResultFilePath:= '';
85 FGetHeaders:= True;
86 FHeaders:= TStringList.Create;
87 FBlockImages:= False;
88 FDownloadIDGen:= 0;
89 FDownloadOperation:= nil;
90 WVBrowser1.DefaultURL:= 'https://bankieren.rabobank.nl/online/nl/dashboard/betalen/download-transaction-reports';
91end;
92
93procedure TfrmRaboBrowser.FormDestroy(Sender: TObject);
94begin
95 if assigned(FHeaders) then
96 FreeAndNil(FHeaders);
97 if assigned(FDownloadOperation) then
98 FreeAndNil(FDownloadOperation);
99end;
100
101procedure TfrmRaboBrowser.FormShow(Sender: TObject);
102begin
103 if GlobalWebView2Loader.InitializationError then
104 showmessage(GlobalWebView2Loader.ErrorMessage)
105 else if GlobalWebView2Loader.Initialized then
106 WVBrowser1.CreateBrowser(WVWindowParent1.Handle)
107 else
108 Timer1.Enabled:= True;
109end;
110
111procedure TfrmRaboBrowser.WVBrowser1AfterCreated(Sender: TObject);
112begin
113 WVWindowParent1.UpdateSize;
114 Caption:= 'Rabobank';
115 // We need to a filter to enable the TWVBrowser.OnWebResourceRequested event
116 WVBrowser1.AddWebResourceRequestedFilterWithRequestSourceKinds(
117 '*',
118 COREWEBVIEW2_WEB_RESOURCE_CONTEXT_IMAGE,
119 COREWEBVIEW2_WEB_RESOURCE_REQUEST_SOURCE_KINDS_ALL);
120 WVBrowser1.AddWebResourceRequestedFilterWithRequestSourceKinds(
121 '*',
122 COREWEBVIEW2_WEB_RESOURCE_CONTEXT_MEDIA,
123 COREWEBVIEW2_WEB_RESOURCE_REQUEST_SOURCE_KINDS_ALL);
124 WVBrowser1.CoreWebView2PrintSettings.HeaderTitle:= 'Tituloooooo';
125 WVBrowser1.CoreWebView2PrintSettings.ShouldPrintHeaderAndFooter:= True;
126end;
127
128procedure TfrmRaboBrowser.WVBrowser1BytesReceivedChanged(
129 Sender: TObject;
130 const aDownloadOperation: ICoreWebView2DownloadOperation;
131 aDownloadID: integer);
132begin
133 UpdateDownloadInfo(aDownloadID);
134end;
135
136procedure TfrmRaboBrowser.UpdateDownloadInfo(aDownloadID: integer);
137var
138 TempStatus: string;
139 TempPct: double;
140begin
141 if assigned(FDownloadOperation) and (FDownloadOperation.DownloadID = aDownloadID) then
142 begin
143 TempStatus:= 'Downloading...';
144 if (FDownloadOperation.TotalBytesToReceive <> 0) then
145 begin
146 TempPct:= (FDownloadOperation.BytesReceived / FDownloadOperation.TotalBytesToReceive) * 100;
147 TempStatus:= TempStatus + ' ' + IntToStr(round(TempPct)) + '%';
148 end
149 else
150 TempStatus:= TempStatus + ' ' + IntToStr(FDownloadOperation.BytesReceived) + ' bytes';
151 TempStatus:= TempStatus + ' - Estimated end time : ' + TimeToStr(FDownloadOperation.EstimatedEndTime);
152 end;
153end;
154
155function TfrmRaboBrowser.GetNextDownloadID: integer;
156begin
157 inc(FDownloadIDGen);
158 Result:= FDownloadIDGen;
159end;
160
161procedure TfrmRaboBrowser.WVBrowser1DownloadStarting(
162 Sender: TObject;
163 const aWebView: ICoreWebView2;
164 const aArgs: ICoreWebView2DownloadStartingEventArgs);
165var
166 TempArgs: TCoreWebView2DownloadStartingEventArgs;
167begin
168 // This demo only allows 1 file download at the same time.
169 // Create a list of TCoreWebView2DownloadOperation if you need to handle more file downloads and check the DownloadID field.
170 TempArgs:= TCoreWebView2DownloadStartingEventArgs.Create(aArgs);
171 if assigned(TempArgs.DownloadOperation) and not(assigned(FDownloadOperation)) then
172 begin
173 FDownloadOperation:= TCoreWebView2DownloadOperation.Create(
174 TempArgs.DownloadOperation,
175 GetNextDownloadID);
176 FDownloadOperation.AddAllBrowserEvents(WVBrowser1);
177 // We hide the download window
178 TempArgs.Handled:= True;
179 end;
180 FreeAndNil(TempArgs);
181end;
182
183procedure TfrmRaboBrowser.WVBrowser1DownloadStateChanged(
184 Sender: TObject;
185 const aDownloadOperation: ICoreWebView2DownloadOperation;
186 aDownloadID: integer);
187begin
188 if assigned(FDownloadOperation) and (FDownloadOperation.DownloadID = aDownloadID) then
189 begin
190
191 case FDownloadOperation.State of
192 COREWEBVIEW2_DOWNLOAD_STATE_IN_PROGRESS:
193 UpdateDownloadInfo(aDownloadID);
194 COREWEBVIEW2_DOWNLOAD_STATE_INTERRUPTED:
195 begin
196 FreeAndNil(FDownloadOperation);
197 end;
198 COREWEBVIEW2_DOWNLOAD_STATE_COMPLETED:
199 begin
200 FResultFilePath:= FDownloadOperation.ResultFilePath;
201 FreeAndNil(FDownloadOperation);
202 PostMessage(
203 self.Handle,
204 WM_CLOSE,
205 0,
206 0);
207 end;
208 end;
209 end;
210end;
211
212procedure TfrmRaboBrowser.WVBrowser1InitializationError(
213 Sender: TObject;
214 aErrorCode: HRESULT;
215 const aErrorMessage: wvstring);
216begin
217 showmessage(aErrorMessage);
218end;
219
220procedure TfrmRaboBrowser.WVBrowser1WebResourceResponseReceived(
221 Sender: TObject;
222 const aWebView: ICoreWebView2;
223 const aArgs: ICoreWebView2WebResourceResponseReceivedEventArgs);
224var
225 TempArgs: TCoreWebView2WebResourceResponseReceivedEventArgs;
226 TempResponse: TCoreWebView2WebResourceResponseView;
227 TempHeaders: TCoreWebView2HttpResponseHeaders;
228 TempIterator: TCoreWebView2HttpHeadersCollectionIterator;
229 TempName: wvstring;
230 TempValue: wvstring;
231 TempHandler: ICoreWebView2WebResourceResponseViewGetContentCompletedHandler;
232begin
233 if FGetHeaders then
234 try
235 FHeaders.Clear;
236 FGetHeaders:= False;
237 TempArgs:= TCoreWebView2WebResourceResponseReceivedEventArgs.Create(aArgs);
238 TempResponse:= TCoreWebView2WebResourceResponseView.Create(TempArgs.Response);
239 TempHandler:= TCoreWebView2WebResourceResponseViewGetContentCompletedHandler.Create(WVBrowser1);
240 TempHeaders:= TCoreWebView2HttpResponseHeaders.Create(TempResponse.Headers);
241 TempIterator:= TCoreWebView2HttpHeadersCollectionIterator.Create(TempHeaders.Iterator);
242 // GetContent will trigger the TWVBrowserBase.OnWebResourceResponseViewGetContentCompleted
243 // event with the contents of this resource, which in this case corresponds to the HTML contents.
244 TempResponse.GetContent(TempHandler);
245 while TempIterator.HasCurrentHeader do
246 begin
247 if TempIterator.GetCurrentHeader(TempName, TempValue) then
248 FHeaders.Add(TempName + ': ' + TempValue);
249 TempIterator.MoveNext;
250 end;
251 finally
252 FreeAndNil(TempIterator);
253 FreeAndNil(TempHeaders);
254 FreeAndNil(TempResponse);
255 FreeAndNil(TempArgs);
256 TempHandler:= nil;
257 end;
258end;
259
260procedure TfrmRaboBrowser.Timer1Timer(Sender: TObject);
261begin
262 Timer1.Enabled:= False;
263 if GlobalWebView2Loader.Initialized then
264 WVBrowser1.CreateBrowser(WVWindowParent1.Handle)
265 else
266 Timer1.Enabled:= True;
267end;
268
269procedure TfrmRaboBrowser.WMMove(var aMessage: TWMMove);
270begin
271 inherited;
272 if (WVBrowser1 <> nil) then
273 WVBrowser1.NotifyParentWindowPositionChanged;
274end;
275
276procedure TfrmRaboBrowser.WMMoving(var aMessage: TMessage);
277begin
278 inherited;
279 if (WVBrowser1 <> nil) then
280 WVBrowser1.NotifyParentWindowPositionChanged;
281end;
282
283initialization
284
285GlobalWebView2Loader:= TWVLoader.Create(nil);
286// GlobalWebView2Loader.UserDataFolder := ExtractFileDir(Application.ExeName) +
287// '\CustomCache';
288GlobalWebView2Loader.UserDataFolder:= Folder.ProgramData + '\Langstraat\FinAdm\EdgeCache\';
289GlobalWebView2Loader.RemoteDebuggingPort:= 9999;
290GlobalWebView2Loader.RemoteAllowOrigins:= '*';
291// Set GlobalWebView2Loader.BrowserExecPath if you don't want to use the evergreen version of WebView Runtime
292// GlobalWebView2Loader.BrowserExecPath := 'c:\WVRuntime';
293// Uncomment these lines to enable the debug log in 'CustomCache\EBWebView\chrome_debug.log'
294// GlobalWebView2Loader.DebugLog := TWV2DebugLog.dlEnabled;
295// GlobalWebView2Loader.DebugLogLevel := TWV2DebugLogLevel.dllInfo;
296GlobalWebView2Loader.AreBrowserExtensionsEnabled:= True;
297GlobalWebView2Loader.StartWebView2;
298
299end.
300