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 TCefContentFilterOwn
in which you implement ProcessData
method. There you can set SubstituteData
to an instance of TCefStreamReaderRef
which will be loaded by the browser instead of the received data.