Delphi 11 TEdgeBrowser webview2 медленная загрузка

Я работаю над переносом приложения с TWebBrowser на TEdgeBrowser. Я использую последнюю версию WebView2Loader с сайта Nuget и сталкиваюсь с одной и той же постоянной проблемой во всех версиях WebView2Loader в каждой версии, начиная с января 2021 года.

TEdgeBrowser работает хорошо, но первая загрузка любой страницы может занять от 14 до 24 секунд, обычно от 14 до 18 секунд. После загрузки первой страницы все последующие загрузки страниц выполняются так быстро, как вы ожидаете в полнофункциональном браузере.

Я указываю UserDataFolder и BrowserExecutableFolder, а также события OnCreateWebViewCompleted,OnNavigationStarting и OnNavigationCompleted.

Я проверяю любые константы ошибок, определенные в коде интерфейса, но возвращается только одна ошибка «COREWEBVIEW2_WEB_ERROR_STATUS_UNKNOWN», которая возникает каждый раз, когда я успешно перехожу на веб-страницу.

Кто-нибудь знает, что может быть причиной этой задержки? Я могу запустить свой встроенный браузер рядом с Microsoft Edge, и Edge загружается быстро, как и ожидалось, но TEdgeBrowser всегда имеет начальную задержку.

Будем очень благодарны любой помощи.

      unit main;

interface

uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  Winapi.WebView2,
  Winapi.ActiveX,
  Vcl.Edge,
  Vcl.StdCtrls,
  Vcl.ExtCtrls,
  Vcl.OleCtrls,
  Vcl.ComCtrls,
  Vcl.Mask;

type
  TForm2 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Edit1: TEdit;
    moLog: TMemo;
    Splitter1: TSplitter;
    edNavElapsedTime: TLabeledEdit;
    PageControl1: TPageControl;
    tsEB: TTabSheet;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    FStart: TDateTime;
    FStop: TDateTime;
    FEB: TEdgeBrowser;
    procedure CreateWebViewCompleted(Sender: TCustomEdgeBrowser; AResult: HResult);
    procedure NavigationCompleted(Sender: TCustomEdgeBrowser; IsSuccess: Boolean; WebErrorStatus: COREWEBVIEW2_WEB_ERROR_STATUS);
    procedure NavigationStarting(Sender: TCustomEdgeBrowser; Args: TNavigationStartingEventArgs);
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

uses
  System.DateUtils;

procedure LogEntry(ALogEntry: UnicodeString);
begin
  Form2.moLog.Lines.Insert(0,'[' + DateTimeToStr(Now) + ']: ' + ALogEntry);
end;

procedure TForm2.FormCreate(Sender: TObject);
var
  sUserCacheFolder,sExeFolder: UnicodeString;
begin
  sExeFolder := ExtractFileDir(Application.ExeName);
  sUserCacheFolder := sExeFolder + '\edgecache';
  if not ForceDirectories(sUserCacheFolder) then
    raise Exception.Create('Error: Failed to create Edge Browser user cache folder. Check directory file access rights.');

  FEB := TEdgeBrowser.Create(tsEB);
  FEB.Parent := tsEB;
  FEB.Align := alClient;
  if not FEB.WebViewCreated then
    FEB.CreateWebView;
  FEB.OnCreateWebViewCompleted := CreateWebViewCompleted;
  FEB.OnNavigationStarting := NavigationStarting;
  FEB.OnNavigationCompleted := NavigationCompleted;
  FEB.UserDataFolder := sUserCacheFolder;
  FEB.BrowserExecutableFolder := sExeFolder;
end;

procedure TForm2.NavigationCompleted(Sender: TCustomEdgeBrowser;     IsSuccess: Boolean; WebErrorStatus: COREWEBVIEW2_WEB_ERROR_STATUS);
var
  sErr: UnicodeString;
  yr,mon,day,hr,min,sec,msec: Word;
begin
  if IsSuccess then
    LogEntry('Navigation completed successfully');
  sErr := '';
  case WebErrorStatus of
