I`m trying to create some prototype of browser (using CEF VCL for Deplhi – chromiumembedded), that filters loaded content before translating it to DOM.
I decided to handle onResourceResponse event (right?) – it has the argument filter. I don`t need to add something to existing data or cut, just replace some chars of just transferred HTML-code.
There`s my handling of 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 a declaration of ICefBase:
ICefBase = interface
['{1F9A7B44-DCDC-4477-9180-3ADD44BDEB7B}']
function Wrap: Pointer;
end;
But i can`t understand how to use it.
Thanks for help! Sorry for my broken English 🙂 I hope I explained the problem properly.
Using Delphi 7.
UPD:
This code works:
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;
You can return your descendant of
TCefContentFilterOwnin which you implementProcessDatamethod. There you can setSubstituteDatato an instance ofTCefStreamReaderRefwhich will be loaded by the browser instead of the received data.