我正在尝试用本地文件替换Web浏览器请求的数据,但结果没有显示在浏览器中。那么如何正确使用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;
您正确使用了TCefStreamReaderRef
,但代码中存在两个问题。您必须向Result
参数返回False,并且您正在尝试为所有请求的资源加载文本文件。
第一个问题与OnBeforeResourceLoad
事件参考中所述内容有关(我强调了这句话):
OnBeforeResourceLoad
在加载资源之前在IO线程上调用。允许要加载的资源通常返回false。将资源重定向到新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
的完整项目。