TChromium 个人资源下载完成事件?

TChromium individual resource download completion event?

目前我已经将 TWebBrowser 嵌入到在线游戏 "logs" activity 的应用程序中,以便可以向用户显示有关该游戏的统计信息。目前这工作正常,但 TWebBrowser 似乎比 TChromium 慢很多。因此,我已经开始转换我的项目以使用 Delphi TChromium 嵌入式框架 (CEF)-3 来自:https://bitbucket.org/chromiumembedded/

从这里我得到了guiclient,可以在下载的demos目录中找到。

到目前为止一切顺利 - 但是,用户似乎能够在收到对 "crmBrowserLoadEnd" 的调用之前按下按钮离开当前页面。这导致我的程序丢失了数据。

作为替代方案,我认为可以检查哪些资源完成了各自的下载。我可以挂钩事件 "crmBrowserBeforeResourceLoad" 以查看正在加载哪些资源 "start"。但是似乎没有任何事件可以告诉我资源已完成加载。

procedure TFrmDBrowser.crmBrowserBeforeResourceLoad(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; out Result: Boolean);
var
  u: TUrlParts;
  Item: TListItem;
begin
  item := LvDataView.Items.Add();
  item.Caption := request.Url;
end;

所以,归结为:

从 Facebook Delphi 小组得到了答案,作者:Shariful Alam Khan。 "use OnLoadStart event"

事实证明,这正是上述示例的最佳方式。

来源示例:

procedure DataExtractionCallback(const Html: uString);
begin
  try
    FrmDBrowser.RunDataExtraction(Html);
  except
    //
  end;
end;

procedure TFrmDBrowser.crmBrowserLoadStart(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame);
var
  CefStringVisitor: ICefStringVisitor;
  URL: String;
begin
  if not IsMain(browser, frame) then
    Exit;

  FLoading := True;

  CefStringVisitor := TCefFastStringVisitor.Create(DataExtractionCallback);
  crmBrowser.Browser.MainFrame.GetSource(CefStringVisitor);
end;