Ga naar de hoofdnavigatie Ga naar de hoofdinhoud Ga naar de voettekst van de pagina
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.