cef3 исходный код HTML

Вопросы программирования и использования среды Lazarus.

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

cef3 исходный код HTML

Сообщение arriah » 12.12.2016 17:08:44

Всем привет

Код: Выделить всё
var
  chrom:TChromium;

begin
  chrom:=TChromium.Create(self);
  chrom.Load(Edit1.Text);
end;   


А как мне теперь в мемо получить исходный код загруженной страницы?
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: cef3 исходный код HTML

Сообщение скалогрыз » 12.12.2016 17:46:03

arriah писал(а):А как мне теперь в мемо получить исходный код загруженной страницы?

и не благодари:
Код: Выделить всё
var
  chrom:TChromium;

begin
  chrom:=TChromium.Create(self);
  chrom.Load(Edit1.Text);
  Memo1.Lines.LoadFromFile(Edit1.Text)
end;   
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: cef3 исходный код HTML

Сообщение arriah » 12.12.2016 18:06:52

скалогрыз писал(а):
arriah писал(а):А как мне теперь в мемо получить исходный код загруженной страницы?

и не благодари:
Код: Выделить всё
var
  chrom:TChromium;

begin
  chrom:=TChromium.Create(self);
  chrom.Load(Edit1.Text);
  Memo1.Lines.LoadFromFile(Edit1.Text)
end;   

В Edit1 находится URL страницы... а ты его предлагаешь загрузить как строки файла?

Страница из едита должна загрузится в хром. а из хрома в мемо должен попасть ее исходный текст
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: cef3 исходный код HTML

Сообщение pupsik » 12.12.2016 18:10:57

скалогрыз это намёк или предложение :)))))))))))))))))
Уж тогда надо:
Код: Выделить всё
Memo1.Lines.Assign(chrom.MainFrame.Lines)
:mrgreen:
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: cef3 исходный код HTML

Сообщение скалогрыз » 12.12.2016 18:40:21

¯\_(ツ)_/¯
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: cef3 исходный код HTML

Сообщение arriah » 12.12.2016 21:23:26

Ну а все же, как получить исходный текст загруженного документа в tchtomium, если его не использовать как визуальный компонент?
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: cef3 исходный код HTML

Сообщение скалогрыз » 12.12.2016 21:56:44

как и сказал pupsik, через
chrom.Browser.MainFrame.GetText()
?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: cef3 исходный код HTML

Сообщение arriah » 12.12.2016 23:12:00

Сделал так:

Код: Выделить всё
procedure ShowSource(const Src: ustring);
begin
   Form1.HTML := Src;
end; 

procedure TForm1.Chromium1LoadEnd(Sender: TObject; const Browser: ICefBrowser;
  const Frame: ICefFrame; httpStatusCode: Integer);
begin
  if (browser <> nil) and (browser.Identifier = Chromium1.BrowserId) and
     ((frame = nil) or (frame.IsMain))
  then
     Chromium1.Browser.MainFrame.GetSourceProc(@ShowSource);
end;                                               

Chromium.Load(Edit1.text);
SynEdit1.Text:=HTML;


вбиваю в эдит линк какого-нибудь сайта, вижу в синедите исходный код.
Но не со всех сайтов. Например если таким образом загрузить Interfax.ru то в браузере сайт отображается, а исходного кода не видно. Причем если вызвать контекстное меню на браузере и выбрать показать исходный код - показывает.
Помогите разобраться...

И еще.
Это с визуальным компонентом брошенным на форму.
Но если бразузер создать через Chrom:=TChromium.Create, то по-моему даже chrom.load(url) не отрабатывает, то есть не подгружается страничка

Ну и попутный вопрос.
Все это ради ого чтобы получить некий контент с сайтов, которые например, отдают его через яваскрипт. Поэтому и затеялся с хромом.
А можно ли используя синапсис получать исходный текс страницы, уже после того как там отработали все скрипты? Тогда и надобность бы в хроме отпала)) Надо лишь получить контент обработать его и вытащить лишь некоторые данные
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: cef3 исходный код HTML

Сообщение скалогрыз » 12.12.2016 23:30:20

ассинхроннае!
Код: Выделить всё
procedure ShowSource(const Src: ustring);
begin
   Form1.HTML := Src;
   SysEdit1.Text:=Src;
end; 

procedure TForm1.Chromium1LoadEnd(Sender: TObject; const Browser: ICefBrowser;
  const Frame: ICefFrame; httpStatusCode: Integer);
begin
  if (browser <> nil) and (browser.Identifier = Chromium1.BrowserId) and
     ((frame = nil) or (frame.IsMain))
  then
     Chromium1.Browser.MainFrame.GetSourceProc(@ShowSource);
end;                                               


arriah писал(а):Но если бразузер создать через Chrom:=TChromium.Create, то по-моему даже chrom.load(url) не отрабатывает, то есть не подгружается страничка

предположу, что не хватает Parent-а
Chrom.Parent:=Self;

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

лол.. можно. Но:
* ты получаешь сайт через синапс
* получаешь скрипты с сайта через синапс же
* отрабатываешь яваскрипты (синапс не умеет, а как ты их отработаешь - твоя проблема)
и уже потом отсылаешь запросы на дополнительные странички через синапс.

суровая правда жизни. CEF пока что твоя лучшая альтренатива
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: cef3 исходный код HTML

Сообщение arriah » 12.12.2016 23:39:57

скалогрыз писал(а):предположу, что не хватает Parent-а
Chrom.Parent:=Self;

Парент прописал, но ничего не изменилось

скалогрыз писал(а):суровая правда жизни. CEF пока что твоя лучшая альтренатива

