fpCEF3

Вопросы использования сторонних (не входящих в состав FPC и Lazarus) утилит и библиотек.

Модератор: Модераторы

mgear
новенький
Сообщения: 19
Зарегистрирован: 25.01.2015 18:29:56

Сообщение mgear »

Снег Север, ну для винды в целях более широкой совместимости мне всё же следует ориентироваться на 32 бита. Для себя-то, любимого, можно и 64, но для людей надо или только 32, или 32+64. Это программа - сборщик информации с интернет-ресурсов, сведением в базу и выборками. Ориентировался на голый хтмыл и начал на перле делать, но упёрся в то, что некоторые сайты хотят жаба скрипт, да ещё и взаимодействие с юзером. Хорошо, что недавно только начал делать и ещё не успел гигабайтищи кода наковырять.

Странно, что так мало ресурсов по Delphi/FPC+CEF3. Вероятно, это связано с малой вообще популярностью этих языков. Но я кое-что уже сам наковырял из исходников. Например, теперь умею ажнык двумя способами вынимать текст из браузера: через GetSourceProc и GetSource.

GetSource лучше тем, что в обработчик можно параметры передавать. Странновато, что процедура в GetSourceProc объявлена как единственный стринг без доп. параметров.

Ну и про передачу сообщений, вроде бы, разобрался. Там, по сути, идеологически не особо сложно: в API задействованы всего два PID-а, BROWSER и RENDERER. Проблема в организации безглючного взаимодействии процессов и отладке.

Код: Выделить всё

procedure StringVisitor(const str: ustring);
begin
  MainForm.lbUrl.Caption := MainForm.crm.Browser.MainFrame.Url;
  MainForm.Memo1.Lines.Text := str;
end;

procedure TMainForm.crmLoadEnd(Sender: TObject;
  const Browser: ICefBrowser; const Frame: ICefFrame; httpStatusCode: Integer);
var
  res:boolean;
begin
  if Assigned(Frame) and Frame.IsMain and (httpStatusCode = 200) then
    crm.Browser.MainFrame.GetSourceProc(@StringVisitor);
end;


Код: Выделить всё

  TCefStringVisitor = class(TCefStringVisitorOwn)
  private
    FBrowser: ICefBrowser;
  protected
    procedure Visit(const str: ustring); override;
    constructor Create(const browser: ICefBrowser);
  end;

procedure TCefStringVisitor.Visit(const str: ustring);
begin
  MainForm.lbUrl.Caption := MainForm.crm.Browser.MainFrame.Url;
  MainForm.Memo1.Lines.Text := str;
end;

constructor TCefStringVisitor.Create(const browser: ICefBrowser);
begin
  inherited Create;
  FBrowser := browser;
end;

procedure TMainForm.crmLoadEnd(Sender: TObject;
  const Browser: ICefBrowser; const Frame: ICefFrame; httpStatusCode: Integer);
var
  res:boolean;
begin
  if Assigned(Frame) and Frame.IsMain and (httpStatusCode = 200) then
    crm.Browser.MainFrame.GetSource(TCefStringVisitor.Create(Browser));
end;
Последний раз редактировалось mgear 28.04.2017 15:38:39, всего редактировалось 1 раз.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

В той версии хромиума под делфи которую использовал я (не самая последняя, но достаточно стабильная, а постоянные изменения интерфейса к хромиуму от версии к версии меня задолбали) текст вынимается callback процедурой. И у нас эти программы внутреннего пользования, так что они всегда запускаются на серверах где 32 бита не бывает уже лет пятнадцать...
mgear
новенький
Сообщения: 19
Зарегистрирован: 25.01.2015 18:29:56

Сообщение mgear »

Снег Север писал(а):текст вынимается callback процедурой

Наверняка в вашей версии хромиума есть и GetSource.

Для коллбэков в fpCEF3 сделаны обёртки с названиями TCef...XXXOwn. Это паскалевские реализации апишных интерфейсов ICef...XXXHandler, ICef...YYYVisitor и т.д.

Код: Выделить всё

grep -i "t.*own =" *.pas


То есть, по сути, обработка всяческой фигни сводится к поиску подходящего родительского класса и написанию примитивной обёртки вокруг него с переписанными одним-двумя методами.

Проблемка, конечно, в том, что нет даже не то что нормальных, а хоть сколько-то осмысленных доков.

P.S. Так долго объяснял, что аж сам понял :mrgreen: :mrgreen: :mrgreen:

Кароч вот как надо действовать. В API есть обработчики ICefXXX. Вокруг них навёрнуты реализации, возможно, заглушки.
Вот все они. Точнее, надеюсь, что все:

Код: Выделить всё

grep -n "class.*, ICef" *.pas


Классы TCef...Own - базовые обёртки интерфейсов, а-ля абстрактные классы, только рабочие методы из каких-то соображений не описаны как abstract. В некоторых случаях вокруг них уже написаны рабочие классы.

Мой класс TCefStringVisitor основан на TCefStringVisitorOwn, где рабочий метод Visit описан как "begin end". Также в cef3own описан "полноценный" класс TCefFastStringVisitor, только мне он не понравился. Даже не понимаю, нафига он вообще нужен такой красивый.
tema
постоялец
Сообщения: 376
Зарегистрирован: 24.03.2011 19:19:27

