2012-08-09 133 views
1

我试图创建一些浏览器原型(使用CEF VCL for Deplhi - chromiumembedded),它在将其转换为DOM之前过滤加载的内容。Deplhi:通过铬嵌入(CEF VCL)过滤加载的HTML

我决定处理onResourceResponse事件(对吧?) - 它有参数过滤器。我不需要添加一些东西到现有的数据或剪切,只需要替换刚刚传输的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; 

Here`s 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; 
+0

您可以返回您实现'ProcessData'方法的'TCefContentFilterOwn'的后代。在那里你可以将SubstituteData设置为一个'TCefStreamReaderRef'的实例,它将被加载而不是接收到的数据。 但是,从我的快速实验中,并未针对主(HTML)响应调用“OnResourceResponse”事件,仅针对从其引用的其他资源(JavaScript,图像等)。因此,要过滤HTML内容本身,您可能需要另一个事件或找出如何配置铬以调用此事件以进行主响应。 – 2012-08-09 12:52:10

+0

更正时,调用了“OnResourceResponse”事件处理程序,但出于某种原因,未调用过滤器的“ProcessData”回调。也许我错过了一些东西,为自己尝试... – 2012-08-09 13:04:05

+0

TOndrej,感谢'TCefContentFilterOwn' - 我需要这个。它现在有效。 此外,ProcessData回调被称为propertly。也许,旧版本? – user1587379 2012-08-09 15:27:58

回答

2

您可以返回您在其中实现ProcessData方法TCefContentFilterOwn后裔。在那里,您可以将SubstituteData设置为TCefStreamReaderRef的实例,该实例将由浏览器加载而不是接收到的数据。