fpCEF3

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

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

fpCEF3

Сообщение arriah » 05.07.2016 17:59:11

Привет всем,

Добрался таки я до компонента TChromium. Внятной доки не нашел, есть группа в гугле на англ, там тонна всего разного, но толи не нашел, то ли не умею искать на буржуйском языке :) Вобщем есть пара вопросов:

1. Для примера кинул на форму компонент. указал урл - страничка загрузилась. Правой кнопкой по страничке - контекстное меню на англ с нафигацией - как поправить ее на русский или совсем отключить.

2. Как на полученной страничке выбрать все ссылки?
Может есть какая процедура, функция, нахождения всех ссылок, типа targetURL или только парсить страницу?
Ну или как вариант, организовать конекстное меню при клике правой кнопкой на урле, а там выбрать что с этим урл сделать...
arriah
новенький
 
Сообщения: 85
Зарегистрирован: 29.07.2015 16:42:35

Re: fpCEF3

Сообщение Alex_vcorp » 06.07.2016 13:43:36

Привет.

Тоже разбираюсь с fpCEF3

Тоже есть куча вопросов, постепенно буду спрашивать )
Что сам сделал, стараюсь по возможности и наличии времени выкладывать на своём сайте, ибо даже англоязычные ресурсы не радуют...
(но это занимает много времени, приходится тщательно тестировать. Не исключены ошибки)

arriah писал(а):Правой кнопкой по страничке - контекстное меню на англ с нафигацией - как поправить ее на русский или совсем отключить.

Событие OnBeforeContextMenu для TChromium - в функции обработки события нужно работать с model: ICefMenuModel
Подробнее список функций см. в коде для ICefMenuModel в файле cef3intf.pas

Как начать работу с контекстным меню можно почитать здесь Lazarus fpCEF3 - контекстное меню

Сам искал набор поддерживаемых кодов по исходным файлам fpCEF3, ниже привожу список, который пока смог составить.
Что-то поддерживается по умолчанию, что-то приходится проверять и делать невыбираемым через model.SetEnabled(commandId: Integer; enabled: Boolean);
Что-то вообще пока непонятно как работает... надо разбираться.

Код: Выделить всё
procedure TFormMain.Chromium1BeforeContextMenu(Sender: TObject;
  const Browser: ICefBrowser; const Frame: ICefFrame;
  const params: ICefContextMenuParams; const model: ICefMenuModel);
begin
  model.Clear; // Очистка контекстного меню
  model.AddItem(100,Utf8Decode('Back (&B)'));
  if(not Browser.CanGoBack) then model.SetEnabled(100, false);
  model.AddItem(101,Utf8Decode('Forward (&F)'));
  if(not Browser.CanGoForward) then model.SetEnabled(101, false);
  model.AddItem(102,Utf8Decode('Reload (&R)'));
  model.AddItem(103,Utf8Decode('Reload NoCache'));
  model.AddItem(104,Utf8Decode('Stop load (&S)'));
  model.AddSeparator;
  model.AddItem(113,Utf8Decode('Copy (&C)'));
  model.AddItem(116,Utf8Decode('Select all (&A)'));
  model.AddSeparator;
//  model.AddItem(130,Utf8Decode('&Find'));
  model.AddItem(131,Utf8Decode('&Print...'));
  model.AddItem(132,Utf8Decode('View source (&O)'));
//  model.AddSeparator;
//  model.AddItem(220,Utf8Decode('MENU_ID_CUSTOM_FIRST'));
//  model.AddItem(250,Utf8Decode('MENU_ID_CUSTOM_LAST'));
end;


Добавлено спустя 48 минут 9 секунд:
arriah писал(а):2. Как на полученной страничке выбрать все ссылки?

Как вариант, выполнить свой JavaScript с помощью Frame.ExecuteJavaScript() в функции-обработчике события onLoadEnd
JavaScript-код может выполнить быстрый сбор всех ссылок и вывод произвольного текста в консоль.
Получить выведенный в консоль текст можно из функции-обработчика события OnConsoleMessage

я-бы сделал так, но я веб-разработчик сейчас, мне так проще ))
Alex_vcorp
незнакомец
 
