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;
所以,归结为:
- 问:我如何 ask/tell CEF 为我提供已下载的各个资源的事件,以便我可以在下载后阅读 index.htm。 (而不是等待整个页面和所有资源完成加载)
- A:使用 "crmBrowserLoadStart" 而不是 "crmBrowserLoadEnd"。为了确保它可以在浏览器启动之前抓取 url handline 下载的文件。
- 问:在整个文档加载完成并且 crmBrowserLoadEnd 完成之前,我如何阻止所有用户输入。 (虽然这不是首选,因为它会降低用户对浏览器的享受):
- A:更新:捕获 "crmBrowserPreKeyEvent" 并添加“if FLoading then Result := True;”将确保用户无法使用键盘进行导航。设置 crmBrowser.Enabled := False,.将确保用户无法使用鼠标进行导航。
从 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;
目前我已经将 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;
所以,归结为:
- 问:我如何 ask/tell CEF 为我提供已下载的各个资源的事件,以便我可以在下载后阅读 index.htm。 (而不是等待整个页面和所有资源完成加载)
- A:使用 "crmBrowserLoadStart" 而不是 "crmBrowserLoadEnd"。为了确保它可以在浏览器启动之前抓取 url handline 下载的文件。
- 问:在整个文档加载完成并且 crmBrowserLoadEnd 完成之前,我如何阻止所有用户输入。 (虽然这不是首选,因为它会降低用户对浏览器的享受):
- A:更新:捕获 "crmBrowserPreKeyEvent" 并添加“if FLoading then Result := True;”将确保用户无法使用键盘进行导航。设置 crmBrowser.Enabled := False,.将确保用户无法使用鼠标进行导航。
从 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;