OnLoadEnd вызывается несколько раз из Chromum Embedded Framework

Используя браузер CEF, я пытаюсь подключиться к событию OnLoadEnd, чтобы пройти по дереву DOM.

По какой-то странной причине у меня вызывается ВизитДом 2 раза.

procedure TForm1.FormCreate(Sender: TObject);
begin
   FBrowser := TChromium.Create(Self);
   FBrowser.Parent := TWinControl(Self);
   FBrowser.OnLoadEnd := BrowserOnLoadEnd;
   FBrowser.Load('http://google.com');
end;

procedure VisitDom(const Document: ICefDomDocument);
begin
  ShowMessage(Document.Document.Name);
end;

procedure TForm1.BrowserOnLoadEnd(Sender: TObject;
  const Browser: ICefBrowser; const Frame: ICefFrame; HttpStatusCode: Integer;
  out Result: Boolean);
var
  Visitor: TCefFastDomVisitor;
begin
  if HttpStatusCode = 200 then
  begin
    Visitor := TCefFastDomVisitor.Create(VisitDom);
    FBrowser.Browser.MainFrame.VisitDom(Visitor);
  end;
end;

Любая идея, почему OnLoadEnd вызывается несколько раз?


person Gad D Lord    schedule 27.03.2012    source источник
comment
могу я спросить, как вы пришли к выводу, что BrowserOnLoadEnd вызывается дважды? Вы поставили точку останова в начале или? Я не использовал CEF, но у меня странное ощущение, что этот FBrowser.Browser.MainFrame.VisitDom является генератором двойного события.   -  person    schedule 28.03.2012
comment
P.S. Я также вижу результат вывода: Boolean, разве вы не должны убедиться, что (Результат = Истина)? еще раз спрашиваю не уверен..   -  person    schedule 28.03.2012
comment
Просто интересно: почему вы приводите производный от TWinControl класс TForm1 к TWinControl при установке родителя браузера? Это не несс. (например, TWinControl(Self);   -  person Ritsaert Hornstra    schedule 28.03.2012
comment
Я уверен, что он вызывается дважды, так как мой отладчик дважды останавливается на BrowserOnLoadEnd. Результат всегда False.   -  person Gad D Lord    schedule 28.03.2012


Ответы (1)


Похоже, OnLoadEnd вызывается с HttpStatusCode = 200 для каждого актива, который есть на странице, например: изображения, внешние скрипты и т. д.

Решение состоит в том, чтобы проверить загрузку основного фрейма - Frame.IsMain = True.

if (HttpStatusCode = 200) and Frame.IsMain then
begin
  Visitor := TCefFastDomVisitor.Create(VisitDom);
  FBrowser.Browser.MainFrame.VisitDom(Visitor);
end;
person Gad D Lord    schedule 28.03.2012
comment
Или... если (HttpStatusCode!= 0) и Frame.IsMain, то - person Nathan Moinvaziri; 04.10.2012