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;
procedure TfrmRaboBrowser.FormClose(
Sender : TObject;
var Action: TCloseAction);
begin
SaveConfig;
if FResultFilePath <> ''
then
if MessageDlg(FResultFilePath + ' succesvol gedownload.', mtInformation, [mbOk], 0) = 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.