//    COREWEBVIEW2_WEB_ERROR_STATUS_UNKNOWN: sErr := 'UNKNOWN'; // seems to be useless
    COREWEBVIEW2_WEB_ERROR_STATUS_CERTIFICATE_COMMON_NAME_IS_INCORRECT: sErr := 'CERTIFICATE_COMMON_NAME_IS_INCORRECT';
    COREWEBVIEW2_WEB_ERROR_STATUS_CERTIFICATE_EXPIRED: sErr := 'CERTIFICATE_EXPIRED';
    COREWEBVIEW2_WEB_ERROR_STATUS_CLIENT_CERTIFICATE_CONTAINS_ERRORS: sErr := 'CLIENT_CERTIFICATE_CONTAINS_ERRORS';
    COREWEBVIEW2_WEB_ERROR_STATUS_CERTIFICATE_REVOKED: sErr := 'CERTIFICATE_REVOKED';
    COREWEBVIEW2_WEB_ERROR_STATUS_CERTIFICATE_IS_INVALID: sErr := 'CERTIFICATE_IS_INVALID';
    COREWEBVIEW2_WEB_ERROR_STATUS_SERVER_UNREACHABLE: sErr := 'SERVER_UNREACHABLE';
    COREWEBVIEW2_WEB_ERROR_STATUS_TIMEOUT: sErr := 'TIMEOUT';
    COREWEBVIEW2_WEB_ERROR_STATUS_ERROR_HTTP_INVALID_SERVER_RESPONSE:         sErr := 'ERROR_HTTP_INVALID_SERVER_RESPONSE';
    COREWEBVIEW2_WEB_ERROR_STATUS_CONNECTION_ABORTED: sErr := 'CONNECTION_ABORTED';
    COREWEBVIEW2_WEB_ERROR_STATUS_CONNECTION_RESET: sErr := 'CONNECTION_RESET';
    COREWEBVIEW2_WEB_ERROR_STATUS_DISCONNECTED: sErr := 'DISCONNECTED';
    COREWEBVIEW2_WEB_ERROR_STATUS_CANNOT_CONNECT: sErr := 'CANNOT_CONNECT';
    COREWEBVIEW2_WEB_ERROR_STATUS_HOST_NAME_NOT_RESOLVED: sErr := 'HOST_NAME_NOT_RESOLVED';
    COREWEBVIEW2_WEB_ERROR_STATUS_OPERATION_CANCELED: sErr := 'OPERATION_CANCELED';
    COREWEBVIEW2_WEB_ERROR_STATUS_REDIRECT_FAILED: sErr := 'REDIRECT_FAILED';
    COREWEBVIEW2_WEB_ERROR_STATUS_UNEXPECTED_ERROR: sErr := 'UNEXPECTED_ERROR';
  end;
  if Length(sErr) > 0 then
    LogEntry('Navigation completed error: ' + sErr);
  FStop := Now;
  DecodeDateTime(FStop - FStart,yr,mon,day,hr,min,sec,msec);
  edNavElapsedTime.Text := IntToStr(sec);
end;

procedure TForm2.NavigationStarting(Sender: TCustomEdgeBrowser; Args: TNavigationStartingEventArgs);
var
  pwc: PWideChar;
begin
  FStart := Now;
  Args.ArgsInterface.Get_uri(pwc);
  LogEntry('Navigation Starting to ' + pwc);
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  FEB.Navigate(edit1.text);
end;

procedure TForm2.CreateWebViewCompleted(Sender: TCustomEdgeBrowser; AResult: HResult);
begin
  if AResult = 0 then
    LogEntry('Create Web View Completed Successfully')
  else
    LogEntry('Error: Failed to create Web View ' + IntToStr(AResult));
end;

end.

Вы можете найти последнюю версию среды выполнения webview2 здесь:Галерея NuGet | Microsoft.Web.Webview2 1.0.1072.54

Также вам нужно будет убедиться, что установлен Microsoft Edge, желательно последней версии.

0 ответов

Другие вопросы по тегам