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, желательно последней версии.