Weiterentwicklung Chromium Browser Komponente

Rund um die LCL und andere Komponenten
downloaditweb
Beiträge: 27
Registriert: Do 28. Jan 2010, 13:24
OS, Lazarus, FPC: openSuse Leap 42.3 (L 1.8 FPC 3.0.4)
CPU-Target: 64Bit

Re: Weiterentwicklung Chromium Browser Komponente

Beitrag von downloaditweb »

Check failed: InitializeSandbox(sandbox_info)

Wenns wirklich daran liegt, könnte --no-sandbox helfen - leider mehr ein Workaround als eine Lösung.

Desweiteren zu cef_register_extension:
This function may only be called on the render process main thread (cef3api.pas)

Ist das sichergestellt? Wie die Kommunikation zwischen den Prozessen funktioniert, ist z.B. im neuen DOMAccess-Beispiel zu sehen.

Mit dcef in Delphi funktioniert das

Neueste dcef3-Version? Welche CEF3-Version?
Hab weder Windows noch Delphi parat, kann das von daher schlecht nachvollziehen.
Es könnte an anderen Standard-Einstellungen (cef3lib.pas ab Zeile 133) liegen - aber reine Spekulation

Hier mal der Code
[...]
Kommt noch

Den schau ich mir bei Gelegenheit an.

Ich habe auch mal neuere DLLs getestet - gleiches Ergebnis.

Mit der neuesten fpCEF3-Version gehen definitiv nur DLLs von CEF 3.1650. In neueren CEF-Versionen gibt es inkompatible Änderungen.

Ich hab die nächsten Wochen - leider - wieder Vollgas zu tun, danach sollte es zeitnah eine Version für das inzwischen stabile CEF 3.1750 geben 8)

stacho
Beiträge: 32
Registriert: Do 26. Nov 2009, 22:29

Re: Weiterentwicklung Chromium Browser Komponente

Beitrag von stacho »

Danke für die schnelle Rückmeldung

hier der fehlende Code aus meinem vorherigen post. Die die Register Funktion wird in TCustomRenderProcessHandler behandelt. Wie schon gesagt. Unter delphi aktueller Fork) läufts und die Dll-Funktionsaufrufe sind bei dir und dcef identisch. - Seltsam

unit1.pas
(3.5 KiB) 116-mal heruntergeladen

downloaditweb
Beiträge: 27
Registriert: Do 28. Jan 2010, 13:24
OS, Lazarus, FPC: openSuse Leap 42.3 (L 1.8 FPC 3.0.4)
CPU-Target: 64Bit

Re: Weiterentwicklung Chromium Browser Komponente

Beitrag von downloaditweb »

Ok, konnte mich nicht halten und habs mal angeschaut :roll:

