1

我正在尝试用本地文件替换 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;
4

1 回答 1

2

您使用TCefStreamReaderRef正确,但代码中有两个问题。您必须向Result参数返回 False,并且您正在尝试为所有请求的资源加载文本文件。

第一个问题与OnBeforeResourceLoad事件参考中所述的内容有关(我强调了引用):

OnBeforeResourceLoad

在加载资源之前在 IO 线程上调用。允许资源正常加载返回 false。要将资源重定向到新的 url,请填充 |redirectUrl| 值并返回 false。要指定资源的数据返回 |resourceStream| 中的 CefStream 对象,请使用 |response| 对象来设置 mime 类型、HTTP 状态代码和可选的标头值,并返回 false。要取消加载资源,请返回 true。对 |request| 的任何修改 将被观察。如果 |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

于 2013-08-14T10:12:44.243 回答