Это я уже понял :)
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: cef3 исходный код HTML

Сообщение Снег Север » 13.12.2016 09:34:20

Сейчас не могу много писать, поэтому очень кратко. Использую Chrom под Делфи, всё взято из примеров по Делфи. Там есть много мозголомных нюансов, поэтому желательно очень точно воспроизвести пример и только потом, постепенно, изменять под себя.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2996
Зарегистрирован: 27.11.2007 16:14:47

Re: cef3 исходный код HTML

Сообщение скалогрыз » 13.12.2016 18:32:55

Снег Север писал(а):поэтому желательно очень точно воспроизвести пример и только потом, постепенно, изменять под себя.

да, у них именно так в документации написано.
The easiest way to create a new application using CEF is to start with the cefclient application and remove the parts that you don’t need. Many of the examples in this document originate from the cefclient application.

я как это прочитал, мне сразу стало грустно. (есть мнение, что авторы CEF сами смутно представляют, как Хромиум работает. Они просто смогли более-менее заточить под свои нужды - показывать браузер отдельным окном в отдельном процессе + какой-никакой контроль над браузером).
Получается принудительное Вуду программирование! :(

Пробовал на Винде распоследний fpcef3 со свежей сборкой (CEF 3.2704) - падает на cef_initialization() c AV.
Немного удивлён почему все функции описаны как cdecl. Если я смотрел в правильные делфийские исходники, то там как раз stdcall. (если учесть, что CEF заточен под сборку с помощью MSVC, то там как раз указано делать обычный dllexport соглашение, т.е. stdcall)

В cef.inc есть такой код (я уже встречался с такими вещам в ZenGL)
Код: Выделить всё
{$MACRO ON}
{$IFDEF WINDOWS}
  {$DEFINE cconv:=stdcall}
{$ELSE}
  {$DEFINE cconv:=cdecl}
{$ENDIF}

но тогда функции в cef3api.pas должны быть объявлены как:
Код: Выделить всё
  cef_initialize: function(const args: PCefMainArgs; const settings: PCefSettings; application: PCefApp;
      windows_sandbox_info: Pointer): Integer; cconv;

а они
Код: Выделить всё
  cef_initialize: function(const args: PCefMainArgs; const settings: PCefSettings; application: PCefApp;
      windows_sandbox_info: Pointer): Integer; cdecl;

..cconv используется только в callback-ах... это более чем странно!


Но так или иначе замена cdecl на stdcall погоды не сделала, и cef_initialization продолжал валиться. fpc 3.0.0 (Подозреваю, что структура TCefSettings не выровнена... ибо, если передать вместо settings, null, то cef_initialization() не падает)

Добавлено спустя 1 час 11 минут 18 секунд:
скалогрыз писал(а):Пробовал на Винде распоследний fpcef3 со свежей сборкой (CEF 3.2704) - падает на cef_initialization() c AV.

всё! разобрался.
Проблема оказалась в CefInitialize(), и в всего одном параметре:
Код: Выделить всё
  Settings.accept_language_list := CefString(CefAcceptLanguageList);

CefAcceptLanguageList - по-умолчанию пустая строка.

CefString - приводит к паскаль строку к cef_string следующим образом:
Код: Выделить всё
Result.str := PChar16(PWideChar(str))

"str" это совсем не null, это будет указатель на строчку с единственным символом: #0
Но, так или иначе, такое радость CEF-либе не нравится, и она падает с AV. (плохой sanity check, очевидно).

Придёться поправить с паскаль стороны, и насаждать nil, в случаях когда строка пустая.
Код: Выделить всё
function CefString(const str: ustring): TCefString;
begin
  Result.length := Length(str);
  if Result.length>0
    then Result.str := PChar16(PWideChar(str))
    else Result.str := nil;
  Result.dtor := nil;
end;

AV ушёл.

Теперь выскакивает ожидаемая ошибка, о том, что процесс-помощник отсуствтует.

Комиплирую subprocess! - внезапно просыпается Windows Defender (Windows 10) и ругается, что в свежескомпилированном файле вирус!

Добавлено спустя 24 минуты 58 секунд:
Странно! действительно "cdecl" (stdcall падает, очевидно не разрулив кто очищает стэк).
Т.е. пробелма была только в CefString() (а раз этой ошибки раньше не было, то скорей всего из-за каких-то внутренних изменений в самом CEF-е).
Ну и ладно. все довольны!

Добавлено спустя 1 час 45 минут 44 секунды:
скалогрыз писал(а):ассинхроннае!

да именно так и работает!

Добавлено спустя 4 минуты 19 секунд:
arriah писал(а):Парент прописал, но ничего не изменилось

Не подтверждаю. Всё работает, как если через дизайнер форм класть. (а иначе их собственный LCLCefClient не работал бы)

Мой код. (ты может быть OnLoadEnd эвент не назначешь?)
Код: Выделить всё
procedure TMainform.FormCreate(Sender: TObject);
begin
  {$INFO subprocess is set here, comment to use main program as subprocess}
  CefBrowserSubprocessPath := '.' + PathDelim + 'subprocess'{$IFDEF WINDOWS}+'.exe'{$ENDIF};
  Chromium:=TChromium.Create(Self);
  Chromium.Parent:=Self;
  Chromium.Align:=alBottom;
  Chromium.Visible:=true;
  Chromium.Height:=300;
  Chromium.OnLoadEnd:=@ChromiumLoadEnd;
end;


Добавлено спустя 12 часов 54 минуты 57 секунд:
заставляю fpcef3 на Маке плясать (Кока 64 бита)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru