Table of contents:
- Notifications about new releases / commits
- Changes in API after CEF updates
- Differences between Python 2 and Python 3
- How to enable debug information in examples?
- Remote debugging with Google Chrome instance
- Debugging using various chrome:// protocol uris
- A blank window on Mac/Linux
- Location of CEF framework in Mac apps
- Flash support
- Feature X works in Google Chrome, but doesn't work in CEF Python
- How to capture Audio and Video in HTML5?
- Touch and multi-touch support
- Black or white browser screen
- Python crashes with "Segmentation fault" - how to debug?
- Windows XP support
- Mac 32-bit support
- Security
To be notified of new releases subscribe to this RSS/Atom feed.
Announcements are also made on the Forum. To be notified of these via email set your Membership and Email settings and change delivery preference to Daily summaries.
To be notified on new commits subscribe to this RSS/Atom feed.
CEF Python depends on CEF and API breaks are inevitable when updating to latest CEF. The Migration Guide document lists most notable breaking changes for each release. Full chanelogs can be found on GitHub Releases pages.
Due to unavoidable changes in upstream API it is recommended for your setup
scripts, that for example use PIP to install the cefpython3 package,
to hardcode the cefpython version string. If for example using PIP's
requirements.txt
file then include the cefpython3 package in the
following format if using e.g. cefpython v57.0: cefpython3 == 57.0
.
In Python 2 all cefpython strings are byte strings, but in Python 3 they are all unicode strings. Be aware of this when porting cefpython based apps to Python 3, as it may cause issues.
You can pass "--debug" command line flag to any of CEF Python examples and unit tests. It will also work with your app, as this feature is enabled in CEF Python's core. When this flag is passed the following settings will be set:
settings = {
"debug": True,
"log_severity": cef.LOGSEVERITY_INFO,
"log_file": "debug.log",
}
cef.Initialize(settings=settings)
Now you should see debug information displayed in console like this:
[CEF Python] Initialize() called
[CEF Python] CefExecuteProcess(): exitCode = -1
[CEF Python] CefInitialize()
[CEF Python] App_OnBeforeCommandLineProcessing_BrowserProcess()
[CEF Python] Command line string for the browser process: ...
Remote debugging is enabled by default and is configurable using the ApplicationSettings.remote_debugging_port option. When launching app you can see in console log the random port that was generated:
DevTools listening on ws://127.0.0.1:63967/devtools/browser/c52ad9ad-bf40-47d1-b2d1-be392d536a2b
You can debug remotely in two ways:
-
Debug with CEF devtools. Open the
http://127.0.0.1:port
url (replace port with e.g. 63967 in our case) in a Google Chrome browser. You will see a list of CEF browser instances running which you can debug with DevTools. This way of debugging has the same sets of features as opening DevTools popup viaBrowser.ShowDevTools
method or using the "Show DevTools" option from mouse context menu in a CEF app. CEF DevTools has some limits, not all features of Google Chrome DevTools do work. There is another way to remotely debug that can workaround these limits, see the point 2 below. -
If some features don't work when debugging with CEF devtools you can use dedicated DevTools for Node in Google Chrome browser. For example as of CEF v70 the devtools feature "Save as HAR file" doesn't work, however it works with dedicated DevTools for Node. Follow these steps to use dedicated DevTools for Node with CEF:
- In Google Chrome browser open
chrome://inspect
url and click "Open dedicated DevTools for Node" - Add
localhost:1234
connection and close the popup window - Set
ApplicationSettings.remote_debugging_port
to1234
and run your app - Refresh the
chrome://inspect
page in Google Chrome browser - You should see a new target on the Remote Target list. Click "inspect" link for this target.
- In Google Chrome browser open
The chrome://
protocol uris give you access to various debugging
tools. For example if you encounter GPU issues then after the issue
occured load the chrome://gpu
to see a list of errors.
Here is a list of supported chrome://
protocol uris as of v55.2:
- chrome://accessibility
- chrome://appcache-internals
- chrome://blob-internals
- chrome://credits
- chrome://gpu
- chrome://histograms
- chrome://indexeddb-internals
- chrome://license
- chrome://media-internals
- chrome://net-export
- chrome://net-internals
- chrome://network-error
- chrome://network-errors
- chrome://resources
- chrome://serviceworker-internals
- chrome://system
- chrome://tracing
- chrome://version
- chrome://view-http-cache
- chrome://webrtc-internals
- chrome://webui-hosts
A blank window might appear when your Python does not support GUI applications and this seems to be the case when you're using a custom Python installation. On system Python everything should work just fine.
- On Mac it is required for Python to be build as a framework. See here: https://github.com/pyenv/pyenv/wiki#how-to-build-cpython-with-framework-support-on-os-x
- On Linux it is required for Python to be build as a shared library. See here: https://github.com/pyenv/pyenv/wiki#how-to-build-cpython-with---enable-shared
For a more detailed explanation see this comment by Robin Dunn from the wxPython project: wxWidgets/Phoenix#288 (comment)
This information here is for when creating apps for distribution on Mac.
By default CEF expects that CEF framework is located at
Contents/Frameworks/Chromium Embedded Framework.framework
in the top-level app bundle. If that is not the case then you have
to set ApplicationSettings.framework_dir_path
before calling cef.Initialize().
You may also need to change the structure and embedded paths in CEF framework and in the cefpython module. Here are the default settings:
cefpython_package/
cefpython_py27.so
rpath=@loader_path/
load:@rpath/Chromium Embedded Framework.framework/Chromium Embedded Framework
Chromium Embedded Framework.framework/
Chromium Embedded Framework
id:@rpath/Chromium Embedded Framework.framework/Chromium Embedded Framework
When creating Mac app for distribution you may want to change directory structure, so you might have to change these settings embedded in these libraries. You can do so with these commands:
install_name_tool -rpath old new
install_name_tool -change old new
install_name_tool -id name
To check whether it succeeded run these commands:
otool -l file
otool -L file
See Issue #235 ("Flash support in CEF 51+").
CEF Python embeds Chromium Embedded Framework (CEF) which is based on Chromium browser. Functionality may differ a bit from Google Chrome. The browser from Google is a proprietary software that for example includes MPEG-4/H.264 codecs that aren't included in the open source Chromium. CEF currently doesn't support Chrome Extensions, but basic support for Chrome Extensions is being implemented in upstream CEF as of now.
To see if some feature is working or a bug is fixed in newer CEF release perform the following steps:
- Go to Spotify Automated Builds to download latest CEF for your platform. Choose "Sample Application" binaries.
- Extract the archive and run sample application from the Release/ directory.
To be able to use the getUserMedia() function you need to set the "enable-media-stream" switch. See api/Command line switches document.
In CEF v47 or later touch device is auto-detected and everything should work out of the box. If that's not the case try setting the following switches:
- --touch-events=enabled
- --enable-pinch
See api/Command line switches document.
If you get a black or white screen in the browser view then this may be caused by incompatible GPU (video card) drivers. There are following solutions to this:
-
When CEF Python is updated to a newer CEF/Chromium version then the problem may be disappear. Check with latest Google Chrome if that is the case.
-
Try updating your video card drivers to the latest version available
-
You can disable GPU hardware acceleration by adding the "disable-gpu" and "disable-gpu-compositing" command line switches. See the api/Command Line Switches. Note that this will degrade performance if you're using any advanced 3D features. It will affect 2D accelerated content as well.
Note that when web page uses WebGL then the black screen may still appear even after disabling GPU hardware acceleration. This is normal because GPU was disabled so WebGL cannot work.
Install gdb:
- On Linux type:
sudo apt-get install gdb
- On Mac type:
brew install gdb
and then sign gdb - Additionally on Mac to get a meaningful stack trace with gdb do these steps:
- Install macports and restart terminal
- Type
sudo port install gdb-apple
- Type
sudo codesign -s "gdb-cert" /opt/local/bin/gdb-apple
- Type
/opt/local/bin/gdb-apple python
Run python script using gdb:
gdb python
run tkinter_.py
On segmentation fault to display stack trace type:
bt
On Mac to use lldb:
lldb python
run tkinter_.py
bt
CEF Python v31.2 was the last version to support Windows XP. This is due to Chromium/CEF dropping XP support, last CEF version that supported XP was v49.
On XP you should disable GPU acceleration by using the --disable-gpu and --disable-gpu-compositing switches. These switches must be passed programmatically to cef.Initialize(), see api/Command Line Switches.
CEF Python v31.2 was the last version to support Mac 32-bit. This is due to CEF/Chromium dropping 32-bit support, last CEF version that supported 32-bit was v38.
A quote by Marshall Greenblatt:
CEF offers significant integration capabilities beyond what is offered by a standard Google Chrome browser installation. The trade off for these additional capabilities is that organizations using CEF must take responsibility for their own application security. CEF and the underlying open source projects (Chromium, WebKit, etc) involve a significant amount of code and offer no warranties. Organizations should document and follow best practices to minimize potential security risks. Here are some recommended best practices that organizations can consider:
- Only load known/trusted content. This is by far the best way to avoid potential security issues.
- Disable plugins. This will avoid a large category of security issues caused by buggy versions of Flash, Java, etc.
- Do not explicitly disable or bypass security features in your application. For example, do not enable CefBrowserSettings that bypass security features or add fake headers to bypass HTTP access control.
- Keep your application up to date with the newest CEF release branch. You may want to update the underlying Chromium release version and perform your own builds to take immediate advantage of any bug fixes.
- Enforce good programming practices. Every organization should have best practices for design, testing and verification.
- Audit your application for potential security issues. Every decision that may have security consequences should be evaluated by people who are knowledgeable about security considerations.
Reference: Question on browser security on the CEF Forum.