Сообщения: 5
Зарегистрирован: 06.07.2016 13:09:21

Re: fpCEF3

Сообщение arriah » 07.07.2016 01:48:34

я-бы сделал так, но я веб-разработчик сейчас, мне так проще ))

Спасибо тебе мил человек, натолкнул на мысли :)
arriah
новенький
 
Сообщения: 85
Зарегистрирован: 29.07.2015 16:42:35

Re: fpCEF3

Сообщение wavebvg » 07.07.2016 16:44:40

arriah писал(а):
я-бы сделал так, но я веб-разработчик сейчас, мне так проще ))

Спасибо тебе мил человек, натолкнул на мысли :)

А не проще вызвать JS метод через API и прочитать полученное значение? К примеру так:
Код: Выделить всё
  Context := Frame.GetV8Context;
  if not Context.Enter then
    raise Exception.Create('Enter error!!!');
  try
    Document := Context.Global.GetValueByKey('document');
    QuerySelectorAll := Document.GetValueByKey('querySelectorAll');
    SelectorValue := TCefv8ValueRef.CreateString('a');
    Nodes := QuerySelectorAll.ExecuteFunction(Document, [SelectorValue]);
  finally
    if not Context.Exit then
      raise Exception.Create('Exit error!!!');
  end;

API может отличаться (это от первой ceflib-ы), но принцип, я думаю, понятен
wavebvg
постоялец
 
Сообщения: 283
Зарегистрирован: 28.02.2008 04:57:35

Re: fpCEF3

Сообщение Alex_vcorp » 07.07.2016 18:03:56

wavebvg писал(а):А не проще вызвать JS метод через API и прочитать полученное значение?

Думаю, что лучше предусмотреть ситуацию, когда JavaScript-код может произвольно меняться при необходимости.
Чтобы не перекомпилировать приложение каждый раз, JS-код перед выполнением проще читать из текстового файла.

Там мы получим собственный аналог User-Script.
Например, нам необходима автоматическая авторизация в какой-либо админке, или попался "нестандартный" сайт.
Открываем текстовый файл и дописываем наш JS-код, после чего перезапускаем приложение или перечитываем JS-файл.
Alex_vcorp
незнакомец
 
Сообщения: 5
Зарегистрирован: 06.07.2016 13:09:21

Re: fpCEF3

Сообщение Alex_vcorp » 08.07.2016 19:42:59

Есть вопросы по установкам некоторых опций Options компонента TChromium

Интересуют:
ImageShrinkStandaloneToFit
FileAccessFromFileUrls
UniversalAccessFromFileUrls
WebSecurity


Сколько не тестировал, не вижу разницы при установках STATE_DEFAULT, STATE_ENABLED, STATE_DISABLED
Делал подгрузку сетевого файла с локальной страницы и наоборот, в исходном HTML-коде и в подгружаемом JS-файле, работал с изображениями, в том числе через DragDrop, через base64 и т.д.

Для опции ImageShrinkStandaloneToFit вообще не разобрался, что она делает, никаких изменений не видел вообще.

Для опций FileAccessFromFileUrls , UniversalAccessFromFileUrls , WebSecurity тоже не увидел никаких изменений,
Вне зависимости от различных установок этих опций, локальная страница может обращаться как к локальным, так и сетевым файлам,
но сетевая страница не может обратиться напрямую к локальным файлам. FileAPI и DragDrop работают всегда, но это действия пользователя...

Браузеры Chrome и FireFox по умолчанию работают аналогично компоненту TChromium, то-есть обращение к локальному файлу допустимо только с локальной страницы.

--------------
Кто нибудь знает, может эти опции вообще не влияют на работу TChromium? Или я что-то не так делаю?

Моя конфигурация: Lazarus IDE v1.6.0, fpc 3.0.0, fpCEF3 3.2526, win7 64.

Добавлено спустя 4 часа 45 минут 2 секунды:
Готовлю потихоньку документацию на русском языке.
Аналогов не нашёл нигде, даже на буржуйском )
Приходится много тестировать, это очень замедляет процесс.

Сейчас опции тестирую. Могу ошибаться, просьба указывать на ошибки, если таковые будут.

Страница в процессе подготовки TChromium Options - опции в инспекторе объектов

