Delphi:通过嵌入式铬(CEF VCL)过滤加载的HTML

时间:2012-08-09 11:58:47

标签: delphi interface filter chromium chromium-embedded

我正在尝试创建一些浏览器原型(使用针对Deplhi的CEF VCL - chromiumembedded),在将其转换为DOM之前过滤已加载的内容。

我决定处理onResourceResponse事件(对吗?) - 它有参数 filter 。我不需要在现有数据中添加内容或剪切,只需替换刚转移的HTML代码的一些字符。

我对onResourceResponse的处理:

procedure TForm1.Chromium1ResourceResponse(Sender: TObject;
  const browser: ICefBrowser; const url: ustring;
  const response: ICefResponse; var filter: ICefBase);
begin
if (url = 'http://some.path.to/file.html')
  begin
  // filter := some object using interface ICefBase here maybe?
  end;
end;

这是ICefBase的声明:

ICefBase = interface
  ['{1F9A7B44-DCDC-4477-9180-3ADD44BDEB7B}']
  function Wrap: Pointer;
end;

但我不明白如何使用它。

感谢您的帮助!抱歉我的英语不好:)我希望我能正确解释这个问题。

使用Delphi 7。

UPD:

此代码有效:

type
  TContentFilter = class(TCefContentFilterOwn)
  public
    procedure ProcessData(const Data: Pointer; Size: Integer;
        var SubstituteData: ICefStreamReader); override;
  end;
// --------
procedure TContentFilter.ProcessData(const Data: Pointer; Size: Integer;
        var SubstituteData: ICefStreamReader);
var c: PAnsiChar;
    i: integer;
begin
c := Data;

for i := 0 to Size-1 do
  begin
  if (c[i] = '<') or (c[i] = '>') then
        c[i] := ' ';
  end;

end;
// --------
procedure TForm1.Chromium1ResourceResponse(Sender: TObject;
  const browser: ICefBrowser; const url: ustring;
  const response: ICefResponse; var filter: ICefBase);
var f: TContentFilter;
begin
if (response.GetHeader('X-RemoveLTGT') <> '') then
  filter := TContentFilter.Create();
end;

1 个答案:

答案 0 :(得分:2)

您可以返回实施TCefContentFilterOwn方法的ProcessData后代。在那里,您可以将SubstituteData设置为TCefStreamReaderRef的实例,该实例将由浏览器而非接收的数据加载。