unit RaboBrowser;
interface
uses
Winapi.Windows, Winapi.Messages, Winapi.TlHelp32, Winapi.PsAPI, Winapi.ActiveX, System.SysUtils, System.Variants,
System.UITypes, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls,
Vcl.ExtCtrls, Vcl.Menus, Vcl.AxCtrls, uWVTypes, uWVTypeLibrary, uWVLoader, uWVCoreWebView2Args,
uWVCoreWebView2DownloadOperation, uWVBrowserBase, uWVWindowParent, uWVWinControl, uWVBrowser, TL.Components;
type
TfrmRaboBrowser = class(TLForm)
WVWindowParent1: TWVWindowParent;
WVBrowser1: TWVBrowser;
Timer1: TTimer;
procedure FormShow(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure WVBrowser1AfterCreated(Sender: TObject);
procedure WVBrowser1DownloadStarting(
Sender: TObject;
const aWebView: ICoreWebView2;
const aArgs: ICoreWebView2DownloadStartingEventArgs);
procedure WVBrowser1DownloadStateChanged(
Sender: TObject;
const aDownloadOperation: ICoreWebView2DownloadOperation;
aDownloadID: integer);
procedure WVBrowser1BytesReceivedChanged(
Sender: TObject;
const aDownloadOperation: ICoreWebView2DownloadOperation;
aDownloadID: integer);
procedure WVBrowser1WebResourceResponseReceived(
Sender: TObject;
const aWebView: ICoreWebView2;
const aArgs: ICoreWebView2WebResourceResponseReceivedEventArgs);
procedure WVBrowser1InitializationError(
Sender: TObject;
aErrorCode: HRESULT;
const aErrorMessage: wvstring);
procedure FormClose(
Sender: TObject;
var Action: TCloseAction);
protected
FDownloadOperation: TCoreWebView2DownloadOperation;
FDownloadIDGen: integer;
FBlockImages: Boolean;
FGetHeaders: Boolean;
FHeaders: TStringList;
procedure UpdateDownloadInfo(aDownloadID: integer);
function GetNextDownloadID: integer;
procedure WMMove(var aMessage: TWMMove); message WM_MOVE;
procedure WMMoving(var aMessage: TMessage); message WM_MOVING;
public
{ Public declarations }
FResultFilePath: string;
end;
var
frmRaboBrowser: TfrmRaboBrowser;
implementation
{$R *.dfm}
uses
uWVCoreWebView2WebResourceResponseView, uWVCoreWebView2HttpResponseHeaders,
uWVCoreWebView2HttpHeadersCollectionIterator, uWVCoreWebView2Delegates, MessageForm;
procedure TfrmRaboBrowser.FormClose(
Sender: TObject;
var Action: TCloseAction);
begin
SaveConfig;
if FResultFilePath <> '' then
if frmMessage.Execute('Information', FResultFilePath + ' succesvol gedownload.') = mrOk then
Action:= caHide
else
Action:= caNone;
end;
procedure TfrmRaboBrowser.FormCreate(Sender: TObject);
begin
FResultFilePath:= '';
FGetHeaders:= True;
FHeaders:= TStringList.Create;
FBlockImages:= False;
FDownloadIDGen:= 0;
FDownloadOperation:= nil;
WVBrowser1.DefaultURL:= 'https://bankieren.rabobank.nl/online/nl/dashboard/betalen/download-transaction-reports';
end;
procedure TfrmRaboBrowser.FormDestroy(Sender: TObject);
begin
if assigned(FHeaders) then
FreeAndNil(FHeaders);
if assigned(FDownloadOperation) then
FreeAndNil(FDownloadOperation);
end;
procedure TfrmRaboBrowser.FormShow(Sender: TObject);
begin
if GlobalWebView2Loader.InitializationError then
showmessage(GlobalWebView2Loader.ErrorMessage)
else if GlobalWebView2Loader.Initialized then
WVBrowser1.CreateBrowser(WVWindowParent1.Handle)
else
Timer1.Enabled:= True;
end;
procedure TfrmRaboBrowser.WVBrowser1AfterCreated(Sender: TObject);
begin
WVWindowParent1.UpdateSize;
Caption:= 'Rabobank';
// We need to a filter to enable the TWVBrowser.OnWebResourceRequested event
WVBrowser1.AddWebResourceRequestedFilterWithRequestSourceKinds(
'*',
COREWEBVIEW2_WEB_RESOURCE_CONTEXT_IMAGE,
COREWEBVIEW2_WEB_RESOURCE_REQUEST_SOURCE_KINDS_ALL);
WVBrowser1.AddWebResourceRequestedFilterWithRequestSourceKinds(
'*',
COREWEBVIEW2_WEB_RESOURCE_CONTEXT_MEDIA,
COREWEBVIEW2_WEB_RESOURCE_REQUEST_SOURCE_KINDS_ALL);
WVBrowser1.CoreWebView2PrintSettings.HeaderTitle:= 'Tituloooooo';
WVBrowser1.CoreWebView2PrintSettings.ShouldPrintHeaderAndFooter:= True;
end;
procedure TfrmRaboBrowser.WVBrowser1BytesReceivedChanged(
Sender: TObject;
const aDownloadOperation: ICoreWebView2DownloadOperation;
aDownloadID: integer);
begin
UpdateDownloadInfo(aDownloadID);
end;
procedure TfrmRaboBrowser.UpdateDownloadInfo(aDownloadID: integer);
var
TempStatus: string;
TempPct: double;
begin
if assigned(FDownloadOperation) and (FDownloadOperation.DownloadID = aDownloadID) then
begin
TempStatus:= 'Downloading...';
if (FDownloadOperation.TotalBytesToReceive <> 0) then
begin
TempPct:= (FDownloadOperation.BytesReceived / FDownloadOperation.TotalBytesToReceive) * 100;
TempStatus:= TempStatus + ' ' + IntToStr(round(TempPct)) + '%';
end
else
TempStatus:= TempStatus + ' ' + IntToStr(FDownloadOperation.BytesReceived) + ' bytes';
TempStatus:= TempStatus + ' - Estimated end time : ' + TimeToStr(FDownloadOperation.EstimatedEndTime);
end;
end;
function TfrmRaboBrowser.GetNextDownloadID: integer;
begin
inc(FDownloadIDGen);
Result:= FDownloadIDGen;
end;
procedure TfrmRaboBrowser.WVBrowser1DownloadStarting(
Sender: TObject;
const aWebView: ICoreWebView2;
const aArgs: ICoreWebView2DownloadStartingEventArgs);
var
TempArgs: TCoreWebView2DownloadStartingEventArgs;
begin
// This demo only allows 1 file download at the same time.
// Create a list of TCoreWebView2DownloadOperation if you need to handle more file downloads and check the DownloadID field.
TempArgs:= TCoreWebView2DownloadStartingEventArgs.Create(aArgs);
if assigned(TempArgs.DownloadOperation) and not(assigned(FDownloadOperation)) then
begin
FDownloadOperation:= TCoreWebView2DownloadOperation.Create(
TempArgs.DownloadOperation,
GetNextDownloadID);
FDownloadOperation.AddAllBrowserEvents(WVBrowser1);
// We hide the download window
TempArgs.Handled:= True;
end;
FreeAndNil(TempArgs);
end;
procedure TfrmRaboBrowser.WVBrowser1DownloadStateChanged(
Sender: TObject;
const aDownloadOperation: ICoreWebView2DownloadOperation;
aDownloadID: integer);
begin
if assigned(FDownloadOperation) and (FDownloadOperation.DownloadID = aDownloadID) then
begin
case FDownloadOperation.State of
COREWEBVIEW2_DOWNLOAD_STATE_IN_PROGRESS:
UpdateDownloadInfo(aDownloadID);
COREWEBVIEW2_DOWNLOAD_STATE_INTERRUPTED:
begin
FreeAndNil(FDownloadOperation);
end;
COREWEBVIEW2_DOWNLOAD_STATE_COMPLETED:
begin
FResultFilePath:= FDownloadOperation.ResultFilePath;
FreeAndNil(FDownloadOperation);
PostMessage(
self.Handle,
WM_CLOSE,
0,
0);
end;
end;
end;
end;
procedure TfrmRaboBrowser.WVBrowser1InitializationError(
Sender: TObject;
aErrorCode: HRESULT;
const aErrorMessage: wvstring);
begin
showmessage(aErrorMessage);
end;
procedure TfrmRaboBrowser.WVBrowser1WebResourceResponseReceived(
Sender: TObject;
const aWebView: ICoreWebView2;
const aArgs: ICoreWebView2WebResourceResponseReceivedEventArgs);
var
TempArgs: TCoreWebView2WebResourceResponseReceivedEventArgs;
TempResponse: TCoreWebView2WebResourceResponseView;
TempHeaders: TCoreWebView2HttpResponseHeaders;
TempIterator: TCoreWebView2HttpHeadersCollectionIterator;
TempName: wvstring;
TempValue: wvstring;
TempHandler: ICoreWebView2WebResourceResponseViewGetContentCompletedHandler;
begin
if FGetHeaders then
try
FHeaders.Clear;
FGetHeaders:= False;
TempArgs:= TCoreWebView2WebResourceResponseReceivedEventArgs.Create(aArgs);
TempResponse:= TCoreWebView2WebResourceResponseView.Create(TempArgs.Response);
TempHandler:= TCoreWebView2WebResourceResponseViewGetContentCompletedHandler.Create(WVBrowser1);
TempHeaders:= TCoreWebView2HttpResponseHeaders.Create(TempResponse.Headers);
TempIterator:= TCoreWebView2HttpHeadersCollectionIterator.Create(TempHeaders.Iterator);
// GetContent will trigger the TWVBrowserBase.OnWebResourceResponseViewGetContentCompleted
// event with the contents of this resource, which in this case corresponds to the HTML contents.
TempResponse.GetContent(TempHandler);
while TempIterator.HasCurrentHeader do
begin
if TempIterator.GetCurrentHeader(TempName, TempValue) then
FHeaders.Add(TempName + ': ' + TempValue);
TempIterator.MoveNext;
end;
finally
FreeAndNil(TempIterator);
FreeAndNil(TempHeaders);
FreeAndNil(TempResponse);
FreeAndNil(TempArgs);
TempHandler:= nil;
end;
end;
procedure TfrmRaboBrowser.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:= False;
if GlobalWebView2Loader.Initialized then
WVBrowser1.CreateBrowser(WVWindowParent1.Handle)
else
Timer1.Enabled:= True;
end;
procedure TfrmRaboBrowser.WMMove(var aMessage: TWMMove);
begin
inherited;
if (WVBrowser1 <> nil) then
WVBrowser1.NotifyParentWindowPositionChanged;
end;
procedure TfrmRaboBrowser.WMMoving(var aMessage: TMessage);
begin
inherited;
if (WVBrowser1 <> nil) then
WVBrowser1.NotifyParentWindowPositionChanged;
end;
initialization
GlobalWebView2Loader:= TWVLoader.Create(nil);
// GlobalWebView2Loader.UserDataFolder := ExtractFileDir(Application.ExeName) +
// '\CustomCache';
GlobalWebView2Loader.UserDataFolder:= Folder.ProgramData + '\Langstraat\FinAdm\EdgeCache\';
GlobalWebView2Loader.RemoteDebuggingPort:= 9999;
GlobalWebView2Loader.RemoteAllowOrigins:= '*';
// Set GlobalWebView2Loader.BrowserExecPath if you don't want to use the evergreen version of WebView Runtime
// GlobalWebView2Loader.BrowserExecPath := 'c:\WVRuntime';
// Uncomment these lines to enable the debug log in 'CustomCache\EBWebView\chrome_debug.log'
// GlobalWebView2Loader.DebugLog := TWV2DebugLog.dlEnabled;
// GlobalWebView2Loader.DebugLogLevel := TWV2DebugLogLevel.dllInfo;
GlobalWebView2Loader.AreBrowserExtensionsEnabled:= True;
GlobalWebView2Loader.StartWebView2;
end.