И по указанным опциям выше, хотелось-бы узнать точнее, действительно-ли эти опции не поддерживаются или я не там смотрю?
Alex_vcorp
незнакомец
 
Сообщения: 5
Зарегистрирован: 06.07.2016 13:09:21

Re: fpCEF3

Сообщение arriah » 10.07.2016 00:44:34

Alex_vcorp писал(а):Готовлю потихоньку документацию на русском языке.
Аналогов не нашёл нигде, даже на буржуйском )
Приходится много тестировать, это очень замедляет процесс.

Сейчас опции тестирую. Могу ошибаться, просьба указывать на ошибки, если таковые будут.

Страница в процессе подготовки TChromium Options - опции в инспекторе объектов

Тоже возникла идея сделать перевод, но времени катастрофически не хватает. Страничку в закладки :)
arriah
новенький
 
Сообщения: 85
Зарегистрирован: 29.07.2015 16:42:35

Re: fpCEF3

Сообщение mgear » 26.04.2017 02:07:25

Начал разбираться с CEF3 и с ходу получил вылет при завершении программы. Программа самая тупая: пустая форма с кинутым на неё TCromium, кнопка и Cromium1.Load('http://ya.ru/') в OnClick.

ИзображениеИзображениеИзображение

Сам-то браузер работает, то есть, грузит яндекс и ходит по ссылкам. Если понаделать в хромиуме обработчиков событий и понаставить точек прерывания, то всё отлаживается. Но при завершении программы фигня вылазит.

И в debug.log ещё пишет подозрительные вещи:
[0425/235616.763:ERROR:angle_platform_impl.cc(33)] ANGLE Display::initialize error 5: DXGI 1.2 required to present to HWNDs owned by another process.
[0425/235616.763:ERROR:gl_surface_egl.cc(646)] eglInitialize D3D11 failed with error EGL_NOT_INITIALIZED, trying next display type
[0425/235657.367:FATAL:broker_services.cc(133)] Check failed: false.
[0425/235658.245:FATAL:broker_services.cc(133)] Check failed: false.


То ли я чего-то не проинициализировал или не профинализировал, то ли fpCEF3 поломали при апдейте (сомнительно, чтоб такую явную ошибку не отловили), то ли фреймворк не той версии (а вот это вполне, потому что там 11 штук билдов релиза 3.2924), то ли версия компилятора не та, то ли флаги компиляции (тоже влёгкую).

Ось Win7 64
Lazarus 1.6.4 + FPC 3.0.2.
Target Win32
fpCEF3 v3.2924
CEF 3.2924.1575.g97389a9 / Chromium 56.0.2924.76 - cef_binary_3.2924.1575.g97389a9_windows32.tar.bz2

Содержимое каталога с экзешником:
Изображение

Вопрос у меня очень простой: поделитесь, пожалуйста, заведомо рабочими сочетаниями версий лазаруса, компилятора, fpCEF и фреймворка под Win32. Я хоть тогда уверен буду, что ошибка где-то на моей стороне, а то вообще непонятно, куда копать.

Пробовал также fpcef 3.2840 и фреймворк cef_binary_3.2840.1518.gffd843c_windows32.tar.bz2
Результат примерно тот же, а перебирать все сочетания паскалей, компонентов и фреймворков как-то энтузиазма не хватает.

А ещё компилируются, но ни фига не запускаются, или запускаются, но не пашут, примеры из fpCEF3.
mgear
новенький
 
Сообщения: 19
Зарегистрирован: 25.01.2015 19:29:56

Re: fpCEF3

Сообщение Снег Север » 26.04.2017 07:47:29

У меня всё руки не доходят потестить Chromium на лазарусе. Но делфи использую его в нескольких рабочих проектах вполне успешно. Кстати, есть уже и CEF4DELPHI:
https://www.briskbard.com/index.php?lang=en&pageid=cef
Аватара пользователя
Снег Север
энтузиаст
 
Сообщения: 965
Зарегистрирован: 27.11.2007 16:14:47

Re: fpCEF3

Сообщение mgear » 26.04.2017 19:52:47

