我正在尝试创建一些浏览器原型(使用 CEF VCL for Deplhi – chromiumembedded),在将加载的内容转换为 DOM 之前对其进行过滤。
我决定处理 onResourceResponse 事件(对吗?)——它有参数filter。我不需要向现有数据添加一些内容或剪切,只需替换一些刚刚传输的 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;
这是 ICefBase 的声明:
ICefBase = interface
['{1F9A7B44-DCDC-4477-9180-3ADD44BDEB7B}']
function Wrap: Pointer;
end;
但我无法理解如何使用它。
感谢帮助!对不起我的英语不好:) 我希望我正确地解释了这个问题。
使用德尔福 7。
升级版:
此代码有效:
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;