В статье рассматривается проблема получения URL в компоненте TWebBrowser в среде разработки Delphi 10.2.2, использующем технологию FireMonkey. Пользователь столкнулся с ситуацией, когда при попытке получения обратного вызова (callback) при загрузке URL в методе ShouldStartLoadWithRequest не получает ожидаемого URL. Проблема связана с особенностями работы с локальными URL и политикой безопасности CORS.
Описание проблемы
При использовании компонента TWebBrowser в приложении на Delphi 10.2.2 Enterprise с технологией FireMonkey, пользователь хочет получать обратный вызов при загрузке URL, но сталкивается с проблемой: в методе ShouldStartLoadWithRequest не возвращается URL. Это происходит при работе с локальными URL, например, в формате file://.
Пользователь уже проверил несколько ресурсов и попробовал различные подходы, но проблема остаётся актуальной. В частности, он использовал следующий код:
procedure TForm2.FormCreate(Sender: TObject);
begin
WebBrowser1.URL := 'file://' + GetCurrentDir + '/../../index.html';
end;
procedure TForm2.Button1Click(Sender: TObject);
var
js : string;
begin
js := ' var url = "file://' + GetCurrentDir + '/../../index.html";'+
'var encodedurl = encodeURIComponent(url);'+
'window.location.href = encodedurl+"?67";';
WebBrowser1.EvaluateJavaScript(js);
end;
procedure TForm2.WebBrowser1ShouldStartLoadWithRequest(ASender: TObject;
const URL: string);
begin
// Код для обработки URL
end;
Пользователь предполагает, что изменение URL может заставить TWebBrowser считать его новым, что позволит извлечь нужные данные, сохраняя при этом обновление страницы.
Подтверждённый ответ
Пользователь продолжил исследования и выяснил, что отправка заголовков от локального URL к локальному URL приводит к их отказу, так как браузер, следуя политике CORS, считает их некорректными. В Chrome можно отключить эту политику, но в стандартном браузере FireMonkey это не работает. В Internet Explorer 11 и Edge возможность изменения настроек безопасности была удалена, и единственный способ получения обратного вызова — использование обёртки.
В качестве временного решения пользователь нашёл библиотеку ScriptGate 1.0, которую можно скачать из менеджера пакетов GetIt. Эта библиотека позволяет использовать обратные вызовы, вызывая JavaScript-функцию из кода Delphi. Пример использования ScriptGate:
uses
SG.ScriptGate, ...
var
FScriptGate: TScriptGate;
procedure TForm2.FormCreate(Sender: TObject);
begin
WebBrowser1.URL := 'file://' + GetCurrentDir + '/../../index.html';
FScriptGate := TScriptGate.Create(Self, WebBrowser1, 'YourOrgScheme');
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
FScriptGate.CallScript(
'getvalue()', // вызов JavaScript-функции getvalue
procedure(const iResult: String)
begin
ShowMessage(iResult); // результат будет 67
end
);
end;
procedure TForm2.evalfunction;
var
js: string;
begin
js :=
'function getvalue(){'+
' return "67";'+
'}';
WebBrowser1.EvaluateJavaScript(js);
end;
Альтернативный ответ
На данный момент Embarcadero не предоставила встроенной функции обратного вызова для TWebBrowser в FireMonkey, но использование обёрток, таких как ScriptGate, позволяет решить проблему в рамках текущих возможностей.
Заключение
Пользователям, столкнувшимся с аналогичной проблемой, рекомендуется использовать обёртку ScriptGate, чтобы получить обратный вызов из TWebBrowser. Это решение позволяет взаимодействовать с JavaScript-кодом страницы, что расширяет функциональность компонента. Надеемся, что в будущих версиях Delphi Embarcadero предоставит более удобные средства для работы с обратными вызовами в TWebBrowser.
Пользователь в Delphi 10.2.2 столкнулся с проблемой получения URL в компоненте `TWebBrowser` при работе с локальными URL, из-за чего не получает обратный вызов в методе `ShouldStartLoadWithRequest`, и пытается найти решение, используя обратные вызовы чер
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.