CEF3 на XE2 завёлся с пол-оборота. CEF4 что-то с ходу не завёлся, но не вижу большого смысла ковырять, потому что на дельфи лицензии у меня нет. Сейчас-то для себя делаю, пофиг, но не исключено, что удастся допилить до состояния "другим людям это интересно настолько, что они готовы заплатить шесть копеек", а тогда входные затраты в штуку баксов будут иметь определённое значение.

Вот то и настораживает, что на дельфи такой же в точности проект, а ничего никуда не вылетает. Ну и examples не пашут - это ж вовсе не смешно.

Скачал вчера ещё fpcef/cef 2704 и 2743, попробую с ними, вдруг заведётся.

Давненько не программил, подзабыл уже про эти пляски с бубнами вокруг сторонних библиотек и OS compatibility :mrgreen:
mgear
новенький
 
Сообщения: 19
Зарегистрирован: 25.01.2015 19:29:56

Re: fpCEF3

Сообщение Снег Север » 27.04.2017 20:59:58

Так, сегодня сделал эксперимент, отписываюсь о результатах.
Дано: windows 10, lazarus 1.6.4 64bit.

Скачиваю компонент отсюда: https://github.com/dliw/fpCEF3
Скачиваю минимальный набор бинарников отсюда: http://opensource.spotify.com/cefbuilds ... nt.tar.bz2
(требуется версия не выше 2924, со свежей, как оказалось, работать не будет!)

Делаю минимальный пример по вики: http://wiki.freepascal.org/fpCEF3

Запускаю - работает!
Аватара пользователя
Снег Север
энтузиаст
 
Сообщения: 965
Зарегистрирован: 27.11.2007 16:14:47

Re: fpCEF3

Сообщение mgear » 27.04.2017 21:55:36

Снег Север писал(а):Запускаю - работает!


Работать-то оно и у меня работает. Глюки происходят, когда работа уже завершена :) А если откомпилить как отладочную, то нормально закроется, без окошек?

Я сам вчера ещё поковырялся и обнаружил, что вылетает только отладочный экзешник, а Release не вылетает. Фиг знает, что это. Понятно, что какая-то недоработка, но получается, что непринципиальная, раз в продакшене её нет. Просто несколько неудобно: после завершения приходится нажимать Ctrl-F2 и закрывать штуки три понавылезавших окон.

64 бита не проверял. Дистрибутивный лазарус ругается на что-то, когда втыкаю цель Win64, а разбираться лень.
mgear
новенький
 
Сообщения: 19
Зарегистрирован: 25.01.2015 19:29:56

Re: fpCEF3

Сообщение Снег Север » 27.04.2017 22:45:17

В стандартной отладочной версии подключается модуль выдачи данных о памяти, он, разумеется, выводит окошки. А как вы думали? Не хотите окошек, делайте свою настройку параметров компиляции и отладки.
У меня винда и лазарь 64 бит, поэтому ставлю платформу дефолтную и получаю 64 бит экзешник по умолчанию.
ЗЫ. Ничего не вылетает, правда я кроме перехода по URL ничего не проверял.
Аватара пользователя
Снег Север
энтузиаст
 
Сообщения: 965
Зарегистрирован: 27.11.2007 16:14:47

Re: fpCEF3

Сообщение mgear » 28.04.2017 01:25:43

Снег Север писал(а):В стандартной отладочной версии подключается модуль выдачи данных о памяти, он, разумеется, выводит окошки. А как вы думали?


Как думал? Получается, что никак и не думал, поскольку не знал про модуль с окошками :roll:

Спасибо за подсказку. Нашёл теперь и галочку в опциях, и описание в доке.
mgear
новенький
 
Сообщения: 19
Зарегистрирован: 25.01.2015 19:29:56

Re: fpCEF3

Сообщение Снег Север » 28.04.2017 07:59:01

На здоровье! И еще небольшая подсказка - мой опыт на делфи говорит, что версия 64 бит одной и той же сборки работает надежнее, особенно - с "проблемными" сайтами (с навороченными скриптами и т.п.)
Аватара пользователя
Снег Север
энтузиаст
 
Сообщения: 965
Зарегистрирован: 27.11.2007 16:14:47

След.

Вернуться в Сторонние средства

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru