Skip to main navigation Skip to main content Skip to page footer
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.