2012-08-09 136 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的實例,該實例將由瀏覽器加載而不是接收到的數據。