Bitte mal folgendes ausprobieren:
- im betreffenden Lazarus-Projekt und CEF-Package sämtliche Runtime-Checks ausschalten
- --no-sandbox verwenden (konnte die erwähnte Meldung sogar mit Wine reproduzieren)
- evtl. in CefRegisterExtension (cef3lib.pas ~ Z. 444) CefInitDefault auskommentieren (hat bei mir unter Linux komische Sachen gemacht :( )

Noch etwas: ShowMessage im RenderThread ist keine besonders gute Idee...

stacho
Beiträge: 32
Registriert: Do 26. Nov 2009, 22:29

Re: Weiterentwicklung Chromium Browser Komponente

Beitrag von stacho »

Ok, konnte mich nicht halten und habs mal angeschaut

Danke für die Nachtschicht :!: :!: :!:

- im betreffenden Lazarus-Projekt und CEF-Package sämtliche Runtime-Checks ausschalten

Brachte für die Extension in der OnWebKitInitialized Prozedur noch nichts

- --no-sandbox verwenden (konnte die erwähnte Meldung sogar mit Wine reproduzieren)

Da ich nich wusste wie ich das verwenden muss, habe ich das in CefSettings eingebaut (Ist seit CEF-Version 16??.??? drin).

In Funktion CefInitialize:
..
settings.no_sandbox := True;
..

in cef3types ergänzt:

TCefSettings = record
..
// Set to true (1) to disable the sandbox for sub-processes.
no_sandbox: Boolean;
..

Ergebnis: Immer noch Error

- evtl. in CefRegisterExtension (cef3lib.pas ~ Z. 444) CefInitDefault auskommentieren (hat bei mir unter Linux komische Sachen gemacht :( )

Das hat es gebracht :lol: :lol: :lol:

Also da ist wirklich irgenwas noch nicht rund. Ist aber wirklich schlecht zu debuggen. Ich kann noch nicht mal nachvollziehen wie oft da LoadLibrary aufgerufen wird.

Noch etwas: ShowMessage im RenderThread ist keine besonders gute Idee...

Das war ja nur zu testzwecken. Hier gab es nun einen neuen Fehler, der aber weg war nachdem Schritt 1 " Runtime-Checks " rausgenommen wurden.

Erst noch mal ganz lieben Dank :!: :!:

downloaditweb
Beiträge: 27
Registriert: Do 28. Jan 2010, 13:24
OS, Lazarus, FPC: openSuse Leap 42.3 (L 1.8 FPC 3.0.4)
CPU-Target: 64Bit

Re: Weiterentwicklung Chromium Browser Komponente

Beitrag von downloaditweb »

stacho hat geschrieben:Da ich nich wusste wie ich das verwenden muss, habe ich das in CefSettings eingebaut (Ist seit CEF-Version 16??.??? drin).

Sorry, hätte ich erwähnen müssen. Das ist ein Commandline-Switch.
Also in Lazarus in Start->Startparameter->Kommandozeilenparameter eintragen oder das Programm in cmd / Powershell mit Programmname.exe --no-sandbox ausführen.

Soweit ich weiß, ist die Option in CEFSettings erst ab 1750 drinnen, die Definition in fpCEF3 stimmt so wie sie ist (eine Änderung kann Ärger machen, weil dann die Record-Größe & Position der Einträge nicht mehr stimmt!)

stacho
Beiträge: 32
Registriert: Do 26. Nov 2009, 22:29

Re: Weiterentwicklung Chromium Browser Komponente

Beitrag von stacho »

Danke für die Rückmeldung :wink:

Nochmal der Reihe nach (jetzt auf meinem Notebook mit win32 exe):

- im betreffenden Lazarus-Projekt und CEF-Package sämtliche Runtime-Checks ausschalten

Kein Error mehr bei Button1Click (..Load) aber OnContextCreated und OnWebKitInitialized sind anscheinend nicht aufgerufen worden. Es passiert nichts bei Click auf Button 2 und 3.
Fehlermeldung in Debug.Log noch vorhanden

- --no-sandbox verwenden (konnte die erwähnte Meldung sogar mit Wine reproduzieren)


Fehlermeldung in Debug.Log ist weg ansonsten gleiches Verhalten wie zuvor

- evtl. in CefRegisterExtension (cef3lib.pas ~ Z. 444) CefInitDefault auskommentieren (hat bei mir unter Linux komische Sachen gemacht :( )


Alles funktioniert Fehlermeldung in Debug.Log ist auch ohne no-sandbox weg :D

Habe jetzt eine neue Fehlermeldung in debug.log:

[0629/154302:INFO:CONSOLE(0)] "Uncaught TypeError: Cannot call method 'GetMessage' of undefined", source: about:blank (0)

das liegt aber wohl an meinem Code und wird lösbar sein.

ruewa
Beiträge: 153
Registriert: Sa 12. Apr 2014, 14:43

Re: Weiterentwicklung Chromium Browser Komponente

Beitrag von ruewa »

fpCEF3 paßt mit der aktuellen Version 1750 von CEF3 nicht zusammen - jedenfalls unter Linux64. Der Programmstart bricht mit der Meldung "Invalid CEF Library version" ab. Das Problem liegt in der Unit cef3api in Zeile 4924, die externe Funktion cef_get_trace_buffer_percent_full_async ist weder in den header-Dateien noch in der libcef.so vorhanden.
Abhilfe: Mit der Version 1650 (http://www.magpcss.net/cef_downloads/index.php?query=label%3ADeprecated#list) funktioniert es.

Gruß Rüdiger

stacho
Beiträge: 32
Registriert: Do 26. Nov 2009, 22:29

Re: Weiterentwicklung Chromium Browser Komponente

Beitrag von stacho »

Hallo Rüdiger,

Downloaditweb hat ja auch in seiner Readme geschrieben, dass er auf Vers. 1650 upgedatet hat. :wink:
Andere Versionen von cef3 würde ich nicht verwenden, auch wenn sie vermeintlich funktionieren.

ruewa
Beiträge: 153
Registriert: Sa 12. Apr 2014, 14:43

Re: Weiterentwicklung Chromium Browser Komponente

Beitrag von ruewa »

Naja, da steht auch "Version 3.1650 (and newer) should work". Ich hatte mich halt an die Readme gehalten und bin dabei erstmal aufgelaufen, bis ich das Kleingedruckte entdeckt und ausprobiert habe. Hab auch erst später gesehen, daß Downloaditweb hier: http://www.lazarusforum.de/viewtopic.php?p=70126#p70126 explizit darauf hingewiesen hat.

Beachtenswert ist daran allerdings, daß in der CEF3-API selbst konzeptionell noch einiges im Umbruch zu sein scheint, wenn Funktionen der Vorgängerversion einfach verschwinden.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Weiterentwicklung Chromium Browser Komponente

Beitrag von Michl »

Hallo downloaditweb,

erstmal vielen Dank für Deine geleistete Arbeit! Das Lazarus-Package lies sich problemlos installieren und bei mir läuft, für meine Zwecke scheinbar genügend stabil, Deine Portierung mit CEF3 v. 1650. WACEF habe ich, bis auf 2 Bugs mit CEF3 v. 1916 eigentlich auch stabil am Laufen.

Da ich für meine Anwendung das DragElement aus dem Html benötige und Du das scheinbar weiter implementiert hattes, als WACEF (habe es noch nicht gecheckt, waran das dort möglicherweise liegt), habe ich mal weiter geschaut, warum Du es nicht vollständig implementiert hattest?! Die Ursache lag wahrscheinlich in einem vergessenem "UnWrap":

Code: Alles auswählen

function cef_drag_handler_on_drag_enter(self: PCefDragHandler; browser: PCefBrowser;
  dragData: PCefDragData; mask: TCefDragOperationsMask): Integer; cconv;
begin
  Result := Ord(TCefDragHandlerOwn(CefGetObject(self)).OnDragEnter(
    TCefBrowserRef.UnWrap(browser), TCefDragDataRef.UnWrap(dragData), mask));
end;

Den Patch habe ich mal hier angefügt, evtl. kannst Du den ja so implementieren?!
Dateianhänge
0001-ondrag-patch.patch
(2.25 KiB) 88-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

downloaditweb
Beiträge: 27
Registriert: Do 28. Jan 2010, 13:24
OS, Lazarus, FPC: openSuse Leap 42.3 (L 1.8 FPC 3.0.4)
CPU-Target: 64Bit

Re: Weiterentwicklung Chromium Browser Komponente

Beitrag von downloaditweb »

Vielen Dank!
Das ist jetzt drinnen - hab das bisher einfach übersehen.

Eine neue Version auf Github kommt demnächst mit noch ein bisschen mehr Änderungen 8)

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Weiterentwicklung Chromium Browser Komponente

Beitrag von Michl »

Hallo downloaditweb,

dadurch, dass ich auf einem anderen Rechner fpCEF installiert habe, habe ich gesehen, dass das versprochene Update nun oben ist. Vielen Dank für das Hochladen der neuen fpCEF-Version (für CEF3 Release 1750) und vor allem Deiner dahinter stehenden Arbeit!

PS: Es würden sich hier bestimmt einige freuen, wenn Du hier eine kurze Info geben würdest, wenn Du ein Update auf eine neuere CEF-Version machst - ich würde mich auf jeden Fall darüber freuen :)

Eine Frage habe ich aber noch. Laut der Beschreibung (https://github.com/dliw/fpCEF3) kann ich nicht auf SingleProcess stellen. D.h. wenn kein Subprocess definiert ist, wird das Handle der Mainform genommen, wenn CEF das erste mal initialisiert wird.

Nun habe ich das Problem, dass ich keine externe Executable nutzen möchte und sich mein TChromium nicht in dem Mainformular befindet. Öffne ich nun das Unterformular wird zuerst der Subprozess, sprich in meinem Fall das Mainformular, nochmals geöffnet, bevor das Unterformular geöffnet wird.
Ich habe mir jetzt damit beholfen, dass ich das Unterformular quasi als Mainformular erstelle und dem Application.Mainformular danach mein tatsächliches Mainformular zuweise (ist nicht schön, scheint aber zu gehen). Gibt es dafür auch eine saubere Lösung?!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

downloaditweb
Beiträge: 27
Registriert: Do 28. Jan 2010, 13:24
OS, Lazarus, FPC: openSuse Leap 42.3 (L 1.8 FPC 3.0.4)
CPU-Target: 64Bit

Re: Weiterentwicklung Chromium Browser Komponente

Beitrag von downloaditweb »

wenn Du hier eine kurze Info geben würdest, wenn Du ein Update auf eine neuere CEF-Version machst

Das sollte möglich sein :D

kann ich nicht auf SingleProcess stellen

SingleProcess habe ich ich schon länger nicht mehr getestet; ohne das weiter zu prüfen, würde ich aber behaupten, dass der erwähnte Fehler nicht unter Windows auftritt.
Trotzdem ist das eher eine Entwickler-Option (für einfacheres Debugging und auch da nur eingeschränkt verwendbar) und nicht für den "normalen" Einsatz zu empfehlen.

wird das Handle der Mainform genommen

Genau genommen wird das (Haupt-)Programm ein zweites Mal gestartet und blockiert beim Aufruf von cef_execute_process. Hier "übernimmt" CEF den Prozess und verwendet ihn z.B. als Render-Prozess; er wird unmittelbar nach Benutzung beendet.
Das Hauptformular - was ja als erstes erstellt wird - sieht man dadurch nie, findet die Initialisierung später statt, hat man halt alles, was bis dahin geladen / angezeigt wurde (funktionslos) auf dem Schirm.

Gibt es dafür auch eine saubere Lösung?!

Zumindest keine vorgefertigte.

Eine Möglichkeit wäre einen (zusätzlichen) Aufruf von CefDefaultInit() an eine Stelle im Programm zu stellen, wo noch keine Forms erstellt oder angezeigt wurden (also im Prinzip gleich am Anfang). Der Haken dabei ist, dass man dadurch das Library immer läd, unabhängig davon, ob es jemals benötigt wird (also das entsprechende Fenster angezeigt wird).
"Doppelinitialisierung" bei mehrfachem Aufruf von CefDefaultInit oder CefInitialize sollte es in der letzten Version nicht mehr geben.
Evtl. reicht es sogar die Reihenfolge der Fenster-Initialisierung zu ändern (?).

Eine andere wäre sich die übergebenen Parameter anzusehen (oder einfach nur die Anzahl), also ParamStr oder ParamCount, und abhängig davon das Hauptformular oder das mit CEF drauf zu öffnen. Für alle zusätzlichen Prozess-Aufrufe hängt CEF nämlich eine ganze Menge Parameter dran.

Hab beides nicht getestet, sollte aber beides - theoretisch - gehen. Welche wirklich die bessere ist, kann ich schlecht sagen.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Weiterentwicklung Chromium Browser Komponente

Beitrag von Michl »

downloaditweb hat geschrieben:SingleProcess habe ich ich schon länger nicht mehr getestet; ohne das weiter zu prüfen, würde ich aber behaupten, dass der erwähnte Fehler nicht unter Windows auftritt.
Trotzdem ist das eher eine Entwickler-Option (für einfacheres Debugging und auch da nur eingeschränkt verwendbar) und nicht für den "normalen" Einsatz zu empfehlen.
Unter Rev. 1650 konnte ich SingleProcess verwenden unter 1750 nicht (es wird ein inhaltsloses Browserfenster erstellt - komischerweise werden zwar kein Hintergrund, Farbe, Schrift etc. angezeigt, jedoch wenn man die Maus über das Browserfenster bewegt, wird das Mausicon entsprechend der Seite geändert).

downloaditweb hat geschrieben:Evtl. reicht es sogar die Reihenfolge der Fenster-Initialisierung zu ändern (?).
So hatte ich es ja - ist aber keine gute Lösung.

downloaditweb hat geschrieben:Eine Möglichkeit wäre einen (zusätzlichen) Aufruf von CefDefaultInit() an eine Stelle im Programm zu stellen, wo noch keine Forms erstellt oder angezeigt wurden (also im Prinzip gleich am Anfang). Der Haken dabei ist, dass man dadurch das Library immer läd, unabhängig davon, ob es jemals benötigt wird
So einfach ist es :)
Dass die Library immer geladen wird, damit habe ich kein Problem (das war bei der Lösung zuvor ja auch der Fall). Man braucht nicht einmal bei "Initialization" oder in der ".lpr" CEF zu initialisieren (obwohl das auch geht), es genügt im OnCreate eines Formulars:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  CefResourcesDirPath:= 'Resources';
  CefLocalesDirPath:= 'Resources\locales';
  CefInitDefault;
end;
Vielen Dank!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Weiterentwicklung Chromium Browser Komponente

Beitrag von af0815 »

Wie ist der Stand bei fpCEF3 nach einem Jahr ohne Posts in dem Thread ?

Kann man damit auch Flash im Browserfenster steuern ? Hintergrund ist, das ich ein Browserfenster mit Flashinhalt steuern will - Mausbewegungen, Erkennung von Objekten und Tatasturkommendos senden. Ich möchte etwas an Routineaufgaben automatisieren :-)
Nur bevor ich da weiter darüber sinne, will ich mal die prinzipielle Machbarkeit hinterfragen. Wenn ja, dann mache ich sowieso einen neuen Thread bei Bedarf auf.

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten