我正在尝试将webbrowser请求的数据替换为本地文件,但结果不会显示在浏览器中。那么如何正确使用TCefStreamReaderRef
?
procedure TForm1.Chromium1BeforeResourceLoad(Sender: TObject;
const browser: ICefBrowser; const request: ICefRequest;
var redirectUrl: ustring; var resourceStream: ICefStreamReader;
const response: ICefResponse; loadFlags: Integer; out Result: Boolean);
var
strm: ICefStreamReader;
begin
strm := TCefStreamReaderRef.CreateForFile('c:\sometxtfile.txt');
resourceStream:=strm;
result:=True;
end;
答案 0 :(得分:2)
您正确使用TCefStreamReaderRef
,但您在代码中遇到两个问题。您必须将False返回到Result
参数,并且您正在尝试为所有请求的资源加载文本文件。
第一个问题与OnBeforeResourceLoad
事件参考中所述内容有关(我强调引用):
<强> OnBeforeResourceLoad 强>
在加载资源之前调用IO线程。允许的 正常加载的资源返回false。将资源重定向到 new url填充| redirectUrl |值并返回false。 要 指定资源的数据返回CefStream对象 | resourceStream |,使用| response |对象设置mime类型,HTTP 状态代码和可选的标头值,并返回false。要取消 加载资源返回true。对| request |的任何修改 将被观察到。如果|请求|中的URL被更改并| redirectUrl | 也设置了| request |中的URL将被使用。
第二个问题是网站可以例如期望从某个资源加载和呈现图像,但是您已经强制告诉资源加载器加载文本文件。现在想象渲染器可以使用文本文件资源来渲染图像标记。你只是把它搞糊涂了,所以它什么都没有。
对于概念验证示例,您可以尝试以下代码,例如它从文件中加载StackOverflow站点的精灵(你可以得到一个绿色精灵图像from here
示例):
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, cefvcl, ceflib;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
FChromium: TChromium;
procedure BeforeResourceLoad(Sender: TObject; const browser: ICefBrowser;
const request: ICefRequest; var redirectUrl: ustring; var resourceStream: ICefStreamReader;
const response: ICefResponse; loadFlags: Integer; out Result: Boolean);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
FChromium := TChromium.Create(nil);
FChromium.Parent := Self;
FChromium.Anchors := [akLeft, akTop, akRight, akBottom];
FChromium.SetBounds(8, 8, ClientWidth - 16, ClientHeight - 16);
FChromium.Load('http://stackoverflow.com');
FChromium.OnBeforeResourceLoad := BeforeResourceLoad;
end;
procedure TForm1.BeforeResourceLoad(Sender: TObject; const browser: ICefBrowser;
const request: ICefRequest; var redirectUrl: ustring; var resourceStream: ICefStreamReader;
const response: ICefResponse; loadFlags: Integer; out Result: Boolean);
begin
// return False here, since returning True means cancel loading of the resource
Result := False;
// check if the site is requesting a specific resource and if so, then...
if Request.Url = 'http://cdn.sstatic.net/stackoverflow/img/sprites.png?v=6' then
begin
// load a resource from file and set the HTTP status code and MIME type
ResourceStream := TCefStreamReaderRef.CreateForFile('sprites.png');
response.Status := 200;
response.MimeType := 'image/png';
end;
end;
end.
您可以获得完整的项目from here
。