Embedding/IPCLiteAPI
Contents
- 1 Lite-weight Embedding API for Mozilla based applications with native UI.
- 2 Story
- 3 New embedding expected initialization sequence
- 4 Source code path queue
- 5 BMO Bug 713681(IPC)
- 6 BMO Bug 746800(OMTC)
- 7 Development Build instructions:
- 8 Packaged Build instructions (debian desktop, N9):
- 9 Try, Test, Report, Contribute:
- 10 Pre compiled binaries:
- 11 Run test examples:
- 12 Basic view of new architecture:
Lite-weight Embedding API for Mozilla based applications with native UI.
Basic architecture is very close to WebKit2, and MicroB
Story
Mozilla has bunch of technologies integrated recently:
- OMTC - Off Main thread compositing - keeping Gecko/XPCOM and Compositor in separate threads (Android Firefox)
- IPC - Multiprocess rendering - keeping Gecko/XPCOM and Compositor in separate processes (Firefox OS, Desktop Firefox Plugins)
In order to build Simple browser with native UI (Gtk/Qt/UiKit) similar to Android Firefox with Java UI, some internal API need to be exposed. Goal of this project to provide Generic embedding API which could be easily wrapped without bunch of extra code into Toolkit specific Widgets, and embed these widgets into platform UI applications.
Benefits of new architecture comparing to default mozilla embedding:
* No XUL/XPCOM heavy content in UI process/Thread (Best memory footprint (process case), fast startup) * Process/Thread communication between UI and Content(Gecko/XPCOM) Thread/Process - built on current Mozilla Chromium/IPDL implementation ([https://developer.mozilla.org/en-US/docs/IPDL/Tutorial IPDL Tutorial]) * Rendering based on Shadow/Shadowable layers tree which provide MultiThread/Process responsive rendering (same as content rendering in XUL Mobile FF/OMTC Android Firefox/Firefox OS) * Multi process model provide ability to load memory greedy content in child process and kill it without increasing memory usage for Main UI application process
New embedding expected initialization sequence
1. Native UI startup (android UI thread view or Gtk/Qt/UIKit event loop) 2. Load EmbedLite library and start point API (can be called in parallel thread) LoadEmbedLite(argc, argv);
3. Get EmbedLite application object, which allow to start Gecko in Child-Thread/Process, and create rendering views EmbedLiteApp* embedapp = XRE_GetEmbedLite(); 4. Setup EmbedLite application listener (Some notifications about main app lifecycle) EmbedLiteAppListener[Derived]* listener = new EmbedLiteAppListener[Derived](); embedapp->SetListener(listener); 5. Startup Embedding, blocking call, better to start UI first, and call this in some main loop event EmbedLite will not freeze application here, and continue native events processing along with Chromium Messages. embedapp->Start(EmbedLiteApp::EMBED_THREAD/PROCESS);
Core Embed Initialization example
6. After EmbedLiteAppListener[Derived] received "Initialized" notification, new EmbedLiteView can be created with: EmbedLiteView* view = embedapp->CreateView(); And setup related EmbedLiteViewListener in order to receive notifications from View actions (title,progress,invalidate et.c.) view->SetListener(MyEmbedLiteViewListener); View Embed Initialization example
Communication between UI and content process
* Load remote content JS (privileged script with full access) and interact using MessageMessenger (send/receive JSON messages) * Use embed messaging API (observe broadcast messages) * Build Custom Gecko C++/JS extensions
Source code path queue
BMO Bug 713681(IPC)
BMO Bug 746800(OMTC)
Development Build instructions:
Clone repository with submodules structure
git clone git://github.com/tmeshkova/xulrunner-package.git
Build it with simple script run:
cd xulrunner-package # Pull all latest changes ./pull.all.sh # Not after each pull.all especially after major engine updates it make sense to do rm -f objdir-xxxx-xxx/full_* # Check list of available options ./build.sh -h # Haramttan ./build.sh -t harmattan # Fremantle ./build.sh -t fremantle # Desktop - Qt is default ./build.sh -t desktop # For debug builds add -d argument After build is finished you fill see inline message about how to run test UI You can also export SWRENDER=1 - if your desktop or device does not support HW acceleration
Packaged Build instructions (debian desktop, N9):
Clone repositories
mkdir ~/mozembed cd ~/mozembed # Gecko Engine with EmbedLite API git clone git://github.com/tmeshkova/gecko-dev.git # Embedlite toolkit independent components (History,prompt et.c.) git clone git@github.com:tmeshkova/embedlite-components.git # qtmozembed - Qt wrapper library around EmbedLite API for quick integration into QML. git clone git@github.com:tmeshkova/qtmozembed.git # qmlmozbrowser UI application which works as simple reference UI git clone git@github.com:tmeshkova/qmlmozbrowser.git
Build with dpkg-buildpackage
cd ~/mozembed/mozilla-central dpkg-buildpackage -us -uc -b -nc dpkg -i ../xulrunner*.deb cd ~/mozembed/embedlite-components dpkg-buildpackage -us -uc -b -nc dpkg -i ../embedlite-components*.deb cd ~/mozembed/qtmozembed dpkg-buildpackage -us -uc -b -nc dpkg -i ../libqtmozembed*.deb cd ~/mozembed/qmlmozbrowser dpkg-buildpackage -us -uc -b -nc dpkg -i ../qmlmozbrowser*.deb
- Simple test to check
/usr/lib/xulrunner-21.0a1/embedLiteCoreInitTest
- For development it is better to link xulrunner objdir to system (on desktop or on device with ~/mozembed mounted via NFS)
cd ~/mozembed/mozilla-central ./link_to_system.sh obj-xr-qt /usr # for embedlite-components, qtmozembed, qmlmozbrowser just run ./link_to_system.sh
Finally run test example:
qmlMozEmbedTest -url about:license
Try, Test, Report, Contribute:
Fell free to test it, submit issues to github issue tracker, or even better fork it, fix it, contribute changes via Pull Requests.
Pre compiled binaries:
Mer (ARMv7 hardfp)
http://romaxa.info/mer/mozbuild.tar.gz
Harmattan
http://romaxa.info/mer/mozbuildhm.tar.gz
Qt-Desktop and BeagleBoard Ubuntu
http://romaxa.info/fennec/IPCEmbedding/
Run test examples:
cd obj-*/dist/bin Basic core test ./embedLiteCoreInitTest EmbedLiteAPI wrapped into qt/qml widget Qt only, qml based UI with scrolling and zooming (no clicks): ./qmlMozEmbedTest -url linux.org.ru
Troubleshooting:
- If embedding does not start and libxul.so location differs from what has been used while building QtMozEmbed, then export path to GRE_HOME (path to folder with libxul.so)
ex: export GRE_HOME=/opt/mozilla/xulrunner