TCefStreamReaderRef用法

时间:2013-08-13 20:41:45

标签: delphi delphi-xe4 tchromium

我正在尝试将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;

1 个答案:

答案 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