Skip to main navigation Zum Hauptinhalt springen Skip to page footer
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