Search code examples
delphiinterfacefilterchromiumchromium-embedded

Deplhi: Filtering loaded HTML by chromium enbedded (CEF VCL)


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;

Solution

  • 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.