Сообщение tema »

Кому-нибудь удалось запустить экземплы из fpCEF3 под Linux?
Собирается проект нормально, но запустить так и не удалось :-(

Добавлено спустя 11 минут 12 секунд:

Код: Выделить всё

$ ./simple

(simple:3879): Gtk-WARNING **: Загружаемый модуль тем не найден в module_path: «adwaita»,
[FORMS.PP] ExceptionOccurred
  Sender=EOSError
  Exception=An operating system call failed.
  Stack trace:
  $00000000004D997E
  $00000000004D9891
  $000000000077F2FA
  $0000000000536458 line 7842 of include/wincontrol.inc
  $000000000053586E line 7531 of include/wincontrol.inc
  $0000000000445F04 line 23 of include/scrollingwincontrol.inc
  $000000000044F33D line 2685 of include/customform.inc
  $0000000000450988 line 3154 of include/customform.inc
  $0000000000534C80 line 7396 of include/wincontrol.inc
  $0000000000536458 line 7842 of include/wincontrol.inc
  $000000000045ACCB line 2230 of include/application.inc
  $000000000041C45C line 21 of simple.lpr
TApplication.HandleException An operating system call failed.
  Stack trace:
  $00000000004D997E
  $00000000004D9891
  $000000000077F2FA
  $0000000000536458 line 7842 of include/wincontrol.inc
  $000000000053586E line 7531 of include/wincontrol.inc
  $0000000000445F04 line 23 of include/scrollingwincontrol.inc
  $000000000044F33D line 2685 of include/customform.inc
  $0000000000450988 line 3154 of include/customform.inc
  $0000000000534C80 line 7396 of include/wincontrol.inc
  $0000000000536458 line 7842 of include/wincontrol.inc
  $000000000045ACCB line 2230 of include/application.inc
  $000000000041C45C line 21 of simple.lpr
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

tema, директория locales рядом с бинарником скопирована? Под виндой без нее не запускается.
tema
постоялец
Сообщения: 376
Зарегистрирован: 24.03.2011 19:19:27

Сообщение tema »

У меня линукс. Проблему локализовал:
https://github.com/dliw/fpCEF3/issues/72
Другой вопрос появился. Если просто бросить этот хромиум на форму, то вроде всё ок. Если я хочу сделать приложение посложнее, вроде панельки всяки на форму добавить, пропадает возможность писать что-то в поля ввода на странице. Например в яндексе в строку поиска ничего не вводится :-(
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

Проблему локализовал:
:) последние тесты показывали что и динамическая подгрузка необходимых длл вполне таки работает в лине.

По поводу "сложности". Это и в демках наблюдается?
tema
постоялец
Сообщения: 376
Зарегистрирован: 24.03.2011 19:19:27

Сообщение tema »

pupsik писал(а):По поводу "сложности". Это и в демках наблюдается?

Да. Везде.
Проблема появляется в случае, когда, после запуска, сразу пытаешься ввести запрос в яндекс. Если до этого сделать активным любой другой элемент формы (поле ввода ил и кнопку), то после этого в браузер фокус передаётся корректно и всё вводится. Дело именно в фокусе. После создания браузера нельзя начинать сразу в него что-то вводить.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

tema, так сделай это сам. Прямо при создании окна. А до этого заморозь компонент-браузер.
tema
постоялец
Сообщения: 376
Зарегистрирован: 24.03.2011 19:19:27

Сообщение tema »

Лекс Айрин писал(а):tema, так сделай это сам. Прямо при создании окна. А до этого заморозь компонент-браузер.

Я так и попробовал сделать. В консоль сыпется куча ошибок. Очень странно работает эта фигня

Добавлено спустя 1 минуту 34 секунды:
Altlinux 64
KDE 5
Lazarus 1.8.4
FPC 3.0.4
gtk2 (в qt4 ситуация похожая, там есть другие глюки)

Добавлено спустя 3 минуты 34 секунды:
Ну и при закрытии приложения с наличием компонента "Chromium" обязательно в 100% случаев "Ошибка сегментирования"
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

А в транке не пробовал?

Не пробовал при финише освобождать Chromium?
tema
постоялец
Сообщения: 376
Зарегистрирован: 24.03.2011 19:19:27

Сообщение tema »

Лекс Айрин писал(а):А в транке не пробовал?

Не пробовал при финише освобождать Chromium?

В транке компонент не компилируется. Это и в гитхабе описано.
При компиляции сообщения одна и та же ошибка cef3ref.pas(1784,1) Error: Local variables size exceeds supported limit
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

странно...
Error: Local variables size exceeds supported limit:
local variables size exceeds supported limit this indicates that you are declaring more than 32k of local variables, which is not supported by this processor.
размер локальных переменных превышает поддерживаемый лимит. это означает, что объявляется более 32 КБ локальных переменных, которые не поддерживаются данным процессором.

интересно, что там такого...вот только пользоваться что-то каким компонентом неохота(((
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

А FPC 64-битный?
tema
постоялец
Сообщения: 376
Зарегистрирован: 24.03.2011 19:19:27

Сообщение tema »

Vadim писал(а):А FPC 64-битный?

Конечно!
Ответить