Оптимизация работы с DOM в Chromium Embedded Framework: решение проблемы двойного вызова события OnLoadEnd
Введение
В данной статье мы рассмотрим проблему, возникающую при работе с Chromium Embedded Framework (CEF), когда событие OnLoadEnd вызывается дважды. Это может привести к непредвиденному поведению при попытке обойти дерево DOM. Мы рассмотрим контекст проблемы, предложим решение и обсудим альтернативные подходы.
Описание проблемы
При использовании CEF для отображения веб-страниц и попытке подключения к событию OnLoadEnd для обхода DOM, пользователи могут столкнуться с ситуацией, когда обработчик VisitDom вызывается дважды. Это может быть вызвано различными ассетами страницы, такими как изображения и внешние скрипты, каждый из которых может инициировать отдельный вызов события OnLoadEnd.
Пример кода
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) and Frame.IsMain then
begin
Visitor := TCefFastDomVisitor.Create(VisitDom);
FBrowser.Browser.MainFrame.VisitDom(Visitor);
end;
Result := True;
end;
Подтвержденное решение
Проблема двойного вызова события OnLoadEnd может быть решена путем проверки, что основная рамка (main frame) загружена, то есть Frame.IsMain = True. Это позволит убедиться, что обход DOM выполняется только один раз, даже если страница содержит несколько ресурсов, вызывающих событие загрузки.
Альтернативные подходы
В комментариях было предложено также проверить, что код возврата HttpStatusCode не равен нулю перед выполнением обхода DOM. Это может быть полезно, если нужно исключить обработку ошибок загрузки.
Заключение
В данной статье мы рассмотрели проблему двойного вызова события OnLoadEnd в CEF и предложили проверку на основную рамку как эффективное решение. Мы также обсудили альтернативные подходы, которые могут быть использованы для улучшения надежности и производительности работы с DOM.
Примечание
При использовании примеров кода важно убедиться, что вы работаете с актуальной версией CEF, так как интерфейсы и поведение могут изменяться от версии к версии.
Проблема двойного вызова события `OnLoadEnd` при работе с DOM в Chromium Embedded Framework и способы её решения.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.