TCefStreamReaderRef Usage



我正在尝试用本地文件替换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的完整项目。

相关内容

  • 没有找到相关文章

最新更新