Firefox/Gecko frontend embedded in native C++ App (Windows)

  • Hi

    ich arbeite an einer cloud app die im Browser läuft. Für user, die nicht in einer cloud arbeiten wollen, brauche ich eine native C++ app unter windows mit firefox/gecko-engine als frontend, eingebettet in ein C++ Backend (das die Server-Funktion übernimmt).

    Weiss jemand, wie man gecko in eine C++ App einbetten und nutzen kann ?

    Arbeitet jemand an solch einer App und würde den Code mit mir teilen, möglicherweise könnten wir die weitere Arbeit daran teilen.

    Gibt es eine Doku dazu, wie man gecko in eine Container App einbettet (unter Windows/C++)?

    Gibt es eine Beispiel-App oder ein Tutorial dazu ?

    Wäre es denkbar, Firefox über plugins/extentions so zu modifizieren/reduzieren, dass nur ein Browserfenster (für die Cloud App) ohne URL-Eingabe-Möglichkeit (wird von der Cloud App über interne links gesteuert ) dabei heraus kommt ?

    Grüße
    fran

  • Ja, dort hab' ich mich schon rumgetrieben. Die Inhalte sind aber veraltet und teilweise widersprüchlich:

    ... zum einen steht dort (in der Nähe)

    Roll your own browser - An embedding HowTo

    was mich hopefully stimmt, doch dann folgt ...

    Warning: This document is out of date. You should instead build XULRunner and use it for all new embedding. You should not need to, and should not, use embedding/config.

    Offenbar soll man bei "embedding von gecko" den XULrunner installieren. Das ist eine komplette Laufzeitumgebung, jede Menge Holz, sowas ähnliches wie die Java Runtime, sehr viele Dateien. Das läßt sich künftigen usern meiner apps nicht zumuten (soviel Dateien auf den Rechner zu spielen). Ich bräuchte eine (oder ein paar) Libraries (dlls) mit dokumentierten Schnittstellen, die ich in die C++Container App einbinden und nutzen kann. Komisch das das so schwierig und so schwierig zu finden ist. Trotzdem danke für deinen Rat.

    fran

  • Nun.... Firefox selbst läuft auf Basis des XULRunners. Das ist eine vollwertige Runtime-Umgebung. Firefox selbst ist im Grunde nur eine GUI. Der Browser stellt sich quasi selbst dar. Firefox ist Betriebssystemunabhängig. Daher sind die eigentlichen Browser-Teile auch nirgendwo in irgendwelchen DLLs zu finden, da dies ja spezielle Windows-libs sind. Wenn das alles zu viele Dateien sind, ist Firefox nicht das richtige für dich.

    Vielleicht ist das für dich interessant:
    http://mozillalabs.com/prism/

  • Zitat

    Firefox selbst läuft auf Basis des XULRunners. Das ist eine vollwertige Runtime-Umgebung. Firefox selbst ist im Grunde nur eine GUI. Der Browser stellt sich quasi selbst dar.

    hm. Das ist nicht leicht zu verstehen (für mich). Wie sieht das Deployment einer XULRunner App aus ? Weist du, wie man das (Firefox GUI) mit einer C++ Container app - also mit einer konkreten exe und dlls - koppelt ?

    Zitat

    sehr interessant. Werd' ich genauer nachlesen ...

  • Zitat von fran13

    hm. Das ist nicht leicht zu verstehen (für mich). Wie sieht das Deployment einer XULRunner App aus ? Weist du, wie man das (Firefox GUI) mit einer C++ Container app - also mit einer konkreten exe und dlls - koppelt ?


    Bedaure. Ich bin Frontendentwickler. Bei mir hört es bei den Skriptsprachen auf.

    XUL ist ein XML-Dialekt der für Frontends von Applikationen entwickelt wurde. Zusammen mit CSS und Javascript kann man mit XUL Interfaces entwickeln. Platt ausgedrückt ist Firefox eine große Webseite. Der XULRunner bietet eine Schnittstelle zu den Betriebssystemen, so das man über XUL alle Methoden aufrufen kann, die man so für einen Browser benötigt. Mit XUL wiederum baut man dann das Interface für seine Anwendung. Thunderbird, Songbird, usw. basieren alle auf dem XULRunner.

    Ich kenn mich aber nur marginal mit dem XUL-Teil aus. Wie man den XUL-Runner zum laufen bekommt, oder embeddet, dass kann ich dir nicht sagen.

  • hi bugcatcher,

    deine Hinweise haben sehr geholfen !!! Ich weiß zwar noch nicht, wie man eine XULunner App deployed, aber ich habe mich in XPCOM eingelesen https://developer.mozilla.org/en/Creating_XPCOM_Components und dabei wird vieles klarer.

    http://mozillalabs.com/prism/ habe ich ausprobiert, funktioniert leider nicht, liegt vielleicht an einer Unverträglichkeit zwischen der prism-Version/Plugin 1.0b3 und meinem Firefox 3.5.7 - da komm ich noch dahinter.

    Danke für deine Geduld & Sachlichkeit !

    Grüße
    fran

  • Also Prism war vielleicht auch keine gute Empfehlung. Damit lässt sich eine Webseite quasi zur Anwendung werden. Faktisch Installiert man damit einen Browser mit einer festen Webseite oder XUL-Anwendung. Damit könnte man z.B. Google Mail in einem eigenen "Programm" laufen lassen. Wie Du jetzt den C-Teil fürs Backend da einbinden kannst, wüsste ich auf Anhieb nicht. Du könntest aber wohl den Backend-Teil über XUL (der XULRunner der auch im Hintergrund von Prism arbeitet, bietet eine Vielzahl an Funktionen. Einen Server zu realisieren sollte kein Problem sein) erstellen. Wobei das wohl weit über das hinausgeht, was Du an Aufwand geplant hattest.

    Insofern würde ich mich primär auf das Embedden des XULRunners konzentrieren. Mag sein, dass das viel mehr Zeug ist als Du ursprünglich benötigst, aber ich kann mir nicht vorstellen das das ein Problem sein sollte. Einfach die nicht benötigten Teile nicht nutzen.

    Ohne Mozilla schlecht reden zu wollen... wenn Du weniger suchst... vielleicht ist Webkit (http://www.webkit.org) etwas für dich. Das ist tatsächlich eine reine Renderengine (also keine Runtime für Applikationen) für Web-Techniken und gilt als ... nun... ich nenne es mal "übersichtlicher". Aber auch hier kann ich dir nicht sagen wie es genau geht. Und ich befürchte die (offizielle) Dokumentation ist noch spärlicher wie die von Mozilla. Da Webkit auch von Apple und Google in ihren Browsern verwendet wir, findet man vielleicht bei denen entsprechende Dokumentationen.

  • Zitat

    Faktisch Installiert man damit einen Browser mit einer festen Webseite oder XUL-Anwendung.

    Das hört sich aber ähnlich dem an, das ich (umzusetzen) suche. Allerdings stellt sich dabei dann wieder die Frage, wie man das an den Kunden deployed. Wenn man die erzeugte Anwendung kopieren kann, evtl. eine portable app daraus machen kann, dann wäre das womöglich ein interessanter Weg. Aber soweit bin ich noch nicht, es läuft noch nicht (Fehlermeldung:

    Zitat

    Couldn't convert icon to native format. Default icon will be used.

    ... und weiter geht der Vorgang nicht.

    Mittels XPCOM kann ich eine neue Komponente entwickeln, die Interfaces der Gecko engine nutzt. Fragt sich, ob das überhaupt nötig ist, denn ich brauche WENIGER, als Firefox bietet. Es soll keine url eingegeben werden können (das verwaltet die cloud app intern), also die url-leiste muss weg. Statusbar muss weg (die cloud app wird ihre eigene Statusbar haben). Alle Menu-Möglichkeiten müssen weg (die cloud app hat ihre eigenen menues). Keine Tabs, nur ein einziges Brwoser-Window (in dem die Cloud app läuft). Vielleicht gibt es (einfache) Möglichkeiten, über den XULRunner (wie auch immer) den FF auf das nötigste zu REDUZIEREN! Das wäre wohl die eleganteste Lösung. Wie man das macht, weiß ich allerdings noch nicht. Vielleicht geht das in die Richtung, die du wie folgt beschrieben hast

    Zitat

    Einfach die nicht benötigten Teile nicht nutzen

    Zitat

    vielleicht ist Webkit( http://www.webkit.org) etwas für dich

    ich muss zugeben, dass ich parallel zu dieser Anfrage auch bei http://www.das-chrome-forum.de die gleiche Frage gestellt habe. Allerdings gibt es dort keinen bugcatcher :wink: , ich habe noch keine Antwort erhalten. Webkit könnte vielleicht auch deshalb interessant(er) sein, weil die zugehörige Javascript engine besonders schnell sein soll.

  • Das stimmt zwar, dass die Javascript-Engine (sowohl die von Apple als auch die von Google) schneller sind als die vom Firefox. Aber das ist Augenwischerrei. Die haben alle mehr als genug Bumms um heutige Webseiten problemlos und schnell darzustellen. Der Javascript-Speed wird erst interessant, wenn man auf Basis von Javascript anfängt komplizierte und rechenintensive Anwendungen zu entwickeln. Das würde ich nicht unbedingt als Entscheidungskriterium nehmen. Schau, was sich einfacher embedden lässt. Theoretisch sollte auch Prism als Portable funktionieren. Ansonsten bringt Prism auch einen Installer mit.

  • also wenn es schon einen Firefox gibt, könntest du auch sowas verwenden:

    Code
    firefox.exe -no-remote -P "App-Irgendwas" -chrome "file:///C:/Programme/irgendwo/irgendwas.xul"


    die irgendwas.xul könnte im einfachsten Fall so aussehen:

    XML
    <?xml version="1.0" encoding="utf-8" ?>
    <window title="Irgendwas" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
    <browser flex="1" type="content-primary" src="http://irgendwo/" />
    </window>

    Wenn es eine dll sein soll, kenne ich noch diesen Link: http://www.iol.ie/~locka/mozilla/control.htm#download Die Gecko-Version der vorkompilierten dlls dort ist aber ziemlich veraltet. Die mozctlx.dll ist aber wohl auch im XULRunner-SDK enthalten.

  • bugcatcher

    Zitat

    Theoretisch sollte auch Prism als Portable funktionieren. Ansonsten bringt Prism auch einen Installer mit.

    ich probier das mit Prism noch einmal in einem älteren Firefox.

    webkit zu embedden sieht recht einfach aus. Das größte Problem dabei wird sein, die umfangreiche Umgebung aus Entwicklungsumgebung (VC++), Patches, ServicePacks, cygwin + Quellcode soaufzusetzen, dass alles läuft. Das kann schmerzhaft werden, wenn Fehler auftreten. I will see ...

    Dr. Evil
    interessanter Ansatz mit den XULRunner. Das werd' ich mir auch noch genauer ansehen ...

    Zitat

    Wenn es eine dll sein soll, kenne ich noch diesen Link: http://www.iol.ie/~locka/mozilla/control.htm#download.Die Gecko-Version der vorkompilierten dlls dort ist aber ziemlich veraltet.

    richtig. Damit habe ich bisher gearbeit. Ist prinzipiell ne tolle Sache. Ich kann z.B. mit dem IE (embedded) entwickeln und das Programm dann auf den FF patchen. Neueste Techniken (CSS3, HTML5) fliessen dabei aber nicht mehr ein, weil - wie du schon sagst - das ActiveX-Control seit über 3 Jahren nicht mehr gepflegt wird.

  • ich habe beides probiert -> gleiche Fehlermeldung. Aber ich hab' ein paar Virtual Machines mit unterschiedlichen FF Versionen. Dort werd' ich's weiter versuchen.

    Hab noch was interessantes gefunden: https://wiki.mozilla.org/Embedding/NewApi

    Damit kann man offensichtlich embedden ohne sich in XPCOM einarbeiten zu müssen.

    Ausserdem ... beim googeln bin ich auf mehrere Kommentare gestoßen, dass sich webkit nicht in eine MFC-App einbinden läßt. Wer weiß, vielleicht sind diese comments mittlerweile out-of-date (?). All jene Leute haben stattdessen FF/Gecko embedded, notgedrungen wie sie sagen

  • Wie gehabt: hab den Standalone benutzt und weder auf dem Desktop noch auf dem Notebook ein Problem gehabt. Woran das bei dir liegt, kann ich jetzt nicht einschätzen. Dazu kenne ich die vorherrschende Situation zu wenig.

  • ich werde die Sache im Auge behalten und weiter untersuchen. Das ist durchaus eine Alternative zum embedding. Schön wäre es, wenn ich die Größe des "prism"-Fensters bestimmen und fixieren könnte. Vielleicht könntest du mir - als "Frontend-Entwickler" - da noch eine kurze Bemerkung nachschieben (ist vermutlich über Javascript möglich ?)

    Danke
    fran