diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json
new file mode 100644
index 000000000..b10635fd0
--- /dev/null
+++ b/.vscode/c_cpp_properties.json
@@ -0,0 +1,20 @@
+{
+ "configurations": [
+ {
+ "name": "Win32",
+ "includePath": [
+ "C:/Program Files/Python311/include/**",
+ "${workspaceFolder}/**"
+ ],
+ "defines": [
+ "_DEBUG",
+ "UNICODE",
+ "_UNICODE"
+ ],
+ "windowsSdkVersion": "10.0.22621.0",
+ "cStandard": "c17",
+ "cppStandard": "c++17"
+ }
+ ],
+ "version": 4
+}
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 000000000..ec6c8e6a9
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,117 @@
+{
+ "files.associations": {
+ "memory": "cpp",
+ "__config": "cpp",
+ "cstddef": "cpp",
+ "algorithm": "cpp",
+ "any": "cpp",
+ "array": "cpp",
+ "atomic": "cpp",
+ "bit": "cpp",
+ "bitset": "cpp",
+ "cctype": "cpp",
+ "charconv": "cpp",
+ "chrono": "cpp",
+ "cinttypes": "cpp",
+ "clocale": "cpp",
+ "cmath": "cpp",
+ "codecvt": "cpp",
+ "compare": "cpp",
+ "complex": "cpp",
+ "concepts": "cpp",
+ "condition_variable": "cpp",
+ "coroutine": "cpp",
+ "csignal": "cpp",
+ "cstdarg": "cpp",
+ "cstdint": "cpp",
+ "cstdio": "cpp",
+ "cstdlib": "cpp",
+ "cstring": "cpp",
+ "ctime": "cpp",
+ "cwchar": "cpp",
+ "cwctype": "cpp",
+ "deque": "cpp",
+ "exception": "cpp",
+ "filesystem": "cpp",
+ "format": "cpp",
+ "forward_list": "cpp",
+ "fstream": "cpp",
+ "functional": "cpp",
+ "future": "cpp",
+ "initializer_list": "cpp",
+ "iomanip": "cpp",
+ "ios": "cpp",
+ "iosfwd": "cpp",
+ "iostream": "cpp",
+ "istream": "cpp",
+ "iterator": "cpp",
+ "limits": "cpp",
+ "list": "cpp",
+ "locale": "cpp",
+ "map": "cpp",
+ "memory_resource": "cpp",
+ "mutex": "cpp",
+ "new": "cpp",
+ "numeric": "cpp",
+ "optional": "cpp",
+ "ostream": "cpp",
+ "queue": "cpp",
+ "random": "cpp",
+ "ranges": "cpp",
+ "ratio": "cpp",
+ "regex": "cpp",
+ "scoped_allocator": "cpp",
+ "set": "cpp",
+ "span": "cpp",
+ "sstream": "cpp",
+ "stack": "cpp",
+ "stdexcept": "cpp",
+ "stop_token": "cpp",
+ "streambuf": "cpp",
+ "string": "cpp",
+ "strstream": "cpp",
+ "system_error": "cpp",
+ "thread": "cpp",
+ "tuple": "cpp",
+ "type_traits": "cpp",
+ "typeinfo": "cpp",
+ "unordered_map": "cpp",
+ "unordered_set": "cpp",
+ "utility": "cpp",
+ "valarray": "cpp",
+ "variant": "cpp",
+ "vector": "cpp",
+ "xfacet": "cpp",
+ "xhash": "cpp",
+ "xiosbase": "cpp",
+ "xlocale": "cpp",
+ "xlocbuf": "cpp",
+ "xlocinfo": "cpp",
+ "xlocmes": "cpp",
+ "xlocmon": "cpp",
+ "xlocnum": "cpp",
+ "xloctime": "cpp",
+ "xmemory": "cpp",
+ "xstddef": "cpp",
+ "xstring": "cpp",
+ "xtr1common": "cpp",
+ "xtree": "cpp",
+ "xutility": "cpp",
+ "__bit_reference": "cpp",
+ "__bits": "cpp",
+ "__debug": "cpp",
+ "__errc": "cpp",
+ "__hash_table": "cpp",
+ "__locale": "cpp",
+ "__mutex_base": "cpp",
+ "__node_handle": "cpp",
+ "__split_buffer": "cpp",
+ "__threading_support": "cpp",
+ "__tree": "cpp",
+ "__verbose_abort": "cpp",
+ "propagate_const": "cpp",
+ "string_view": "cpp",
+ "*.tcc": "cpp",
+ "cfenv": "cpp"
+ }
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index e91759715..9d6696607 100644
--- a/README.md
+++ b/README.md
@@ -1,866 +1,766 @@
-# CEF Python
+## CEF Python unofficial
Table of contents:
-* [Introduction](#introduction)
-* [Latest releases sponsored by](#latest-releases-sponsored-by)
- * [Thanks to all sponsors](#thanks-to-all-sponsors)
-* [Install](#install)
-* [Tutorial](#tutorial)
-* [Examples](#examples)
-* [Support](#support)
-* [Releases](#releases)
- * [Next release](#next-release)
- * [Latest release](#latest-release)
- * [v49 release (WinXP/Vista)](#v49-release-winxpvista)
- * [v31 release (old systems)](#v31-release-old-systems)
-* [Support development](#support-development)
- * [Thanks to all](#thanks-to-all)
-* [Seeking new sponsors](#seeking-new-sponsors)
-* [Other READMEs](#other-readmes)
-* [Quick links](#quick-links)
+* [Introduction](#introduction)
+* [Latest releases sponsored by](#latest-releases-sponsored-by)
+ * [Thanks to all sponsors](#thanks-to-all-sponsors)
+* [Install](#install)
+* [Tutorial](#tutorial)
+* [Examples](#examples)
+* [Support](#support)
+* [Releases](#releases)
+ * [Next release](#next-release)
+ * [Latest release](#latest-release)
+ * [v49 release (WinXP/Vista)](#v49-release-winxpvista)
+ * [v31 release (old systems)](#v31-release-old-systems)
+* [Support development](#support-development)
+ * [Thanks to all](#thanks-to-all)
+* [Seeking new sponsors](#seeking-new-sponsors)
+* [Other READMEs](#other-readmes)
+* [Quick links](#quick-links)
## Introduction
-CEF Python is an open source project founded by
-[Czarek Tomczak](https://www.linkedin.com/in/czarektomczak/)
-in 2012 to provide Python bindings for the
-[Chromium Embedded Framework](https://bitbucket.org/chromiumembedded/cef) (CEF).
-The Chromium project focuses mainly on Google Chrome application
-development while CEF focuses on facilitating embedded browser use cases
-in third-party applications. Lots of applications use CEF control, there are
-more than [100 million CEF instances](http://en.wikipedia.org/wiki/Chromium_Embedded_Framework#Applications_using_CEF)
+CEF Python is an open source project founded by
+[Czarek Tomczak](https://www.linkedin.com/in/czarektomczak/)
+in 2012 to provide Python bindings for the
+[Chromium Embedded Framework](https://bitbucket.org/chromiumembedded/cef) (CEF).
+The Chromium project focuses mainly on Google Chrome application
+development while CEF focuses on facilitating embedded browser use cases
+in third-party applications. Lots of applications use CEF control, there are
+more than [100 million CEF instances](http://en.wikipedia.org/wiki/Chromium_Embedded_Framework#Applications_using_CEF)
installed around the world. There are numerous use cases for CEF:
-1. Use it as a modern HTML5 based rendering engine that can act as
- a replacement for classic desktop GUI frameworks. Think of it as Electron
- for Python.
-2. Embed a web browser widget in a classic Qt / GTK / wxPython desktop
- application
-3. Render web content off-screen in applications that use custom drawing
- frameworks
-4. Use it for automated testing of web applications with more advanced
- capabilities than Selenium web browser automation due to CEF low level
- programming APIs
-5. Use it for web scraping, as a web crawler or other kind of internet bots
-
-CEF Python also provides examples of embedding CEF for many Python GUI
-frameworks such as PyQt, wxPython, PyGTK, PyGObject, Tkinter, Kivy, Panda3D,
+1. Use it as a modern HTML5 based rendering engine that can act as
+ a replacement for classic desktop GUI frameworks. Think of it as Electron
+ for Python.
+2. Embed a web browser widget in a classic Qt / GTK / wxPython desktop
+ application
+3. Render web content off-screen in applications that use custom drawing
+ frameworks
+4. Use it for automated testing of web applications with more advanced
+ capabilities than Selenium web browser automation due to CEF low level
+ programming APIs
+5. Use it for web scraping, as a web crawler or other kind of internet bots
+
+CEF Python also provides examples of embedding CEF for many Python GUI
+frameworks such as PyQt, wxPython, PyGTK, PyGObject, Tkinter, Kivy, Panda3D,
PyGame, PyOpenGL, PyWin32, PySide and PySDL2.
-
## Latest releases sponsored by
-
-|
-
-
-
-
-
-
-
-Thank you to Fivestars for sponsoring the [v66.1 release](../../releases/tag/v66.1)
-with Python 3.8 / 3.9 support. Fivestars helps local communities thrive by empowering
-small businesses with cutting edge marketing technology. Please visit their website:
-Fivestars.com
-
- |
-
-
-
-
-
-
-
-Thank you to Lampix for sponsoring the
-[v66 release](../../releases/tag/v66.0). Lampix is the first hardware
-and software solution that turns any surface into a smart, augmented reality
-or interactive surface. Please visit their website:
-Lampix.com
-
- |
+
Thank you to Fivestars for sponsoring the v66.1 release with Python 3.8 / 3.9 support. Fivestars helps local communities thrive by empowering small businesses with cutting edge marketing technology. Please visit their website: Fivestars.com | 
Thank you to Lampix for sponsoring the v66 release. Lampix is the first hardware and software solution that turns any surface into a smart, augmented reality or interactive surface. Please visit their website: Lampix.com |
### Thanks to all sponsors
-
-
- |
-
- |
-
-
- |
-
-
- |
-
-
- |
- |
-
-
- |
-
-
- |
-
-
-
+
## Install
-You can install [pypi/cefpython3](https://pypi.python.org/pypi/cefpython3)
-package using pip tool. On Linux pip 8.1+ is required. You can
-also download packages for offline installation available on the
+You can install [pypi/cefpython3](https://pypi.python.org/pypi/cefpython3)\-unoffi
+package using pip tool. On Linux pip 8.1+ is required. You can
+also download packages for offline installation available on the
[GitHub Releases](../../releases) pages. Command to install with pip:
-```
-pip install cefpython3==66.0
-```
-
+pip install cefpython3-unofficial==66.1
## Tutorial
See the [Tutorial.md](docs/Tutorial.md) document.
-
## Examples
-See the [README-examples.md](examples/README-examples.md) and
+See the [README-examples.md](examples/README-examples.md) and
[README-snippets.md](examples/snippets/README-snippets.md) documents.
-
## Support
-- Ask questions and report problems on the
- [Forum](https://groups.google.com/group/cefpython)
-- Supported examples are listed in the
- [README-examples.md](examples/README-examples.md) file
-- Documentation is in the [docs/](docs) directory:
- - [Build instructions](docs/Build-instructions.md)
- - [Contributing code](docs/Contributing-code.md)
- - [Knowledge Base](docs/Knowledge-Base.md)
- - [Migration guide](docs/Migration-guide.md)
- - [Tutorial](docs/Tutorial.md)
-- API reference is in the [api/](api) directory:
- - [API categories](api/API-categories.md#api-categories)
- - [API index](api/API-index.md#api-index)
-- Additional documentation is available in
- [Issues labelled Knowledge Base](../../issues?q=is%3Aissue+is%3Aopen+label%3A%22Knowledge+Base%22)
-- To search documentation use GitHub "This repository" search
- at the top. To narrow results to documentation only select
- "Markdown" in the right pane.
-- You can vote on issues in the tracker to let us know which issues are
- important to you. To do that add a +1 thumb up reaction to the first post
- in the issue. See
- [Most popular issues](../../issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc)
- sorted by reactions.
-
+* Ask questions and report problems on the
+ [Forum](https://groups.google.com/group/cefpython)
+* Supported examples are listed in the
+ [README-examples.md](examples/README-examples.md) file
+* Documentation is in the [docs/](docs) directory:
+ * [Build instructions](docs/Build-instructions.md)
+ * [Contributing code](docs/Contributing-code.md)
+ * [Knowledge Base](docs/Knowledge-Base.md)
+ * [Migration guide](docs/Migration-guide.md)
+ * [Tutorial](docs/Tutorial.md)
+* API reference is in the [api/](api) directory:
+ * [API categories](api/API-categories.md#api-categories)
+ * [API index](api/API-index.md#api-index)
+* Additional documentation is available in
+ [Issues labelled Knowledge Base](../../issues?q=is%3Aissue+is%3Aopen+label%3A%22Knowledge+Base%22)
+* To search documentation use GitHub "This repository" search
+ at the top. To narrow results to documentation only select
+ "Markdown" in the right pane.
+* You can vote on issues in the tracker to let us know which issues are
+ important to you. To do that add a +1 thumb up reaction to the first post
+ in the issue. See
+ [Most popular issues](../../issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc)
+ sorted by reactions.
## Releases
-Information on planned new and current releases, supported platforms,
-python versions, architectures and requirements. If you want to
+Information on planned new and current releases, supported platforms,
+python versions, architectures and requirements. If you want to
support old operating systems then choose the v31 release.
### Next release
-- To see planned new features or bugs to be fixed in the near future in one of
- next releases, see the
- [next release](../../issues?q=is%3Aissue+is%3Aopen+label%3A%22next+release%22)
- label in the tracker
-- To see planned new features or bugs to be fixed in further future, see the
- [next release 2](../../issues?q=is%3Aissue+is%3Aopen+label%3A%22next+release+2%22)
- label in the tracker
+* To see planned new features or bugs to be fixed in the near future in one of
+ next releases, see the
+ [next release](../../issues?q=is%3Aissue+is%3Aopen+label%3A%22next+release%22)
+ label in the tracker
+* To see planned new features or bugs to be fixed in further future, see the
+ [next release 2](../../issues?q=is%3Aissue+is%3Aopen+label%3A%22next+release+2%22)
+ label in the tracker
### Latest release
-OS | Py2 | Py3 | 32bit | 64bit | Requirements
---- | --- | --- | --- | --- | ---
-Windows | 2.7 | 3.4 / 3.5 / 3.6 / 3.7 / 3.8 / 3.9 | Yes | Yes | Windows 7+ (Note that Python 3.9 supports Windows 8.1+)
-Linux | 2.7 | 3.4 / 3.5 / 3.6 / 3.7 | Yes | Yes | Debian 8+, Ubuntu 14.04+,
Fedora 24+, openSUSE 13.3+
-Mac | 2.7 | 3.4 / 3.5 / 3.6 / 3.7 | No | Yes | MacOS 10.9+
+| OS | Py2 | Py3 | 32bit | 64bit | Requirements |
+| --- | --- | --- | --- | --- | --- |
+| Windows | 2.7 | 3.4 / 3.5 / 3.6 / 3.7 / 3.8 / 3.9 | Yes | Yes | Windows 7+ (Note that Python 3.9 supports Windows 8.1+) |
+| Linux | 2.7 | 3.4 / 3.5 / 3.6 / 3.7 | Yes | Yes | Debian 8+, Ubuntu 14.04+,
+Fedora 24+, openSUSE 13.3+ |
+| Mac | 2.7 | 3.4 / 3.5 / 3.6 / 3.7 / 3.8 / 3.9 | No | Yes | MacOS 10.9+ |
These platforms are not supported yet:
-- ARM - see [Issue #267](../../issues/267)
-- Android - see [Issue #307](../../issues/307)
+* ARM - see [Issue #267](../../issues/267)
+* Android - see [Issue #307](../../issues/307)
### v49 release (WinXP/Vista)
-OS | Py2 | Py3 | 32bit | 64bit | Requirements
---- | --- | --- | --- | --- | ---
-Windows | 2.7 | 3.4 | Yes | Yes | Windows XP+
-
-- Install with command: `pip --no-cache-dir install cefpython3==49.0`.
- - Please note that if you were previously installing cefpython3
- package it is required to use the `--no-cache-dir` flag,
- otherwise pip will end up with error message
- `No matching distribution found for cefpython3==49.0`.
- This happens because 49.0 release occured after 57.0 and 66.0
- releases.
-- Downloads are available on GitHub Releases tagged
+| OS | Py2 | Py3 | 32bit | 64bit | Requirements |
+| --- | --- | --- | --- | --- | --- |
+| Windows | 2.7 | 3.4 | Yes | Yes | Windows XP+ |
+
+* Install with command: pip --no-cache-dir install cefpython3==49.0.
+ * Please note that if you were previously installing cefpython3
+ package it is required to use the --no-cache-dir flag,
+ otherwise pip will end up with error message
+ No matching distribution found for cefpython3==49.0.
+ This happens because 49.0 release occured after 57.0 and 66.0
+ releases.
+* Downloads are available on GitHub Releases tagged
[v49.0](../../releases/tag/v49.0).
-- See [Migration guide](docs/Migration-guide.md) document for changes
- in this release
-- Documentation is available in the [docs/](../../tree/cefpython49-winxp/docs)
- directory in the `cefpython49-winxp` branch
-- API reference is available in the [api/](../../tree/cefpython49-winxp/api)
- directory in the `cefpython49-winxp` branch
-
+* See [Migration guide](docs/Migration-guide.md) document for changes
+ in this release
+* Documentation is available in the [docs/](../../tree/cefpython49-winxp/docs)
+ directory in the cefpython49-winxp branch
+* API reference is available in the [api/](../../tree/cefpython49-winxp/api)
+ directory in the cefpython49-winxp branch
### v31 release (old systems)
-OS | Py2 | Py3 | 32bit | 64bit | Requirements
---- | --- | --- | --- | --- | ---
-Windows | 2.7 | No | Yes | Yes | Windows XP+
-Linux | 2.7 | No | Yes | Yes | Debian 7+ / Ubuntu 12.04+
-Mac | 2.7 | No | Yes | Yes | MacOS 10.7+
+| OS | Py2 | Py3 | 32bit | 64bit | Requirements |
+| --- | --- | --- | --- | --- | --- |
+| Windows | 2.7 | No | Yes | Yes | Windows XP+ |
+| Linux | 2.7 | No | Yes | Yes | Debian 7+ / Ubuntu 12.04+ |
+| Mac | 2.7 | No | Yes | Yes | MacOS 10.7+ |
Additional information for v31.2 release:
-- On Windows/Mac you can install with command: `pip install cefpython3==31.2`
-- Downloads are available on the GitHub Releases page tagged
- [v31.2](../../releases/tag/v31.2).
-- API reference is available in revision [169a1b2](../../tree/169a1b20d3cd09879070d41aab28cfa195d2a7d5/docs/api)
-- Other documentation can be downloaded by cloning the
- cefpython.wiki repository: `git clone git@github.com:cztomczak/cefpython.wiki.git`
+* On Windows/Mac you can install with command: pip install cefpython3==31.2
+* Downloads are available on the GitHub Releases page tagged
+ [v31.2](../../releases/tag/v31.2).
+* API reference is available in revision [169a1b2](../../tree/169a1b20d3cd09879070d41aab28cfa195d2a7d5/docs/api)
+* Other documentation can be downloaded by cloning the
+ cefpython.wiki repository: git clone git@github.com:cztomczak/cefpython.wiki.git
## Support development
-If you would like to support general CEF Python development efforts
-by making a donation then please click the Paypal Donate button below.
-If you would like to see a specific feature implemented then you can make
-a comment about that when making a donation and that will give it a higher
+If you would like to support general CEF Python development efforts
+by making a donation then please click the Paypal Donate button below.
+If you would like to see a specific feature implemented then you can make
+a comment about that when making a donation and that will give it a higher
priority.
-
-
-
-
+
+
+
### Thanks to all
-* [2021] Thank you to [Fivestars](https://www.fivestars.com/) for sponsoring
- the v66.1 release with Python 3.8 / 3.9 support
-* [2018] Thanks to [Fivestars](https://www.fivestars.com/) for sponsoring
- the v49 release for legacy systems (WinXP/Vista)
-* [2018] Many thanks to [Lampix](https://lampix.com/) for sponsoring the v66
- release for all platforms
-* [2017] Many thanks to [HighSide Inc.](https://highside.io/) for sponsoring
- the v55/v56 releases for all platforms
-* [2016-2018] Thanks to JetBrains for providing an Open Source license for
- [PyCharm](https://www.jetbrains.com/pycharm/)
-* [2014] Thanks to Adam Duston for donating a Macbook to aid the development
- of Mac port
-* [2013-2015] Lots of thanks goes to [Cyan Inc.](http://www.blueplanet.com/)
- for sponsoring this project for a long time, making CEF Python 3 mature
-* [2013] Thanks to [Rentouch GmbH](http://www.rentouch.ch/) for sponsoring the
- development of the off-screen rendering support
-* [2013] Thanks to Thomas Wusatiuk for sponsoring the development of the web
- response reading features
-* [2012-2018] Thanks to those who have made a Paypal donation:
- [Rentouch GmbH](http://www.rentouch.ch/), Walter Purvis, Rokas Stupuras,
- Alex Rattray, Greg Kacy, Paul Korzhyk, Tomasz Tomanek.
-* [2012-2017] Thanks to those who have donated their time through code
- contributions, they are listed in the [Authors](Authors) file
-
+* \[2021\] Thank you to [Fivestars](https://www.fivestars.com/) for sponsoring
+ the v66.1 release with Python 3.8 / 3.9 support
+* \[2018\] Thanks to [Fivestars](https://www.fivestars.com/) for sponsoring
+ the v49 release for legacy systems (WinXP/Vista)
+* \[2018\] Many thanks to [Lampix](https://lampix.com/) for sponsoring the v66
+ release for all platforms
+* \[2017\] Many thanks to [HighSide Inc.](https://highside.io/) for sponsoring
+ the v55/v56 releases for all platforms
+* \[2016-2018\] Thanks to JetBrains for providing an Open Source license for
+ [PyCharm](https://www.jetbrains.com/pycharm/)
+* \[2014\] Thanks to Adam Duston for donating a Macbook to aid the development
+ of Mac port
+* \[2013-2015\] Lots of thanks goes to [Cyan Inc.](http://www.blueplanet.com/)
+ for sponsoring this project for a long time, making CEF Python 3 mature
+* \[2013\] Thanks to [Rentouch GmbH](http://www.rentouch.ch/) for sponsoring the
+ development of the off-screen rendering support
+* \[2013\] Thanks to Thomas Wusatiuk for sponsoring the development of the web
+ response reading features
+* \[2012-2018\] Thanks to those who have made a Paypal donation:
+ [Rentouch GmbH](http://www.rentouch.ch/), Walter Purvis, Rokas Stupuras,
+ Alex Rattray, Greg Kacy, Paul Korzhyk, Tomasz Tomanek.
+* \[2012-2017\] Thanks to those who have donated their time through code
+ contributions, they are listed in the [Authors](Authors) file
## Seeking new sponsors
-CEF Python is seeking companies to sponsor further development of the project.
-There are many proposals for new features submitted in the issue tracker. Most
+CEF Python is seeking companies to sponsor further development of the project.
+There are many proposals for new features submitted in the issue tracker. Most
notable are:
-* Monthly releases with latest Chromium
-* An automated build system similar to upstream CEF Spotify Automated Builds
-* ARM and Android support
-* Multi-threaded support for increased performance
-* Proprietary codecs support in build tools: H264, H265,AC3, EAC3, MPEG-4
-* More CEF API exposed, only about 50% is exposed so far
-* Hundreds of new settings and Chromium preferences not yet exposed
-* Easier integration with popular GUI toolkits in just a few lines of code
- and support for more third party GUI frameworks
-* More examples of implementing various advanced features and more snippets
- as well
-
-If your company would like to sponsor CEF Python development efforts then
-please contact
-[Czarek](https://www.linkedin.com/in/czarektomczak/).
-Long term sponsorships are welcome and Czarek is open to ideas about
-the project. He would love to spend more time on developing this project,
-but he can't afford doing so in his free time. Currently there is no company
+* Monthly releases with latest Chromium
+* An automated build system similar to upstream CEF Spotify Automated Builds
+* ARM and Android support
+* Multi-threaded support for increased performance
+* Proprietary codecs support in build tools: H264, H265,AC3, EAC3, MPEG-4
+* More CEF API exposed, only about 50% is exposed so far
+* Hundreds of new settings and Chromium preferences not yet exposed
+* Easier integration with popular GUI toolkits in just a few lines of code
+ and support for more third party GUI frameworks
+* More examples of implementing various advanced features and more snippets
+ as well
+
+If your company would like to sponsor CEF Python development efforts then
+please contact
+[Czarek](https://www.linkedin.com/in/czarektomczak/).
+Long term sponsorships are welcome and Czarek is open to ideas about
+the project. He would love to spend more time on developing this project,
+but he can't afford doing so in his free time. Currently there is no company
supporting this project actively on a daily basis.
-
## Other READMEs
-- [PyInstaller packager](examples/pyinstaller/README-pyinstaller.md)
-
-
+* [PyInstaller packager](examples/pyinstaller/README-pyinstaller.md)
## Quick links
### Docs
-- [Build instructions](docs/Build-instructions.md)
-- [Knowledge Base](docs/Knowledge-Base.md)
-- [Migration guide](docs/Migration-guide.md)
-- [Tutorial](docs/Tutorial.md)
-
+* [Build instructions](docs/Build-instructions.md)
+* [Knowledge Base](docs/Knowledge-Base.md)
+* [Migration guide](docs/Migration-guide.md)
+* [Tutorial](docs/Tutorial.md)
### API categories
#### Modules
- * [cefpython](api/cefpython.md#cefpython) module
-
+* [cefpython](api/cefpython.md#cefpython) module
#### Settings
- * [ApplicationSettings](api/ApplicationSettings.md#application-settings) dictionary
- * [BrowserSettings](api/BrowserSettings.md#browser-settings) dictionary
- * [CommandLineSwitches](api/CommandLineSwitches.md#command-line-switches) dictionary
-
+* [ApplicationSettings](api/ApplicationSettings.md#application-settings) dictionary
+* [BrowserSettings](api/BrowserSettings.md#browser-settings) dictionary
+* [CommandLineSwitches](api/CommandLineSwitches.md#command-line-switches) dictionary
#### Classes and objects
- * [Browser](api/Browser.md#browser-object) object
- * [Callback](api/Callback.md#callback-object) object
- * [Cookie](api/Cookie.md#cookie-class) class
- * [CookieManager](api/CookieManager.md#cookiemanager-class) class
- * [DpiAware](api/DpiAware.md#dpiaware-class) class (Win)
- * [DragData](api/DragData.md#dragdata-object) object
- * [Frame](api/Frame.md#frame-object) object
- * [Image](api/Image.md#image-object) object
- * [JavascriptBindings](api/JavascriptBindings.md#javascriptbindings-class) class
- * [JavascriptCallback](api/JavascriptCallback.md#javascriptcallback-object) object
- * [PaintBuffer](api/PaintBuffer.md#paintbuffer-object) object
- * [Request](api/Request.md#request-class) class
- * [Response](api/Response.md#response-object) object
- * [WebPluginInfo](api/WebPluginInfo.md#webplugininfo-object) object
- * [WebRequest](api/WebRequest.md#webrequest-class) class
- * [WindowInfo](api/WindowInfo.md#windowinfo-class) class
- * [WindowUtils](api/WindowUtils.md#windowutils-class) class
-
+* [Browser](api/Browser.md#browser-object) object
+* [Callback](api/Callback.md#callback-object) object
+* [Cookie](api/Cookie.md#cookie-class) class
+* [CookieManager](api/CookieManager.md#cookiemanager-class) class
+* [DpiAware](api/DpiAware.md#dpiaware-class) class (Win)
+* [DragData](api/DragData.md#dragdata-object) object
+* [Frame](api/Frame.md#frame-object) object
+* [Image](api/Image.md#image-object) object
+* [JavascriptBindings](api/JavascriptBindings.md#javascriptbindings-class) class
+* [JavascriptCallback](api/JavascriptCallback.md#javascriptcallback-object) object
+* [PaintBuffer](api/PaintBuffer.md#paintbuffer-object) object
+* [Request](api/Request.md#request-class) class
+* [Response](api/Response.md#response-object) object
+* [WebPluginInfo](api/WebPluginInfo.md#webplugininfo-object) object
+* [WebRequest](api/WebRequest.md#webrequest-class) class
+* [WindowInfo](api/WindowInfo.md#windowinfo-class) class
+* [WindowUtils](api/WindowUtils.md#windowutils-class) class
#### Client handlers (interfaces)
- * [AccessibilityHandler](api/AccessibilityHandler.md#accessibilityhandler-interface)
- * [DisplayHandler](api/DisplayHandler.md#displayhandler-interface)
- * [DownloadHandler](api/DownloadHandler.md#downloadhandler)
- * [FocusHandler](api/FocusHandler.md#focushandler-interface)
- * [JavascriptDialogHandler](api/JavascriptDialogHandler.md#javascriptdialoghandler-interface)
- * [KeyboardHandler](api/KeyboardHandler.md#keyboardhandler-interface)
- * [LifespanHandler](api/LifespanHandler.md#lifespanhandler-interface)
- * [LoadHandler](api/LoadHandler.md#loadhandler-interface)
- * [RenderHandler](api/RenderHandler.md#renderhandler-interface)
- * [RequestHandler](api/RequestHandler.md#requesthandler-interface)
- * [ResourceHandler](api/ResourceHandler.md#resourcehandler-interface)
- * [V8ContextHandler](api/V8ContextHandler.md#v8contexthandler-interface)
-
+* [AccessibilityHandler](api/AccessibilityHandler.md#accessibilityhandler-interface)
+* [DisplayHandler](api/DisplayHandler.md#displayhandler-interface)
+* [DownloadHandler](api/DownloadHandler.md#downloadhandler)
+* [FocusHandler](api/FocusHandler.md#focushandler-interface)
+* [JavascriptDialogHandler](api/JavascriptDialogHandler.md#javascriptdialoghandler-interface)
+* [KeyboardHandler](api/KeyboardHandler.md#keyboardhandler-interface)
+* [LifespanHandler](api/LifespanHandler.md#lifespanhandler-interface)
+* [LoadHandler](api/LoadHandler.md#loadhandler-interface)
+* [RenderHandler](api/RenderHandler.md#renderhandler-interface)
+* [RequestHandler](api/RequestHandler.md#requesthandler-interface)
+* [ResourceHandler](api/ResourceHandler.md#resourcehandler-interface)
+* [V8ContextHandler](api/V8ContextHandler.md#v8contexthandler-interface)
#### Other interfaces
- * [CookieVisitor](api/CookieVisitor.md#cookievisitor-interface) interface
- * [StringVisitor](api/StringVisitor.md#stringvisitor-interface) interface
- * [WebRequestClient](api/WebRequestClient.md#webrequestclient-interface) interface
-
+* [CookieVisitor](api/CookieVisitor.md#cookievisitor-interface) interface
+* [StringVisitor](api/StringVisitor.md#stringvisitor-interface) interface
+* [WebRequestClient](api/WebRequestClient.md#webrequestclient-interface) interface
### API index
-* [AccessibilityHandler (interface)](api/AccessibilityHandler.md#accessibilityhandler-interface)
- * [_OnAccessibilityTreeChange](api/AccessibilityHandler.md#_onaccessibilitytreechange)
- * [_OnAccessibilityLocationChange](api/AccessibilityHandler.md#_onaccessibilitylocationchange)
-* [Application settings](api/ApplicationSettings.md#application-settings)
- * [accept_language_list](api/ApplicationSettings.md#accept_language_list)
- * [app_user_model_id](api/ApplicationSettings.md#app_user_model_id)
- * [auto_zooming](api/ApplicationSettings.md#auto_zooming)
- * [background_color](api/ApplicationSettings.md#background_color)
- * [browser_subprocess_path](api/ApplicationSettings.md#browser_subprocess_path)
- * [cache_path](api/ApplicationSettings.md#cache_path)
- * [command_line_args_disabled](api/ApplicationSettings.md#command_line_args_disabled)
- * [context_menu](api/ApplicationSettings.md#context_menu)
- * [downloads_enabled](api/ApplicationSettings.md#downloads_enabled)
- * [external_message_pump](api/ApplicationSettings.md#external_message_pump)
- * [framework_dir_path](api/ApplicationSettings.md#framework_dir_path)
- * [ignore_certificate_errors](api/ApplicationSettings.md#ignore_certificate_errors)
- * [javascript_flags](api/ApplicationSettings.md#javascript_flags)
- * [locale](api/ApplicationSettings.md#locale)
- * [locales_dir_path](api/ApplicationSettings.md#locales_dir_path)
- * [debug](api/ApplicationSettings.md#debug)
- * [log_file](api/ApplicationSettings.md#log_file)
- * [log_severity](api/ApplicationSettings.md#log_severity)
- * [multi_threaded_message_loop](api/ApplicationSettings.md#multi_threaded_message_loop)
- * [net_security_expiration_enabled](api/ApplicationSettings.md#net_security_expiration_enabled)
- * [pack_loading_disabled](api/ApplicationSettings.md#pack_loading_disabled)
- * [persist_session_cookies](api/ApplicationSettings.md#persist_session_cookies)
- * [persist_user_preferences](api/ApplicationSettings.md#persist_user_preferences)
- * [product_version](api/ApplicationSettings.md#product_version)
- * [remote_debugging_port](api/ApplicationSettings.md#remote_debugging_port)
- * [resources_dir_path](api/ApplicationSettings.md#resources_dir_path)
- * [single_process](api/ApplicationSettings.md#single_process)
- * [string_encoding](api/ApplicationSettings.md#string_encoding)
- * [uncaught_exception_stack_size](api/ApplicationSettings.md#uncaught_exception_stack_size)
- * [unique_request_context_per_browser](api/ApplicationSettings.md#unique_request_context_per_browser)
- * [user_agent](api/ApplicationSettings.md#user_agent)
- * [user_data_path](api/ApplicationSettings.md#user_data_path)
- * [windowless_rendering_enabled](api/ApplicationSettings.md#windowless_rendering_enabled)
-* [Browser (object)](api/Browser.md#browser-object)
- * [AddWordToDictionary](api/Browser.md#addwordtodictionary)
- * [CanGoBack](api/Browser.md#cangoback)
- * [CanGoForward](api/Browser.md#cangoforward)
- * [CloseBrowser](api/Browser.md#closebrowser)
- * [CloseDevTools](api/Browser.md#closedevtools)
- * [DragTargetDragEnter](api/Browser.md#dragtargetdragenter)
- * [DragTargetDragOver](api/Browser.md#dragtargetdragover)
- * [DragTargetDragLeave](api/Browser.md#dragtargetdragleave)
- * [DragTargetDrop](api/Browser.md#dragtargetdrop)
- * [DragSourceEndedAt](api/Browser.md#dragsourceendedat)
- * [DragSourceSystemDragEnded](api/Browser.md#dragsourcesystemdragended)
- * [ExecuteFunction](api/Browser.md#executefunction)
- * [ExecuteJavascript](api/Browser.md#executejavascript)
- * [Find](api/Browser.md#find)
- * [GetClientCallback](api/Browser.md#getclientcallback)
- * [GetClientCallbacksDict](api/Browser.md#getclientcallbacksdict)
- * [GetFocusedFrame](api/Browser.md#getfocusedframe)
- * [GetFrame](api/Browser.md#getframe)
- * [GetFrameByIdentifier](api/Browser.md#getframebyidentifier)
- * [GetFrames](api/Browser.md#getframes)
- * [GetFrameCount](api/Browser.md#getframecount)
- * [GetFrameIdentifiers](api/Browser.md#getframeidentifiers)
- * [GetFrameNames](api/Browser.md#getframenames)
- * [GetImage](api/Browser.md#getimage)
- * [GetJavascriptBindings](api/Browser.md#getjavascriptbindings)
- * [GetMainFrame](api/Browser.md#getmainframe)
- * [GetNSTextInputContext](api/Browser.md#getnstextinputcontext)
- * [GetOpenerWindowHandle](api/Browser.md#getopenerwindowhandle)
- * [GetOuterWindowHandle](api/Browser.md#getouterwindowhandle)
- * [GetSetting](api/Browser.md#getsetting)
- * [GetUrl](api/Browser.md#geturl)
- * [GetUserData](api/Browser.md#getuserdata)
- * [GetWindowHandle](api/Browser.md#getwindowhandle)
- * [GetIdentifier](api/Browser.md#getidentifier)
- * [GetZoomLevel](api/Browser.md#getzoomlevel)
- * [GoBack](api/Browser.md#goback)
- * [GoForward](api/Browser.md#goforward)
- * [HandleKeyEventAfterTextInputClient](api/Browser.md#handlekeyeventaftertextinputclient)
- * [HandleKeyEventBeforeTextInputClient](api/Browser.md#handlekeyeventbeforetextinputclient)
- * [HasDevTools](api/Browser.md#hasdevtools)
- * [HasDocument](api/Browser.md#hasdocument)
- * [Invalidate](api/Browser.md#invalidate)
- * [IsFullscreen](api/Browser.md#isfullscreen)
- * [IsLoading](api/Browser.md#isloading)
- * [IsMouseCursorChangeDisabled](api/Browser.md#ismousecursorchangedisabled)
- * [IsPopup](api/Browser.md#ispopup)
- * [IsWindowRenderingDisabled](api/Browser.md#iswindowrenderingdisabled)
- * [LoadUrl](api/Browser.md#loadurl)
- * [Navigate](api/Browser.md#navigate)
- * [NotifyMoveOrResizeStarted](api/Browser.md#notifymoveorresizestarted)
- * [NotifyScreenInfoChanged](api/Browser.md#notifyscreeninfochanged)
- * [ParentWindowWillClose](api/Browser.md#parentwindowwillclose)
- * [Print](api/Browser.md#print)
- * [Reload](api/Browser.md#reload)
- * [ReloadIgnoreCache](api/Browser.md#reloadignorecache)
- * [ReplaceMisspelling](api/Browser.md#replacemisspelling)
- * [SetAutoResizeEnabled](api/Browser.md#setautoresizeenabled)
- * [SetBounds](api/Browser.md#setbounds)
- * [SendKeyEvent](api/Browser.md#sendkeyevent)
- * [SendMouseClickEvent](api/Browser.md#sendmouseclickevent)
- * [SendMouseMoveEvent](api/Browser.md#sendmousemoveevent)
- * [SendMouseWheelEvent](api/Browser.md#sendmousewheelevent)
- * [SendFocusEvent](api/Browser.md#sendfocusevent)
- * [SendCaptureLostEvent](api/Browser.md#sendcapturelostevent)
- * [SetAccessibilityState](api/Browser.md#setaccessibilitystate)
- * [SetClientCallback](api/Browser.md#setclientcallback)
- * [SetClientHandler](api/Browser.md#setclienthandler)
- * [SetFocus](api/Browser.md#setfocus)
- * [SetMouseCursorChangeDisabled](api/Browser.md#setmousecursorchangedisabled)
- * [SetJavascriptBindings](api/Browser.md#setjavascriptbindings)
- * [SetUserData](api/Browser.md#setuserdata)
- * [SetZoomLevel](api/Browser.md#setzoomlevel)
- * [ShowDevTools](api/Browser.md#showdevtools)
- * [StartDownload](api/Browser.md#startdownload)
- * [StopLoad](api/Browser.md#stopload)
- * [StopFinding](api/Browser.md#stopfinding)
- * [ToggleFullscreen](api/Browser.md#togglefullscreen)
- * [TryCloseBrowser](api/Browser.md#tryclosebrowser)
- * [WasResized](api/Browser.md#wasresized)
- * [WasHidden](api/Browser.md#washidden)
-* [Browser settings](api/BrowserSettings.md#browser-settings)
- * [Font settings](api/BrowserSettings.md#font-settings)
- * [accept_language_list](api/BrowserSettings.md#accept_language_list)
- * [application_cache_disabled](api/BrowserSettings.md#application_cache_disabled)
- * [background_color](api/BrowserSettings.md#background_color)
- * [databases_disabled](api/BrowserSettings.md#databases_disabled)
- * [default_encoding](api/BrowserSettings.md#default_encoding)
- * [dom_paste_disabled](api/BrowserSettings.md#dom_paste_disabled)
- * [file_access_from_file_urls_allowed](api/BrowserSettings.md#file_access_from_file_urls_allowed)
- * [inherit_client_handlers_for_popups](api/BrowserSettings.md#inherit_client_handlers_for_popups)
- * [image_load_disabled](api/BrowserSettings.md#image_load_disabled)
- * [javascript_disabled](api/BrowserSettings.md#javascript_disabled)
- * [javascript_close_windows_disallowed](api/BrowserSettings.md#javascript_close_windows_disallowed)
- * [javascript_access_clipboard_disallowed](api/BrowserSettings.md#javascript_access_clipboard_disallowed)
- * [local_storage_disabled](api/BrowserSettings.md#local_storage_disabled)
- * [plugins_disabled](api/BrowserSettings.md#plugins_disabled)
- * [remote_fonts](api/BrowserSettings.md#remote_fonts)
- * [shrink_standalone_images_to_fit](api/BrowserSettings.md#shrink_standalone_images_to_fit)
- * [tab_to_links_disabled](api/BrowserSettings.md#tab_to_links_disabled)
- * [text_area_resize_disabled](api/BrowserSettings.md#text_area_resize_disabled)
- * [universal_access_from_file_urls_allowed](api/BrowserSettings.md#universal_access_from_file_urls_allowed)
- * [user_style_sheet_location](api/BrowserSettings.md#user_style_sheet_location)
- * [web_security_disabled](api/BrowserSettings.md#web_security_disabled)
- * [webgl_disabled](api/BrowserSettings.md#webgl_disabled)
- * [windowless_frame_rate](api/BrowserSettings.md#windowless_frame_rate)
-* [Callback (object)](api/Callback.md#callback-object)
- * [Continue](api/Callback.md#continue)
- * [Cancel](api/Callback.md#cancel)
-* [cefpython](api/cefpython.md#cefpython)
- * [CreateBrowser](api/cefpython.md#createbrowser)
- * [CreateBrowserSync](api/cefpython.md#createbrowsersync)
- * [ExceptHook](api/cefpython.md#excepthook)
- * [GetAppSetting](api/cefpython.md#getappsetting)
- * [GetAppPath](api/cefpython.md#getapppath)
- * [GetBrowserByIdentifier](api/cefpython.md#getbrowserbyidentifier)
- * [GetBrowserByWindowHandle](api/cefpython.md#getbrowserbywindowhandle)
- * [GetCommandLineSwitch](api/cefpython.md#getcommandlineswitch)
- * [GetDataUrl](api/cefpython.md#getdataurl)
- * [GetGlobalClientCallback](api/cefpython.md#getglobalclientcallback)
- * [GetModuleDirectory](api/cefpython.md#getmoduledirectory)
- * [GetVersion](api/cefpython.md#getversion)
- * [Initialize](api/cefpython.md#initialize)
- * [IsThread](api/cefpython.md#isthread)
- * [LoadCrlSetsFile](api/cefpython.md#loadcrlsetsfile)
- * [MessageLoop](api/cefpython.md#messageloop)
- * [MessageLoopWork](api/cefpython.md#messageloopwork)
- * [PostTask](api/cefpython.md#posttask)
- * [PostDelayedTask](api/cefpython.md#postdelayedtask)
- * [QuitMessageLoop](api/cefpython.md#quitmessageloop)
- * [SetGlobalClientCallback](api/cefpython.md#setglobalclientcallback)
- * [SetGlobalClientHandler](api/cefpython.md#setglobalclienthandler)
- * [SetOsModalLoop](api/cefpython.md#setosmodalloop)
- * [Shutdown](api/cefpython.md#shutdown)
-* [Command line switches](api/CommandLineSwitches.md#command-line-switches)
- * [enable-media-stream](api/CommandLineSwitches.md#enable-media-stream)
- * [proxy-server](api/CommandLineSwitches.md#proxy-server)
- * [no-proxy-server](api/CommandLineSwitches.md#no-proxy-server)
- * [disable-gpu](api/CommandLineSwitches.md#disable-gpu)
-* [Cookie (class)](api/Cookie.md#cookie-class)
- * [Set](api/Cookie.md#set)
- * [Get](api/Cookie.md#get)
- * [SetName](api/Cookie.md#setname)
- * [GetName](api/Cookie.md#getname)
- * [SetValue](api/Cookie.md#setvalue)
- * [GetValue](api/Cookie.md#getvalue)
- * [SetDomain](api/Cookie.md#setdomain)
- * [GetDomain](api/Cookie.md#getdomain)
- * [SetPath](api/Cookie.md#setpath)
- * [GetPath](api/Cookie.md#getpath)
- * [SetSecure](api/Cookie.md#setsecure)
- * [GetSecure](api/Cookie.md#getsecure)
- * [SetHttpOnly](api/Cookie.md#sethttponly)
- * [GetHttpOnly](api/Cookie.md#gethttponly)
- * [SetCreation](api/Cookie.md#setcreation)
- * [GetCreation](api/Cookie.md#getcreation)
- * [SetLastAccess](api/Cookie.md#setlastaccess)
- * [GetLastAccess](api/Cookie.md#getlastaccess)
- * [SetHasExpires](api/Cookie.md#sethasexpires)
- * [GetHasExpires](api/Cookie.md#gethasexpires)
- * [SetExpires](api/Cookie.md#setexpires)
- * [GetExpires](api/Cookie.md#getexpires)
-* [CookieManager (class)](api/CookieManager.md#cookiemanager-class)
- * [GetGlobalManager](api/CookieManager.md#getglobalmanager)
- * [GetBlockingManager](api/CookieManager.md#getblockingmanager)
- * [CreateManager](api/CookieManager.md#createmanager)
- * [SetSupportedSchemes](api/CookieManager.md#setsupportedschemes)
- * [VisitAllCookies](api/CookieManager.md#visitallcookies)
- * [VisitUrlCookies](api/CookieManager.md#visiturlcookies)
- * [SetCookie](api/CookieManager.md#setcookie)
- * [DeleteCookies](api/CookieManager.md#deletecookies)
- * [SetStoragePath](api/CookieManager.md#setstoragepath)
- * [FlushStore](api/CookieManager.md#flushstore)
-* [CookieVisitor (interface)](api/CookieVisitor.md#cookievisitor-interface)
- * [Visit](api/CookieVisitor.md#visit)
-* [DisplayHandler (interface)](api/DisplayHandler.md#displayhandler-interface)
- * [OnAddressChange](api/DisplayHandler.md#onaddresschange)
- * [OnAutoResize](api/DisplayHandler.md#onautoresize)
- * [OnConsoleMessage](api/DisplayHandler.md#onconsolemessage)
- * [OnLoadingProgressChange](api/DisplayHandler.md#onloadingprogresschange)
- * [OnStatusMessage](api/DisplayHandler.md#onstatusmessage)
- * [OnTitleChange](api/DisplayHandler.md#ontitlechange)
- * [OnTooltip](api/DisplayHandler.md#ontooltip)
-* [DownloadHandler](api/DownloadHandler.md#downloadhandler)
-* [DpiAware (class)](api/DpiAware.md#dpiaware-class)
- * [CalculateWindowSize](api/DpiAware.md#calculatewindowsize)
- * [EnableHighDpiSupport](api/DpiAware.md#enablehighdpisupport)
- * [GetSystemDpi](api/DpiAware.md#getsystemdpi)
- * [IsProcessDpiAware](api/DpiAware.md#isprocessdpiaware)
- * [SetProcessDpiAware](api/DpiAware.md#setprocessdpiaware)
- * [Scale](api/DpiAware.md#scale)
-* [DragData (object)](api/DragData.md#dragdata-object)
- * [IsLink](api/DragData.md#islink)
- * [IsFragment](api/DragData.md#isfragment)
- * [GetLinkUrl](api/DragData.md#getlinkurl)
- * [GetLinkTitle](api/DragData.md#getlinktitle)
- * [GetFragmentText](api/DragData.md#getfragmenttext)
- * [GetFragmentHtml](api/DragData.md#getfragmenthtml)
- * [GetImage](api/DragData.md#getimage)
- * [GetImageHotspot](api/DragData.md#getimagehotspot)
- * [HasImage](api/DragData.md#hasimage)
-* [FocusHandler (interface)](api/FocusHandler.md#focushandler-interface)
- * [OnTakeFocus](api/FocusHandler.md#ontakefocus)
- * [OnSetFocus](api/FocusHandler.md#onsetfocus)
- * [OnGotFocus](api/FocusHandler.md#ongotfocus)
-* [Frame (object)](api/Frame.md#frame-object)
- * [Copy](api/Frame.md#copy)
- * [Cut](api/Frame.md#cut)
- * [Delete](api/Frame.md#delete)
- * [ExecuteFunction](api/Frame.md#executefunction)
- * [ExecuteJavascript](api/Frame.md#executejavascript)
- * [GetBrowser](api/Frame.md#getbrowser)
- * [GetParent](api/Frame.md#getparent)
- * [GetIdentifier](api/Frame.md#getidentifier)
- * [GetBrowserIdentifier](api/Frame.md#getbrowseridentifier)
- * [GetName](api/Frame.md#getname)
- * [GetParent](api/Frame.md#getparent)
- * [GetSource](api/Frame.md#getsource)
- * [GetText](api/Frame.md#gettext)
- * [GetUrl](api/Frame.md#geturl)
- * [IsFocused](api/Frame.md#isfocused)
- * [IsMain](api/Frame.md#ismain)
- * [IsValid](api/Frame.md#isvalid)
- * [LoadString](api/Frame.md#loadstring)
- * [LoadUrl](api/Frame.md#loadurl)
- * [Paste](api/Frame.md#paste)
- * [Redo](api/Frame.md#redo)
- * [SelectAll](api/Frame.md#selectall)
- * [Undo](api/Frame.md#undo)
- * [ViewSource](api/Frame.md#viewsource)
-* [Image (object)](api/Image.md#image-object)
- * [GetAsBitmap](api/Image.md#getasbitmap)
- * [GetAsPng](api/Image.md#getaspng)
- * [GetHeight](api/Image.md#getheight)
- * [GetWidth](api/Image.md#getwidth)
-* [JavascriptBindings (class)](api/JavascriptBindings.md#javascriptbindings-class)
- * [\_\_init\_\_](api/JavascriptBindings.md#__init__)
- * [IsValueAllowed](api/JavascriptBindings.md#isvalueallowed)
- * [Rebind](api/JavascriptBindings.md#rebind)
- * [SetFunction](api/JavascriptBindings.md#setfunction)
- * [SetObject](api/JavascriptBindings.md#setobject)
- * [SetProperty](api/JavascriptBindings.md#setproperty)
-* [JavascriptCallback (object)](api/JavascriptCallback.md#javascriptcallback-object)
- * [Call](api/JavascriptCallback.md#call)
- * [GetFrame](api/JavascriptCallback.md#getframe)
- * [GetId](api/JavascriptCallback.md#getid)
- * [GetFunctionName](api/JavascriptCallback.md#getfunctionname)
-* [JavascriptDialogHandler (interface)](api/JavascriptDialogHandler.md#javascriptdialoghandler-interface)
- * [Continue](api/JavascriptDialogHandler.md#continue)
- * [OnJavascriptDialog](api/JavascriptDialogHandler.md#onjavascriptdialog)
- * [OnBeforeUnloadJavascriptDialog](api/JavascriptDialogHandler.md#onbeforeunloadjavascriptdialog)
- * [OnResetJavascriptDialogState](api/JavascriptDialogHandler.md#onresetjavascriptdialogstate)
- * [OnJavascriptDialogClosed](api/JavascriptDialogHandler.md#onjavascriptdialogclosed)
-* [KeyboardHandler (interface)](api/KeyboardHandler.md#keyboardhandler-interface)
- * [OnPreKeyEvent](api/KeyboardHandler.md#onprekeyevent)
- * [OnKeyEvent](api/KeyboardHandler.md#onkeyevent)
-* [LifespanHandler (interface)](api/LifespanHandler.md#lifespanhandler-interface)
- * [DoClose](api/LifespanHandler.md#doclose)
- * [_OnAfterCreated](api/LifespanHandler.md#_onaftercreated)
- * [OnBeforeClose](api/LifespanHandler.md#onbeforeclose)
- * [OnBeforePopup](api/LifespanHandler.md#onbeforepopup)
-* [LoadHandler (interface)](api/LoadHandler.md#loadhandler-interface)
- * [OnLoadingStateChange](api/LoadHandler.md#onloadingstatechange)
- * [OnLoadStart](api/LoadHandler.md#onloadstart)
- * [OnDomReady](api/LoadHandler.md#ondomready)
- * [OnLoadEnd](api/LoadHandler.md#onloadend)
- * [OnLoadError](api/LoadHandler.md#onloaderror)
-* [Network error](api/NetworkError.md#network-error)
- * [ERR_NONE](api/NetworkError.md#err_none)
- * [ERR_ABORTED](api/NetworkError.md#err_aborted)
- * [ERR_ACCESS_DENIED](api/NetworkError.md#err_access_denied)
- * [ERR_ADDRESS_INVALID](api/NetworkError.md#err_address_invalid)
- * [ERR_ADDRESS_UNREACHABLE](api/NetworkError.md#err_address_unreachable)
- * [ERR_CACHE_MISS](api/NetworkError.md#err_cache_miss)
- * [ERR_CERT_AUTHORITY_INVALID](api/NetworkError.md#err_cert_authority_invalid)
- * [ERR_CERT_COMMON_NAME_INVALID](api/NetworkError.md#err_cert_common_name_invalid)
- * [ERR_CERT_CONTAINS_ERRORS](api/NetworkError.md#err_cert_contains_errors)
- * [ERR_CERT_DATE_INVALID](api/NetworkError.md#err_cert_date_invalid)
- * [ERR_CERT_END](api/NetworkError.md#err_cert_end)
- * [ERR_CERT_INVALID](api/NetworkError.md#err_cert_invalid)
- * [ERR_CERT_NO_REVOCATION_MECHANISM](api/NetworkError.md#err_cert_no_revocation_mechanism)
- * [ERR_CERT_REVOKED](api/NetworkError.md#err_cert_revoked)
- * [ERR_CERT_UNABLE_TO_CHECK_REVOCATION](api/NetworkError.md#err_cert_unable_to_check_revocation)
- * [ERR_CONNECTION_ABORTED](api/NetworkError.md#err_connection_aborted)
- * [ERR_CONNECTION_CLOSED](api/NetworkError.md#err_connection_closed)
- * [ERR_CONNECTION_FAILED](api/NetworkError.md#err_connection_failed)
- * [ERR_CONNECTION_REFUSED](api/NetworkError.md#err_connection_refused)
- * [ERR_CONNECTION_RESET](api/NetworkError.md#err_connection_reset)
- * [ERR_DISALLOWED_URL_SCHEME](api/NetworkError.md#err_disallowed_url_scheme)
- * [ERR_EMPTY_RESPONSE](api/NetworkError.md#err_empty_response)
- * [ERR_FAILED](api/NetworkError.md#err_failed)
- * [ERR_FILE_NOT_FOUND](api/NetworkError.md#err_file_not_found)
- * [ERR_FILE_TOO_BIG](api/NetworkError.md#err_file_too_big)
- * [ERR_INSECURE_RESPONSE](api/NetworkError.md#err_insecure_response)
- * [ERR_INTERNET_DISCONNECTED](api/NetworkError.md#err_internet_disconnected)
- * [ERR_INVALID_ARGUMENT](api/NetworkError.md#err_invalid_argument)
- * [ERR_INVALID_CHUNKED_ENCODING](api/NetworkError.md#err_invalid_chunked_encoding)
- * [ERR_INVALID_HANDLE](api/NetworkError.md#err_invalid_handle)
- * [ERR_INVALID_RESPONSE](api/NetworkError.md#err_invalid_response)
- * [ERR_INVALID_URL](api/NetworkError.md#err_invalid_url)
- * [ERR_METHOD_NOT_SUPPORTED](api/NetworkError.md#err_method_not_supported)
- * [ERR_NAME_NOT_RESOLVED](api/NetworkError.md#err_name_not_resolved)
- * [ERR_NO_SSL_VERSIONS_ENABLED](api/NetworkError.md#err_no_ssl_versions_enabled)
- * [ERR_NOT_IMPLEMENTED](api/NetworkError.md#err_not_implemented)
- * [ERR_RESPONSE_HEADERS_TOO_BIG](api/NetworkError.md#err_response_headers_too_big)
- * [ERR_SSL_CLIENT_AUTH_CERT_NEEDED](api/NetworkError.md#err_ssl_client_auth_cert_needed)
- * [ERR_SSL_PROTOCOL_ERROR](api/NetworkError.md#err_ssl_protocol_error)
- * [ERR_SSL_RENEGOTIATION_REQUESTED](api/NetworkError.md#err_ssl_renegotiation_requested)
- * [ERR_SSL_VERSION_OR_CIPHER_MISMATCH](api/NetworkError.md#err_ssl_version_or_cipher_mismatch)
- * [ERR_TIMED_OUT](api/NetworkError.md#err_timed_out)
- * [ERR_TOO_MANY_REDIRECTS](api/NetworkError.md#err_too_many_redirects)
- * [ERR_TUNNEL_CONNECTION_FAILED](api/NetworkError.md#err_tunnel_connection_failed)
- * [ERR_UNEXPECTED](api/NetworkError.md#err_unexpected)
- * [ERR_UNEXPECTED_PROXY_AUTH](api/NetworkError.md#err_unexpected_proxy_auth)
- * [ERR_UNKNOWN_URL_SCHEME](api/NetworkError.md#err_unknown_url_scheme)
- * [ERR_UNSAFE_PORT](api/NetworkError.md#err_unsafe_port)
- * [ERR_UNSAFE_REDIRECT](api/NetworkError.md#err_unsafe_redirect)
-* [PaintBuffer (object)](api/PaintBuffer.md#paintbuffer-object)
- * [GetIntPointer](api/PaintBuffer.md#getintpointer)
- * [GetBytes](api/PaintBuffer.md#getbytes)
-* [RenderHandler (interface)](api/RenderHandler.md#renderhandler-interface)
- * [GetRootScreenRect](api/RenderHandler.md#getrootscreenrect)
- * [GetViewRect](api/RenderHandler.md#getviewrect)
- * [GetScreenRect](api/RenderHandler.md#getscreenrect)
- * [GetScreenPoint](api/RenderHandler.md#getscreenpoint)
- * [OnPopupShow](api/RenderHandler.md#onpopupshow)
- * [OnPopupSize](api/RenderHandler.md#onpopupsize)
- * [OnPaint](api/RenderHandler.md#onpaint)
- * [OnCursorChange](api/RenderHandler.md#oncursorchange)
- * [OnScrollOffsetChanged](api/RenderHandler.md#onscrolloffsetchanged)
- * [OnTextSelectionChanged](api/RenderHandler.md#ontextselectionchanged)
- * [StartDragging](api/RenderHandler.md#startdragging)
- * [UpdateDragCursor](api/RenderHandler.md#updatedragcursor)
-* [Request (class)](api/Request.md#request-class)
- * [CreateRequest](api/Request.md#createrequest)
- * [IsReadOnly](api/Request.md#isreadonly)
- * [GetUrl](api/Request.md#geturl)
- * [SetUrl](api/Request.md#seturl)
- * [GetMethod](api/Request.md#getmethod)
- * [SetMethod](api/Request.md#setmethod)
- * [GetPostData](api/Request.md#getpostdata)
- * [SetPostData](api/Request.md#setpostdata)
- * [GetHeaderMap](api/Request.md#getheadermap)
- * [GetHeaderMultimap](api/Request.md#getheadermultimap)
- * [SetHeaderMap](api/Request.md#setheadermap)
- * [SetHeaderMultimap](api/Request.md#setheadermultimap)
- * [GetFlags](api/Request.md#getflags)
- * [SetFlags](api/Request.md#setflags)
- * [GetFirstPartyForCookies](api/Request.md#getfirstpartyforcookies)
- * [SetFirstPartyForCookies](api/Request.md#setfirstpartyforcookies)
- * [GetResourceType](api/Request.md#getresourcetype)
- * [GetTransitionType](api/Request.md#gettransitiontype)
-* [RequestHandler (interface)](api/RequestHandler.md#requesthandler-interface)
- * [CanGetCookies](api/RequestHandler.md#cangetcookies)
- * [CanSetCookie](api/RequestHandler.md#cansetcookie)
- * [GetAuthCredentials](api/RequestHandler.md#getauthcredentials)
- * [GetCookieManager](api/RequestHandler.md#getcookiemanager)
- * [GetResourceHandler](api/RequestHandler.md#getresourcehandler)
- * [OnBeforeBrowse](api/RequestHandler.md#onbeforebrowse)
- * [_OnBeforePluginLoad](api/RequestHandler.md#_onbeforepluginload)
- * [OnBeforeResourceLoad](api/RequestHandler.md#onbeforeresourceload)
- * [_OnCertificateError](api/RequestHandler.md#_oncertificateerror)
- * [OnQuotaRequest](api/RequestHandler.md#onquotarequest)
- * [OnResourceRedirect](api/RequestHandler.md#onresourceredirect)
- * [OnResourceResponse](api/RequestHandler.md#onresourceresponse)
- * [OnPluginCrashed](api/RequestHandler.md#onplugincrashed)
- * [OnProtocolExecution](api/RequestHandler.md#onprotocolexecution)
- * [OnRendererProcessTerminated](api/RequestHandler.md#onrendererprocessterminated)
-* [ResourceHandler (interface)](api/ResourceHandler.md#resourcehandler-interface)
- * [ProcessRequest](api/ResourceHandler.md#processrequest)
- * [GetResponseHeaders](api/ResourceHandler.md#getresponseheaders)
- * [ReadResponse](api/ResourceHandler.md#readresponse)
- * [CanGetCookie](api/ResourceHandler.md#cangetcookie)
- * [CanSetCookie](api/ResourceHandler.md#cansetcookie)
- * [Cancel](api/ResourceHandler.md#cancel)
-* [Response (object)](api/Response.md#response-object)
- * [IsReadOnly](api/Response.md#isreadonly)
- * [GetStatus](api/Response.md#getstatus)
- * [SetStatus](api/Response.md#setstatus)
- * [GetStatusText](api/Response.md#getstatustext)
- * [SetStatusText](api/Response.md#setstatustext)
- * [GetMimeType](api/Response.md#getmimetype)
- * [SetMimeType](api/Response.md#setmimetype)
- * [GetHeader](api/Response.md#getheader)
- * [GetHeaderMap](api/Response.md#getheadermap)
- * [GetHeaderMultimap](api/Response.md#getheadermultimap)
- * [SetHeaderMap](api/Response.md#setheadermap)
- * [SetHeaderMultimap](api/Response.md#setheadermultimap)
-* [StringVisitor (interface)](api/StringVisitor.md#stringvisitor-interface)
- * [Visit](api/StringVisitor.md#visit)
-* [V8ContextHandler (interface)](api/V8ContextHandler.md#v8contexthandler-interface)
- * [OnContextCreated](api/V8ContextHandler.md#oncontextcreated)
- * [OnContextReleased](api/V8ContextHandler.md#oncontextreleased)
-* [Virtual Key codes](api/VirtualKey.md#virtual-key-codes)
-* [WebPluginInfo (object)](api/WebPluginInfo.md#webplugininfo-object)
- * [GetName](api/WebPluginInfo.md#getname)
- * [GetPath](api/WebPluginInfo.md#getpath)
- * [GetVersion](api/WebPluginInfo.md#getversion)
- * [GetDescription](api/WebPluginInfo.md#getdescription)
-* [WebRequest (class)](api/WebRequest.md#webrequest-class)
- * [Create](api/WebRequest.md#create)
- * [GetRequest](api/WebRequest.md#getrequest)
- * [GetRequestStatus](api/WebRequest.md#getrequeststatus)
- * [GetRequestError](api/WebRequest.md#getrequesterror)
- * [GetResponse](api/WebRequest.md#getresponse)
- * [Cancel](api/WebRequest.md#cancel)
-* [WebRequestClient (interface)](api/WebRequestClient.md#webrequestclient-interface)
- * [OnUploadProgress](api/WebRequestClient.md#onuploadprogress)
- * [OnDownloadProgress](api/WebRequestClient.md#ondownloadprogress)
- * [OnDownloadData](api/WebRequestClient.md#ondownloaddata)
- * [OnRequestComplete](api/WebRequestClient.md#onrequestcomplete)
-* [WindowInfo (class)](api/WindowInfo.md#windowinfo-class)
- * [SetAsChild](api/WindowInfo.md#setaschild)
- * [SetAsPopup](api/WindowInfo.md#setaspopup)
- * [SetAsOffscreen](api/WindowInfo.md#setasoffscreen)
-* [WindowUtils (class)](api/WindowUtils.md#windowutils-class)
- * [OnSetFocus ](api/WindowUtils.md#onsetfocus-win)
- * [OnSize ](api/WindowUtils.md#onsize-win)
- * [OnEraseBackground ](api/WindowUtils.md#onerasebackground-win)
- * [SetTitle ](api/WindowUtils.md#settitle-win)
- * [SetIcon ](api/WindowUtils.md#seticon-win)
- * [GetParentHandle](api/WindowUtils.md#getparenthandle)
- * [IsWindowHandle](api/WindowUtils.md#iswindowhandle)
- * [gtk_plug_new ](api/WindowUtils.md#gtk_plug_new-linux)
- * [gtk_widget_show ](api/WindowUtils.md#gtk_widget_show-linux)
- * [InstallX11ErrorHandlers ](api/WindowUtils.md#installx11errorhandlers-linux)
+* [AccessibilityHandler (interface)](api/AccessibilityHandler.md#accessibilityhandler-interface)
+ * [\_OnAccessibilityTreeChange](api/AccessibilityHandler.md#_onaccessibilitytreechange)
+ * [\_OnAccessibilityLocationChange](api/AccessibilityHandler.md#_onaccessibilitylocationchange)
+* [Application settings](api/ApplicationSettings.md#application-settings)
+ * [accept\_language\_list](api/ApplicationSettings.md#accept_language_list)
+ * [app\_user\_model\_id](api/ApplicationSettings.md#app_user_model_id)
+ * [auto\_zooming](api/ApplicationSettings.md#auto_zooming)
+ * [background\_color](api/ApplicationSettings.md#background_color)
+ * [browser\_subprocess\_path](api/ApplicationSettings.md#browser_subprocess_path)
+ * [cache\_path](api/ApplicationSettings.md#cache_path)
+ * [command\_line\_args\_disabled](api/ApplicationSettings.md#command_line_args_disabled)
+ * [context\_menu](api/ApplicationSettings.md#context_menu)
+ * [downloads\_enabled](api/ApplicationSettings.md#downloads_enabled)
+ * [external\_message\_pump](api/ApplicationSettings.md#external_message_pump)
+ * [framework\_dir\_path](api/ApplicationSettings.md#framework_dir_path)
+ * [ignore\_certificate\_errors](api/ApplicationSettings.md#ignore_certificate_errors)
+ * [javascript\_flags](api/ApplicationSettings.md#javascript_flags)
+ * [locale](api/ApplicationSettings.md#locale)
+ * [locales\_dir\_path](api/ApplicationSettings.md#locales_dir_path)
+ * [debug](api/ApplicationSettings.md#debug)
+ * [log\_file](api/ApplicationSettings.md#log_file)
+ * [log\_severity](api/ApplicationSettings.md#log_severity)
+ * [multi\_threaded\_message\_loop](api/ApplicationSettings.md#multi_threaded_message_loop)
+ * [net\_security\_expiration\_enabled](api/ApplicationSettings.md#net_security_expiration_enabled)
+ * [pack\_loading\_disabled](api/ApplicationSettings.md#pack_loading_disabled)
+ * [persist\_session\_cookies](api/ApplicationSettings.md#persist_session_cookies)
+ * [persist\_user\_preferences](api/ApplicationSettings.md#persist_user_preferences)
+ * [product\_version](api/ApplicationSettings.md#product_version)
+ * [remote\_debugging\_port](api/ApplicationSettings.md#remote_debugging_port)
+ * [resources\_dir\_path](api/ApplicationSettings.md#resources_dir_path)
+ * [single\_process](api/ApplicationSettings.md#single_process)
+ * [string\_encoding](api/ApplicationSettings.md#string_encoding)
+ * [uncaught\_exception\_stack\_size](api/ApplicationSettings.md#uncaught_exception_stack_size)
+ * [unique\_request\_context\_per\_browser](api/ApplicationSettings.md#unique_request_context_per_browser)
+ * [user\_agent](api/ApplicationSettings.md#user_agent)
+ * [user\_data\_path](api/ApplicationSettings.md#user_data_path)
+ * [windowless\_rendering\_enabled](api/ApplicationSettings.md#windowless_rendering_enabled)
+* [Browser (object)](api/Browser.md#browser-object)
+ * [AddWordToDictionary](api/Browser.md#addwordtodictionary)
+ * [CanGoBack](api/Browser.md#cangoback)
+ * [CanGoForward](api/Browser.md#cangoforward)
+ * [CloseBrowser](api/Browser.md#closebrowser)
+ * [CloseDevTools](api/Browser.md#closedevtools)
+ * [DragTargetDragEnter](api/Browser.md#dragtargetdragenter)
+ * [DragTargetDragOver](api/Browser.md#dragtargetdragover)
+ * [DragTargetDragLeave](api/Browser.md#dragtargetdragleave)
+ * [DragTargetDrop](api/Browser.md#dragtargetdrop)
+ * [DragSourceEndedAt](api/Browser.md#dragsourceendedat)
+ * [DragSourceSystemDragEnded](api/Browser.md#dragsourcesystemdragended)
+ * [ExecuteFunction](api/Browser.md#executefunction)
+ * [ExecuteJavascript](api/Browser.md#executejavascript)
+ * [Find](api/Browser.md#find)
+ * [GetClientCallback](api/Browser.md#getclientcallback)
+ * [GetClientCallbacksDict](api/Browser.md#getclientcallbacksdict)
+ * [GetFocusedFrame](api/Browser.md#getfocusedframe)
+ * [GetFrame](api/Browser.md#getframe)
+ * [GetFrameByIdentifier](api/Browser.md#getframebyidentifier)
+ * [GetFrames](api/Browser.md#getframes)
+ * [GetFrameCount](api/Browser.md#getframecount)
+ * [GetFrameIdentifiers](api/Browser.md#getframeidentifiers)
+ * [GetFrameNames](api/Browser.md#getframenames)
+ * [GetImage](api/Browser.md#getimage)
+ * [GetJavascriptBindings](api/Browser.md#getjavascriptbindings)
+ * [GetMainFrame](api/Browser.md#getmainframe)
+ * [GetNSTextInputContext](api/Browser.md#getnstextinputcontext)
+ * [GetOpenerWindowHandle](api/Browser.md#getopenerwindowhandle)
+ * [GetOuterWindowHandle](api/Browser.md#getouterwindowhandle)
+ * [GetSetting](api/Browser.md#getsetting)
+ * [GetUrl](api/Browser.md#geturl)
+ * [GetUserData](api/Browser.md#getuserdata)
+ * [GetWindowHandle](api/Browser.md#getwindowhandle)
+ * [GetIdentifier](api/Browser.md#getidentifier)
+ * [GetZoomLevel](api/Browser.md#getzoomlevel)
+ * [GoBack](api/Browser.md#goback)
+ * [GoForward](api/Browser.md#goforward)
+ * [HandleKeyEventAfterTextInputClient](api/Browser.md#handlekeyeventaftertextinputclient)
+ * [HandleKeyEventBeforeTextInputClient](api/Browser.md#handlekeyeventbeforetextinputclient)
+ * [HasDevTools](api/Browser.md#hasdevtools)
+ * [HasDocument](api/Browser.md#hasdocument)
+ * [Invalidate](api/Browser.md#invalidate)
+ * [IsFullscreen](api/Browser.md#isfullscreen)
+ * [IsLoading](api/Browser.md#isloading)
+ * [IsMouseCursorChangeDisabled](api/Browser.md#ismousecursorchangedisabled)
+ * [IsPopup](api/Browser.md#ispopup)
+ * [IsWindowRenderingDisabled](api/Browser.md#iswindowrenderingdisabled)
+ * [LoadUrl](api/Browser.md#loadurl)
+ * [Navigate](api/Browser.md#navigate)
+ * [NotifyMoveOrResizeStarted](api/Browser.md#notifymoveorresizestarted)
+ * [NotifyScreenInfoChanged](api/Browser.md#notifyscreeninfochanged)
+ * [ParentWindowWillClose](api/Browser.md#parentwindowwillclose)
+ * [Print](api/Browser.md#print)
+ * [Reload](api/Browser.md#reload)
+ * [ReloadIgnoreCache](api/Browser.md#reloadignorecache)
+ * [ReplaceMisspelling](api/Browser.md#replacemisspelling)
+ * [SetAutoResizeEnabled](api/Browser.md#setautoresizeenabled)
+ * [SetBounds](api/Browser.md#setbounds)
+ * [SendKeyEvent](api/Browser.md#sendkeyevent)
+ * [SendMouseClickEvent](api/Browser.md#sendmouseclickevent)
+ * [SendMouseMoveEvent](api/Browser.md#sendmousemoveevent)
+ * [SendMouseWheelEvent](api/Browser.md#sendmousewheelevent)
+ * [SendFocusEvent](api/Browser.md#sendfocusevent)
+ * [SendCaptureLostEvent](api/Browser.md#sendcapturelostevent)
+ * [SetAccessibilityState](api/Browser.md#setaccessibilitystate)
+ * [SetClientCallback](api/Browser.md#setclientcallback)
+ * [SetClientHandler](api/Browser.md#setclienthandler)
+ * [SetFocus](api/Browser.md#setfocus)
+ * [SetMouseCursorChangeDisabled](api/Browser.md#setmousecursorchangedisabled)
+ * [SetJavascriptBindings](api/Browser.md#setjavascriptbindings)
+ * [SetUserData](api/Browser.md#setuserdata)
+ * [SetZoomLevel](api/Browser.md#setzoomlevel)
+ * [ShowDevTools](api/Browser.md#showdevtools)
+ * [StartDownload](api/Browser.md#startdownload)
+ * [StopLoad](api/Browser.md#stopload)
+ * [StopFinding](api/Browser.md#stopfinding)
+ * [ToggleFullscreen](api/Browser.md#togglefullscreen)
+ * [TryCloseBrowser](api/Browser.md#tryclosebrowser)
+ * [WasResized](api/Browser.md#wasresized)
+ * [WasHidden](api/Browser.md#washidden)
+* [Browser settings](api/BrowserSettings.md#browser-settings)
+ * [Font settings](api/BrowserSettings.md#font-settings)
+ * [accept\_language\_list](api/BrowserSettings.md#accept_language_list)
+ * [application\_cache\_disabled](api/BrowserSettings.md#application_cache_disabled)
+ * [background\_color](api/BrowserSettings.md#background_color)
+ * [databases\_disabled](api/BrowserSettings.md#databases_disabled)
+ * [default\_encoding](api/BrowserSettings.md#default_encoding)
+ * [dom\_paste\_disabled](api/BrowserSettings.md#dom_paste_disabled)
+ * [file\_access\_from\_file\_urls\_allowed](api/BrowserSettings.md#file_access_from_file_urls_allowed)
+ * [inherit\_client\_handlers\_for\_popups](api/BrowserSettings.md#inherit_client_handlers_for_popups)
+ * [image\_load\_disabled](api/BrowserSettings.md#image_load_disabled)
+ * [javascript\_disabled](api/BrowserSettings.md#javascript_disabled)
+ * [javascript\_close\_windows\_disallowed](api/BrowserSettings.md#javascript_close_windows_disallowed)
+ * [javascript\_access\_clipboard\_disallowed](api/BrowserSettings.md#javascript_access_clipboard_disallowed)
+ * [local\_storage\_disabled](api/BrowserSettings.md#local_storage_disabled)
+ * [plugins\_disabled](api/BrowserSettings.md#plugins_disabled)
+ * [remote\_fonts](api/BrowserSettings.md#remote_fonts)
+ * [shrink\_standalone\_images\_to\_fit](api/BrowserSettings.md#shrink_standalone_images_to_fit)
+ * [tab\_to\_links\_disabled](api/BrowserSettings.md#tab_to_links_disabled)
+ * [text\_area\_resize\_disabled](api/BrowserSettings.md#text_area_resize_disabled)
+ * [universal\_access\_from\_file\_urls\_allowed](api/BrowserSettings.md#universal_access_from_file_urls_allowed)
+ * [user\_style\_sheet\_location](api/BrowserSettings.md#user_style_sheet_location)
+ * [web\_security\_disabled](api/BrowserSettings.md#web_security_disabled)
+ * [webgl\_disabled](api/BrowserSettings.md#webgl_disabled)
+ * [windowless\_frame\_rate](api/BrowserSettings.md#windowless_frame_rate)
+* [Callback (object)](api/Callback.md#callback-object)
+ * [Continue](api/Callback.md#continue)
+ * [Cancel](api/Callback.md#cancel)
+* [cefpython](api/cefpython.md#cefpython)
+ * [CreateBrowser](api/cefpython.md#createbrowser)
+ * [CreateBrowserSync](api/cefpython.md#createbrowsersync)
+ * [ExceptHook](api/cefpython.md#excepthook)
+ * [GetAppSetting](api/cefpython.md#getappsetting)
+ * [GetAppPath](api/cefpython.md#getapppath)
+ * [GetBrowserByIdentifier](api/cefpython.md#getbrowserbyidentifier)
+ * [GetBrowserByWindowHandle](api/cefpython.md#getbrowserbywindowhandle)
+ * [GetCommandLineSwitch](api/cefpython.md#getcommandlineswitch)
+ * [GetDataUrl](api/cefpython.md#getdataurl)
+ * [GetGlobalClientCallback](api/cefpython.md#getglobalclientcallback)
+ * [GetModuleDirectory](api/cefpython.md#getmoduledirectory)
+ * [GetVersion](api/cefpython.md#getversion)
+ * [Initialize](api/cefpython.md#initialize)
+ * [IsThread](api/cefpython.md#isthread)
+ * [LoadCrlSetsFile](api/cefpython.md#loadcrlsetsfile)
+ * [MessageLoop](api/cefpython.md#messageloop)
+ * [MessageLoopWork](api/cefpython.md#messageloopwork)
+ * [PostTask](api/cefpython.md#posttask)
+ * [PostDelayedTask](api/cefpython.md#postdelayedtask)
+ * [QuitMessageLoop](api/cefpython.md#quitmessageloop)
+ * [SetGlobalClientCallback](api/cefpython.md#setglobalclientcallback)
+ * [SetGlobalClientHandler](api/cefpython.md#setglobalclienthandler)
+ * [SetOsModalLoop](api/cefpython.md#setosmodalloop)
+ * [Shutdown](api/cefpython.md#shutdown)
+* [Command line switches](api/CommandLineSwitches.md#command-line-switches)
+ * [enable-media-stream](api/CommandLineSwitches.md#enable-media-stream)
+ * [proxy-server](api/CommandLineSwitches.md#proxy-server)
+ * [no-proxy-server](api/CommandLineSwitches.md#no-proxy-server)
+ * [disable-gpu](api/CommandLineSwitches.md#disable-gpu)
+* [Cookie (class)](api/Cookie.md#cookie-class)
+ * [Set](api/Cookie.md#set)
+ * [Get](api/Cookie.md#get)
+ * [SetName](api/Cookie.md#setname)
+ * [GetName](api/Cookie.md#getname)
+ * [SetValue](api/Cookie.md#setvalue)
+ * [GetValue](api/Cookie.md#getvalue)
+ * [SetDomain](api/Cookie.md#setdomain)
+ * [GetDomain](api/Cookie.md#getdomain)
+ * [SetPath](api/Cookie.md#setpath)
+ * [GetPath](api/Cookie.md#getpath)
+ * [SetSecure](api/Cookie.md#setsecure)
+ * [GetSecure](api/Cookie.md#getsecure)
+ * [SetHttpOnly](api/Cookie.md#sethttponly)
+ * [GetHttpOnly](api/Cookie.md#gethttponly)
+ * [SetCreation](api/Cookie.md#setcreation)
+ * [GetCreation](api/Cookie.md#getcreation)
+ * [SetLastAccess](api/Cookie.md#setlastaccess)
+ * [GetLastAccess](api/Cookie.md#getlastaccess)
+ * [SetHasExpires](api/Cookie.md#sethasexpires)
+ * [GetHasExpires](api/Cookie.md#gethasexpires)
+ * [SetExpires](api/Cookie.md#setexpires)
+ * [GetExpires](api/Cookie.md#getexpires)
+* [CookieManager (class)](api/CookieManager.md#cookiemanager-class)
+ * [GetGlobalManager](api/CookieManager.md#getglobalmanager)
+ * [GetBlockingManager](api/CookieManager.md#getblockingmanager)
+ * [CreateManager](api/CookieManager.md#createmanager)
+ * [SetSupportedSchemes](api/CookieManager.md#setsupportedschemes)
+ * [VisitAllCookies](api/CookieManager.md#visitallcookies)
+ * [VisitUrlCookies](api/CookieManager.md#visiturlcookies)
+ * [SetCookie](api/CookieManager.md#setcookie)
+ * [DeleteCookies](api/CookieManager.md#deletecookies)
+ * [SetStoragePath](api/CookieManager.md#setstoragepath)
+ * [FlushStore](api/CookieManager.md#flushstore)
+* [CookieVisitor (interface)](api/CookieVisitor.md#cookievisitor-interface)
+ * [Visit](api/CookieVisitor.md#visit)
+* [DisplayHandler (interface)](api/DisplayHandler.md#displayhandler-interface)
+ * [OnAddressChange](api/DisplayHandler.md#onaddresschange)
+ * [OnAutoResize](api/DisplayHandler.md#onautoresize)
+ * [OnConsoleMessage](api/DisplayHandler.md#onconsolemessage)
+ * [OnLoadingProgressChange](api/DisplayHandler.md#onloadingprogresschange)
+ * [OnStatusMessage](api/DisplayHandler.md#onstatusmessage)
+ * [OnTitleChange](api/DisplayHandler.md#ontitlechange)
+ * [OnTooltip](api/DisplayHandler.md#ontooltip)
+* [DownloadHandler](api/DownloadHandler.md#downloadhandler)
+* [DpiAware (class)](api/DpiAware.md#dpiaware-class)
+ * [CalculateWindowSize](api/DpiAware.md#calculatewindowsize)
+ * [EnableHighDpiSupport](api/DpiAware.md#enablehighdpisupport)
+ * [GetSystemDpi](api/DpiAware.md#getsystemdpi)
+ * [IsProcessDpiAware](api/DpiAware.md#isprocessdpiaware)
+ * [SetProcessDpiAware](api/DpiAware.md#setprocessdpiaware)
+ * [Scale](api/DpiAware.md#scale)
+* [DragData (object)](api/DragData.md#dragdata-object)
+ * [IsLink](api/DragData.md#islink)
+ * [IsFragment](api/DragData.md#isfragment)
+ * [GetLinkUrl](api/DragData.md#getlinkurl)
+ * [GetLinkTitle](api/DragData.md#getlinktitle)
+ * [GetFragmentText](api/DragData.md#getfragmenttext)
+ * [GetFragmentHtml](api/DragData.md#getfragmenthtml)
+ * [GetImage](api/DragData.md#getimage)
+ * [GetImageHotspot](api/DragData.md#getimagehotspot)
+ * [HasImage](api/DragData.md#hasimage)
+* [FocusHandler (interface)](api/FocusHandler.md#focushandler-interface)
+ * [OnTakeFocus](api/FocusHandler.md#ontakefocus)
+ * [OnSetFocus](api/FocusHandler.md#onsetfocus)
+ * [OnGotFocus](api/FocusHandler.md#ongotfocus)
+* [Frame (object)](api/Frame.md#frame-object)
+ * [Copy](api/Frame.md#copy)
+ * [Cut](api/Frame.md#cut)
+ * [Delete](api/Frame.md#delete)
+ * [ExecuteFunction](api/Frame.md#executefunction)
+ * [ExecuteJavascript](api/Frame.md#executejavascript)
+ * [GetBrowser](api/Frame.md#getbrowser)
+ * [GetParent](api/Frame.md#getparent)
+ * [GetIdentifier](api/Frame.md#getidentifier)
+ * [GetBrowserIdentifier](api/Frame.md#getbrowseridentifier)
+ * [GetName](api/Frame.md#getname)
+ * [GetParent](api/Frame.md#getparent)
+ * [GetSource](api/Frame.md#getsource)
+ * [GetText](api/Frame.md#gettext)
+ * [GetUrl](api/Frame.md#geturl)
+ * [IsFocused](api/Frame.md#isfocused)
+ * [IsMain](api/Frame.md#ismain)
+ * [IsValid](api/Frame.md#isvalid)
+ * [LoadString](api/Frame.md#loadstring)
+ * [LoadUrl](api/Frame.md#loadurl)
+ * [Paste](api/Frame.md#paste)
+ * [Redo](api/Frame.md#redo)
+ * [SelectAll](api/Frame.md#selectall)
+ * [Undo](api/Frame.md#undo)
+ * [ViewSource](api/Frame.md#viewsource)
+* [Image (object)](api/Image.md#image-object)
+ * [GetAsBitmap](api/Image.md#getasbitmap)
+ * [GetAsPng](api/Image.md#getaspng)
+ * [GetHeight](api/Image.md#getheight)
+ * [GetWidth](api/Image.md#getwidth)
+* [JavascriptBindings (class)](api/JavascriptBindings.md#javascriptbindings-class)
+ * [\_\_init\_\_](api/JavascriptBindings.md#__init__)
+ * [IsValueAllowed](api/JavascriptBindings.md#isvalueallowed)
+ * [Rebind](api/JavascriptBindings.md#rebind)
+ * [SetFunction](api/JavascriptBindings.md#setfunction)
+ * [SetObject](api/JavascriptBindings.md#setobject)
+ * [SetProperty](api/JavascriptBindings.md#setproperty)
+* [JavascriptCallback (object)](api/JavascriptCallback.md#javascriptcallback-object)
+ * [Call](api/JavascriptCallback.md#call)
+ * [GetFrame](api/JavascriptCallback.md#getframe)
+ * [GetId](api/JavascriptCallback.md#getid)
+ * [GetFunctionName](api/JavascriptCallback.md#getfunctionname)
+* [JavascriptDialogHandler (interface)](api/JavascriptDialogHandler.md#javascriptdialoghandler-interface)
+ * [Continue](api/JavascriptDialogHandler.md#continue)
+ * [OnJavascriptDialog](api/JavascriptDialogHandler.md#onjavascriptdialog)
+ * [OnBeforeUnloadJavascriptDialog](api/JavascriptDialogHandler.md#onbeforeunloadjavascriptdialog)
+ * [OnResetJavascriptDialogState](api/JavascriptDialogHandler.md#onresetjavascriptdialogstate)
+ * [OnJavascriptDialogClosed](api/JavascriptDialogHandler.md#onjavascriptdialogclosed)
+* [KeyboardHandler (interface)](api/KeyboardHandler.md#keyboardhandler-interface)
+ * [OnPreKeyEvent](api/KeyboardHandler.md#onprekeyevent)
+ * [OnKeyEvent](api/KeyboardHandler.md#onkeyevent)
+* [LifespanHandler (interface)](api/LifespanHandler.md#lifespanhandler-interface)
+ * [DoClose](api/LifespanHandler.md#doclose)
+ * [\_OnAfterCreated](api/LifespanHandler.md#_onaftercreated)
+ * [OnBeforeClose](api/LifespanHandler.md#onbeforeclose)
+ * [OnBeforePopup](api/LifespanHandler.md#onbeforepopup)
+* [LoadHandler (interface)](api/LoadHandler.md#loadhandler-interface)
+ * [OnLoadingStateChange](api/LoadHandler.md#onloadingstatechange)
+ * [OnLoadStart](api/LoadHandler.md#onloadstart)
+ * [OnDomReady](api/LoadHandler.md#ondomready)
+ * [OnLoadEnd](api/LoadHandler.md#onloadend)
+ * [OnLoadError](api/LoadHandler.md#onloaderror)
+* [Network error](api/NetworkError.md#network-error)
+ * [ERR\_NONE](api/NetworkError.md#err_none)
+ * [ERR\_ABORTED](api/NetworkError.md#err_aborted)
+ * [ERR\_ACCESS\_DENIED](api/NetworkError.md#err_access_denied)
+ * [ERR\_ADDRESS\_INVALID](api/NetworkError.md#err_address_invalid)
+ * [ERR\_ADDRESS\_UNREACHABLE](api/NetworkError.md#err_address_unreachable)
+ * [ERR\_CACHE\_MISS](api/NetworkError.md#err_cache_miss)
+ * [ERR\_CERT\_AUTHORITY\_INVALID](api/NetworkError.md#err_cert_authority_invalid)
+ * [ERR\_CERT\_COMMON\_NAME\_INVALID](api/NetworkError.md#err_cert_common_name_invalid)
+ * [ERR\_CERT\_CONTAINS\_ERRORS](api/NetworkError.md#err_cert_contains_errors)
+ * [ERR\_CERT\_DATE\_INVALID](api/NetworkError.md#err_cert_date_invalid)
+ * [ERR\_CERT\_END](api/NetworkError.md#err_cert_end)
+ * [ERR\_CERT\_INVALID](api/NetworkError.md#err_cert_invalid)
+ * [ERR\_CERT\_NO\_REVOCATION\_MECHANISM](api/NetworkError.md#err_cert_no_revocation_mechanism)
+ * [ERR\_CERT\_REVOKED](api/NetworkError.md#err_cert_revoked)
+ * [ERR\_CERT\_UNABLE\_TO\_CHECK\_REVOCATION](api/NetworkError.md#err_cert_unable_to_check_revocation)
+ * [ERR\_CONNECTION\_ABORTED](api/NetworkError.md#err_connection_aborted)
+ * [ERR\_CONNECTION\_CLOSED](api/NetworkError.md#err_connection_closed)
+ * [ERR\_CONNECTION\_FAILED](api/NetworkError.md#err_connection_failed)
+ * [ERR\_CONNECTION\_REFUSED](api/NetworkError.md#err_connection_refused)
+ * [ERR\_CONNECTION\_RESET](api/NetworkError.md#err_connection_reset)
+ * [ERR\_DISALLOWED\_URL\_SCHEME](api/NetworkError.md#err_disallowed_url_scheme)
+ * [ERR\_EMPTY\_RESPONSE](api/NetworkError.md#err_empty_response)
+ * [ERR\_FAILED](api/NetworkError.md#err_failed)
+ * [ERR\_FILE\_NOT\_FOUND](api/NetworkError.md#err_file_not_found)
+ * [ERR\_FILE\_TOO\_BIG](api/NetworkError.md#err_file_too_big)
+ * [ERR\_INSECURE\_RESPONSE](api/NetworkError.md#err_insecure_response)
+ * [ERR\_INTERNET\_DISCONNECTED](api/NetworkError.md#err_internet_disconnected)
+ * [ERR\_INVALID\_ARGUMENT](api/NetworkError.md#err_invalid_argument)
+ * [ERR\_INVALID\_CHUNKED\_ENCODING](api/NetworkError.md#err_invalid_chunked_encoding)
+ * [ERR\_INVALID\_HANDLE](api/NetworkError.md#err_invalid_handle)
+ * [ERR\_INVALID\_RESPONSE](api/NetworkError.md#err_invalid_response)
+ * [ERR\_INVALID\_URL](api/NetworkError.md#err_invalid_url)
+ * [ERR\_METHOD\_NOT\_SUPPORTED](api/NetworkError.md#err_method_not_supported)
+ * [ERR\_NAME\_NOT\_RESOLVED](api/NetworkError.md#err_name_not_resolved)
+ * [ERR\_NO\_SSL\_VERSIONS\_ENABLED](api/NetworkError.md#err_no_ssl_versions_enabled)
+ * [ERR\_NOT\_IMPLEMENTED](api/NetworkError.md#err_not_implemented)
+ * [ERR\_RESPONSE\_HEADERS\_TOO\_BIG](api/NetworkError.md#err_response_headers_too_big)
+ * [ERR\_SSL\_CLIENT\_AUTH\_CERT\_NEEDED](api/NetworkError.md#err_ssl_client_auth_cert_needed)
+ * [ERR\_SSL\_PROTOCOL\_ERROR](api/NetworkError.md#err_ssl_protocol_error)
+ * [ERR\_SSL\_RENEGOTIATION\_REQUESTED](api/NetworkError.md#err_ssl_renegotiation_requested)
+ * [ERR\_SSL\_VERSION\_OR\_CIPHER\_MISMATCH](api/NetworkError.md#err_ssl_version_or_cipher_mismatch)
+ * [ERR\_TIMED\_OUT](api/NetworkError.md#err_timed_out)
+ * [ERR\_TOO\_MANY\_REDIRECTS](api/NetworkError.md#err_too_many_redirects)
+ * [ERR\_TUNNEL\_CONNECTION\_FAILED](api/NetworkError.md#err_tunnel_connection_failed)
+ * [ERR\_UNEXPECTED](api/NetworkError.md#err_unexpected)
+ * [ERR\_UNEXPECTED\_PROXY\_AUTH](api/NetworkError.md#err_unexpected_proxy_auth)
+ * [ERR\_UNKNOWN\_URL\_SCHEME](api/NetworkError.md#err_unknown_url_scheme)
+ * [ERR\_UNSAFE\_PORT](api/NetworkError.md#err_unsafe_port)
+ * [ERR\_UNSAFE\_REDIRECT](api/NetworkError.md#err_unsafe_redirect)
+* [PaintBuffer (object)](api/PaintBuffer.md#paintbuffer-object)
+ * [GetIntPointer](api/PaintBuffer.md#getintpointer)
+ * [GetBytes](api/PaintBuffer.md#getbytes)
+* [RenderHandler (interface)](api/RenderHandler.md#renderhandler-interface)
+ * [GetRootScreenRect](api/RenderHandler.md#getrootscreenrect)
+ * [GetViewRect](api/RenderHandler.md#getviewrect)
+ * [GetScreenRect](api/RenderHandler.md#getscreenrect)
+ * [GetScreenPoint](api/RenderHandler.md#getscreenpoint)
+ * [OnPopupShow](api/RenderHandler.md#onpopupshow)
+ * [OnPopupSize](api/RenderHandler.md#onpopupsize)
+ * [OnPaint](api/RenderHandler.md#onpaint)
+ * [OnCursorChange](api/RenderHandler.md#oncursorchange)
+ * [OnScrollOffsetChanged](api/RenderHandler.md#onscrolloffsetchanged)
+ * [OnTextSelectionChanged](api/RenderHandler.md#ontextselectionchanged)
+ * [StartDragging](api/RenderHandler.md#startdragging)
+ * [UpdateDragCursor](api/RenderHandler.md#updatedragcursor)
+* [Request (class)](api/Request.md#request-class)
+ * [CreateRequest](api/Request.md#createrequest)
+ * [IsReadOnly](api/Request.md#isreadonly)
+ * [GetUrl](api/Request.md#geturl)
+ * [SetUrl](api/Request.md#seturl)
+ * [GetMethod](api/Request.md#getmethod)
+ * [SetMethod](api/Request.md#setmethod)
+ * [GetPostData](api/Request.md#getpostdata)
+ * [SetPostData](api/Request.md#setpostdata)
+ * [GetHeaderMap](api/Request.md#getheadermap)
+ * [GetHeaderMultimap](api/Request.md#getheadermultimap)
+ * [SetHeaderMap](api/Request.md#setheadermap)
+ * [SetHeaderMultimap](api/Request.md#setheadermultimap)
+ * [GetFlags](api/Request.md#getflags)
+ * [SetFlags](api/Request.md#setflags)
+ * [GetFirstPartyForCookies](api/Request.md#getfirstpartyforcookies)
+ * [SetFirstPartyForCookies](api/Request.md#setfirstpartyforcookies)
+ * [GetResourceType](api/Request.md#getresourcetype)
+ * [GetTransitionType](api/Request.md#gettransitiontype)
+* [RequestHandler (interface)](api/RequestHandler.md#requesthandler-interface)
+ * [CanGetCookies](api/RequestHandler.md#cangetcookies)
+ * [CanSetCookie](api/RequestHandler.md#cansetcookie)
+ * [GetAuthCredentials](api/RequestHandler.md#getauthcredentials)
+ * [GetCookieManager](api/RequestHandler.md#getcookiemanager)
+ * [GetResourceHandler](api/RequestHandler.md#getresourcehandler)
+ * [OnBeforeBrowse](api/RequestHandler.md#onbeforebrowse)
+ * [\_OnBeforePluginLoad](api/RequestHandler.md#_onbeforepluginload)
+ * [OnBeforeResourceLoad](api/RequestHandler.md#onbeforeresourceload)
+ * [\_OnCertificateError](api/RequestHandler.md#_oncertificateerror)
+ * [OnQuotaRequest](api/RequestHandler.md#onquotarequest)
+ * [OnResourceRedirect](api/RequestHandler.md#onresourceredirect)
+ * [OnResourceResponse](api/RequestHandler.md#onresourceresponse)
+ * [OnPluginCrashed](api/RequestHandler.md#onplugincrashed)
+ * [OnProtocolExecution](api/RequestHandler.md#onprotocolexecution)
+ * [OnRendererProcessTerminated](api/RequestHandler.md#onrendererprocessterminated)
+* [ResourceHandler (interface)](api/ResourceHandler.md#resourcehandler-interface)
+ * [ProcessRequest](api/ResourceHandler.md#processrequest)
+ * [GetResponseHeaders](api/ResourceHandler.md#getresponseheaders)
+ * [ReadResponse](api/ResourceHandler.md#readresponse)
+ * [CanGetCookie](api/ResourceHandler.md#cangetcookie)
+ * [CanSetCookie](api/ResourceHandler.md#cansetcookie)
+ * [Cancel](api/ResourceHandler.md#cancel)
+* [Response (object)](api/Response.md#response-object)
+ * [IsReadOnly](api/Response.md#isreadonly)
+ * [GetStatus](api/Response.md#getstatus)
+ * [SetStatus](api/Response.md#setstatus)
+ * [GetStatusText](api/Response.md#getstatustext)
+ * [SetStatusText](api/Response.md#setstatustext)
+ * [GetMimeType](api/Response.md#getmimetype)
+ * [SetMimeType](api/Response.md#setmimetype)
+ * [GetHeader](api/Response.md#getheader)
+ * [GetHeaderMap](api/Response.md#getheadermap)
+ * [GetHeaderMultimap](api/Response.md#getheadermultimap)
+ * [SetHeaderMap](api/Response.md#setheadermap)
+ * [SetHeaderMultimap](api/Response.md#setheadermultimap)
+* [StringVisitor (interface)](api/StringVisitor.md#stringvisitor-interface)
+ * [Visit](api/StringVisitor.md#visit)
+* [V8ContextHandler (interface)](api/V8ContextHandler.md#v8contexthandler-interface)
+ * [OnContextCreated](api/V8ContextHandler.md#oncontextcreated)
+ * [OnContextReleased](api/V8ContextHandler.md#oncontextreleased)
+* [Virtual Key codes](api/VirtualKey.md#virtual-key-codes)
+* [WebPluginInfo (object)](api/WebPluginInfo.md#webplugininfo-object)
+ * [GetName](api/WebPluginInfo.md#getname)
+ * [GetPath](api/WebPluginInfo.md#getpath)
+ * [GetVersion](api/WebPluginInfo.md#getversion)
+ * [GetDescription](api/WebPluginInfo.md#getdescription)
+* [WebRequest (class)](api/WebRequest.md#webrequest-class)
+ * [Create](api/WebRequest.md#create)
+ * [GetRequest](api/WebRequest.md#getrequest)
+ * [GetRequestStatus](api/WebRequest.md#getrequeststatus)
+ * [GetRequestError](api/WebRequest.md#getrequesterror)
+ * [GetResponse](api/WebRequest.md#getresponse)
+ * [Cancel](api/WebRequest.md#cancel)
+* [WebRequestClient (interface)](api/WebRequestClient.md#webrequestclient-interface)
+ * [OnUploadProgress](api/WebRequestClient.md#onuploadprogress)
+ * [OnDownloadProgress](api/WebRequestClient.md#ondownloadprogress)
+ * [OnDownloadData](api/WebRequestClient.md#ondownloaddata)
+ * [OnRequestComplete](api/WebRequestClient.md#onrequestcomplete)
+* [WindowInfo (class)](api/WindowInfo.md#windowinfo-class)
+ * [SetAsChild](api/WindowInfo.md#setaschild)
+ * [SetAsPopup](api/WindowInfo.md#setaspopup)
+ * [SetAsOffscreen](api/WindowInfo.md#setasoffscreen)
+* [WindowUtils (class)](api/WindowUtils.md#windowutils-class)
+ * [OnSetFocus](api/WindowUtils.md#onsetfocus-win)
+ * [OnSize](api/WindowUtils.md#onsize-win)
+ * [OnEraseBackground](api/WindowUtils.md#onerasebackground-win)
+ * [SetTitle](api/WindowUtils.md#settitle-win)
+ * [SetIcon](api/WindowUtils.md#seticon-win)
+ * [GetParentHandle](api/WindowUtils.md#getparenthandle)
+ * [IsWindowHandle](api/WindowUtils.md#iswindowhandle)
+ * [gtk\_plug\_new](api/WindowUtils.md#gtk_plug_new-linux)
+ * [gtk\_widget\_show](api/WindowUtils.md#gtk_widget_show-linux)
+ * [InstallX11ErrorHandlers](api/WindowUtils.md#installx11errorhandlers-linux)
\ No newline at end of file
diff --git a/examples/tutorial.py b/examples/tutorial.py
index 860bbe12c..bca8059bd 100644
--- a/examples/tutorial.py
+++ b/examples/tutorial.py
@@ -60,11 +60,11 @@
def main():
check_versions()
sys.excepthook = cef.ExceptHook # To shutdown all CEF processes on error
- # To change user agent use either "product_version"
+ # To change user agent use either "user_agent_product"
# or "user_agent" options. Explained in Tutorial in
# "Change user agent string" section.
settings = {
- # "product_version": "MyProduct/10.00",
+ # "user_agent_product": "MyProduct/10.00",
# "user_agent": "MyAgent/20.00 MyProduct/10.00",
}
cef.Initialize(settings=settings)
diff --git a/src/browser.pyx b/src/browser.pyx
index c8cba03ad..6f89e5b65 100644
--- a/src/browser.pyx
+++ b/src/browser.pyx
@@ -58,8 +58,8 @@ cdef PyBrowser GetPyBrowser(CefRefPtr[CefBrowser] cefBrowser,
provided."""
global g_pyBrowsers
-
- if cefBrowser == NULL or not cefBrowser.get():
+#lc void*
+ if not cefBrowser.get():
raise Exception("{caller}: CefBrowser reference is NULL"
.format(caller=callerIdStr))
@@ -148,7 +148,7 @@ cdef void RemovePyBrowser(int browserId) except *:
# noinspection PyUnresolvedReferences
Debug("del g_pyBrowsers[%s]" % browserId)
pyBrowser = g_pyBrowsers[browserId]
- pyBrowser.cefBrowser.Assign(NULL)
+ pyBrowser.cefBrowser.Assign(nullptr)
del pyBrowser
del g_pyBrowsers[browserId]
g_unreferenced_browsers.append(browserId)
@@ -207,7 +207,8 @@ cdef class PyBrowser:
cdef void* imageBuffer
cdef CefRefPtr[CefBrowser] GetCefBrowser(self) except *:
- if self.cefBrowser != NULL and self.cefBrowser.get():
+ #lc void*
+ if self.cefBrowser.get():
return self.cefBrowser
raise Exception("PyBrowser.GetCefBrowser() failed: CefBrowser "
"was destroyed")
@@ -215,7 +216,8 @@ cdef class PyBrowser:
cdef CefRefPtr[CefBrowserHost] GetCefBrowserHost(self) except *:
cdef CefRefPtr[CefBrowserHost] cefBrowserHost = (
self.GetCefBrowser().get().GetHost())
- if cefBrowserHost != NULL and cefBrowserHost.get():
+ #lc void*
+ if cefBrowserHost.get():
return cefBrowserHost
raise Exception("PyBrowser.GetCefBrowserHost() failed: this "
"method can only be called in the browser "
@@ -278,6 +280,9 @@ cdef class PyBrowser:
# FocusHandler
self.allowedClientCallbacks += ["OnTakeFocus", "OnSetFocus",
"OnGotFocus"]
+ # DownloadHandler
+ self.allowedClientCallbacks += ["OnBeforeDownload",
+ "OnDownloadUpdated"]
if name not in self.allowedClientCallbacks:
raise Exception("Browser.SetClientCallback() failed: unknown "
@@ -394,9 +399,9 @@ cdef class PyBrowser:
# If using GetCookieManager to implement custom cookie managers
# then flushing of cookies would need to be handled manually.
self.GetCefBrowserHost().get().GetRequestContext().get() \
- .GetDefaultCookieManager(
- NULL) \
- .get().FlushStore(NULL)
+ .GetCookieManager(
+ nullptr) \
+ .get().FlushStore(nullptr)
cdef int browserId = self.GetCefBrowser().get().GetIdentifier()
self.GetCefBrowserHost().get().CloseBrowser(bool(forceClose))
@@ -413,12 +418,12 @@ cdef class PyBrowser:
py_string scriptUrl="", int startLine=1):
self.GetMainFrame().ExecuteJavascript(jsCode, scriptUrl, startLine)
- cpdef py_void Find(self, int searchId, py_string searchText,
+ cpdef py_void Find(self, py_string searchText,
py_bool forward, py_bool matchCase,
py_bool findNext):
cdef CefString cefSearchText
PyToCefString(searchText, cefSearchText)
- self.GetCefBrowserHost().get().Find(searchId, cefSearchText,
+ self.GetCefBrowserHost().get().Find(cefSearchText,
bool(forward), bool(matchCase), bool(findNext))
cpdef PyFrame GetFocusedFrame(self):
@@ -581,7 +586,7 @@ cdef class PyBrowser:
cdef CefBrowserSettings settings
cdef CefPoint inspect_element_at
self.GetCefBrowserHost().get().ShowDevTools(
- window_info, NULL, settings,
+ window_info, nullptr, settings,
inspect_element_at)
cpdef py_void StopLoad(self):
@@ -728,8 +733,8 @@ cdef class PyBrowser:
self.GetCefBrowserHost().get().SendMouseWheelEvent(mouseEvent,
deltaX, deltaY)
- cpdef py_void SendFocusEvent(self, py_bool setFocus):
- self.GetCefBrowserHost().get().SendFocusEvent(bool(setFocus))
+ # cpdef py_void SendFocusEvent(self, py_bool setFocus):
+ # self.GetCefBrowserHost().get().SendFocusEvent(bool(setFocus))
cpdef py_void SendCaptureLostEvent(self):
self.GetCefBrowserHost().get().SendCaptureLostEvent()
@@ -738,12 +743,12 @@ cdef class PyBrowser:
self.GetCefBrowserHost().get().StartDownload(PyToCefStringValue(
url))
- cpdef py_void SetMouseCursorChangeDisabled(self, py_bool disabled):
- self.GetCefBrowserHost().get().SetMouseCursorChangeDisabled(
- bool(disabled))
+ # cpdef py_void SetMouseCursorChangeDisabled(self, py_bool disabled):
+ # self.GetCefBrowserHost().get().SetMouseCursorChangeDisabled(
+ # bool(disabled))
- cpdef py_bool IsMouseCursorChangeDisabled(self):
- return self.GetCefBrowserHost().get().IsMouseCursorChangeDisabled()
+ # cpdef py_bool IsMouseCursorChangeDisabled(self):
+ # return self.GetCefBrowserHost().get().IsMouseCursorChangeDisabled()
cpdef py_bool TryCloseBrowser(self):
return self.GetCefBrowserHost().get().TryCloseBrowser()
@@ -757,28 +762,28 @@ cdef class PyBrowser:
cpdef py_void NotifyScreenInfoChanged(self):
self.GetCefBrowserHost().get().NotifyScreenInfoChanged()
- cdef void SendProcessMessage(self, cef_process_id_t targetProcess,
- object frameId, py_string messageName, list pyArguments
- ) except *:
- cdef CefRefPtr[CefProcessMessage] message = \
- CefProcessMessage_Create(PyToCefStringValue(messageName))
- # This does not work, no idea why, the CEF implementation
- # seems not to allow it, both Assign() and swap() do not work:
- # | message.get().GetArgumentList().Assign(arguments.get())
- # | message.get().GetArgumentList().swap(arguments)
- cdef CefRefPtr[CefListValue] messageArguments = \
- message.get().GetArgumentList()
- PyListToExistingCefListValue(self.GetIdentifier(), frameId,
- pyArguments, messageArguments)
- Debug("SendProcessMessage(): message=%s, arguments size=%d" % (
- messageName,
- message.get().GetArgumentList().get().GetSize()))
- cdef cpp_bool success = \
- self.GetCefBrowser().get().SendProcessMessage(
- targetProcess, message)
- if not success:
- raise Exception("Browser.SendProcessMessage() failed: "\
- "messageName=%s" % messageName)
+ # cdef void SendProcessMessage(self, cef_process_id_t targetProcess,
+ # object frameId, py_string messageName, list pyArguments
+ # ) except *:
+ # cdef CefRefPtr[CefProcessMessage] message = \
+ # CefProcessMessage_Create(PyToCefStringValue(messageName))
+ # # This does not work, no idea why, the CEF implementation
+ # # seems not to allow it, both Assign() and swap() do not work:
+ # # | message.get().GetArgumentList().Assign(arguments.get())
+ # # | message.get().GetArgumentList().swap(arguments)
+ # cdef CefRefPtr[CefListValue] messageArguments = \
+ # message.get().GetArgumentList()
+ # PyListToExistingCefListValue(self.GetIdentifier(), frameId,
+ # pyArguments, messageArguments)
+ # Debug("SendProcessMessage(): message=%s, arguments size=%d" % (
+ # messageName,
+ # message.get().GetArgumentList().get().GetSize()))
+ # cdef cpp_bool success = \
+ # self.GetCefBrowser().get().SendProcessMessage(
+ # targetProcess, message)
+ # if not success:
+ # raise Exception("Browser.SendProcessMessage() failed: "\
+ # "messageName=%s" % messageName)
# -------------------------------------------------------------------------
# OSR drag & drop
diff --git a/src/cefpython.pyx b/src/cefpython.pyx
index c3b1e1a13..fa627ca94 100644
--- a/src/cefpython.pyx
+++ b/src/cefpython.pyx
@@ -201,6 +201,9 @@ from libc.string cimport memcpy
from cython.operator cimport preincrement as preinc, dereference as deref
# noinspection PyUnresolvedReferences
+from libcpp cimport nullptr_t, nullptr
+from libcpp.memory cimport unique_ptr
+
# from cython.operator cimport address as addr # Address of an c++ object?
# noinspection PyUnresolvedReferences
@@ -258,7 +261,7 @@ from cef_types cimport (
from cef_ptr cimport CefRefPtr
# noinspection PyUnresolvedReferences
-from cef_scoped_ptr cimport scoped_ptr
+from cef_scoped_refptr cimport scoped_refptr
from cef_task cimport *
from cef_platform cimport *
@@ -302,6 +305,9 @@ from cef_views cimport *
from cef_log cimport *
from cef_file_util cimport *
+from cef_download_item cimport *
+from cef_download_handler cimport *
+
# -----------------------------------------------------------------------------
# GLOBAL VARIABLES
@@ -321,7 +327,7 @@ g_browser_settings = {}
# noinspection PyUnresolvedReferences
cdef CefRefPtr[CefRequestContext] g_shared_request_context
-cdef scoped_ptr[MainMessageLoopExternalPump] g_external_message_pump
+cdef unique_ptr[MainMessageLoopExternalPump] g_external_message_pump
cdef py_bool g_MessageLoop_called = False
cdef py_bool g_MessageLoopWork_called = False
@@ -372,6 +378,7 @@ include "app.pyx"
include "drag_data.pyx"
include "helpers.pyx"
include "image.pyx"
+include "download.pyx"
# Handlers
include "handlers/accessibility_handler.pyx"
@@ -387,6 +394,7 @@ include "handlers/resource_handler.pyx"
include "handlers/request_handler.pyx"
include "handlers/v8context_handler.pyx"
include "handlers/v8function_handler.pyx"
+include "handlers/download_handler.pyx"
# -----------------------------------------------------------------------------
# Utility functions to provide settings to the C++ browser process code.
@@ -581,8 +589,8 @@ def Initialize(applicationSettings=None, commandLineSwitches=None, **kwargs):
# ------------------------------------------------------------------------
if not "multi_threaded_message_loop" in application_settings:
application_settings["multi_threaded_message_loop"] = False
- if not "single_process" in application_settings:
- application_settings["single_process"] = False
+ # if not "single_process" in application_settings:
+ # application_settings["single_process"] = False
# ------------------------------------------------------------------------
# ------------------------------------------------------------------------
@@ -622,13 +630,13 @@ def Initialize(applicationSettings=None, commandLineSwitches=None, **kwargs):
SetApplicationSettings(application_settings, &cefApplicationSettings)
# External message pump
+ global g_external_message_pump
if GetAppSetting("external_message_pump")\
and not g_external_message_pump.get():
Debug("Create external message pump")
# Using .reset() here to assign new instance was causing
# MainMessageLoopExternalPump destructor to be called. Strange.
- g_external_message_pump.Assign(
- MainMessageLoopExternalPump.Create())
+ g_external_message_pump = MainMessageLoopExternalPump.Create()
Debug("CefInitialize()")
cdef cpp_bool ret
@@ -685,7 +693,7 @@ def CreateBrowserSync(windowInfo=None,
and "window_title" in browserSettings:
# noinspection PyUnresolvedReferences
cef_window = CefWindow.CreateTopLevelWindow(
- NULL)
+ nullptr)
Debug("CefWindow.GetChildViewCount = "
+str(cef_window.get().GetChildViewCount()))
@@ -697,7 +705,7 @@ def CreateBrowserSync(windowInfo=None,
#cef_box_layout.get().SetFlexForView(cef_window, 1)
cef_window.get().SetToFillLayout()
# noinspection PyUnresolvedReferences
- cef_panel = CefPanel.CreatePanel(NULL)
+ cef_panel = CefPanel.CreatePanel(nullptr)
cef_window.get().AddChildView(cef_panel)
cef_window.get().Layout()
cef_window.get().SetVisible(True)
@@ -762,13 +770,15 @@ def CreateBrowserSync(windowInfo=None,
cefRequestContext.Assign(g_shared_request_context.get())
# CEF browser creation.
+ cdef CefRefPtr[CefDictionaryValue] cefExtraInfo
+
with nogil:
cefBrowser = cef_browser_static.CreateBrowserSync(
cefWindowInfo, clientHandler,
- cefNavigateUrl, cefBrowserSettings,
+ cefNavigateUrl, cefBrowserSettings, cefExtraInfo,
cefRequestContext)
-
- if cefBrowser == NULL or not cefBrowser.get():
+ #lc void*
+ if not cefBrowser.get():
Debug("CefBrowser::CreateBrowserSync() failed")
return None
else:
@@ -943,7 +953,7 @@ def Shutdown():
# causing segmentation fault. See Issue #333:
# https://github.com/cztomczak/cefpython/issues/333
# Debug("Free g_shared_request_context")
- # g_shared_request_context.Assign(NULL)
+ # g_shared_request_context.Assign(nullptr)
# Release external message pump before CefShutdown, so that
# message pump timer is killed.
diff --git a/src/client_handler/client_handler.cpp b/src/client_handler/client_handler.cpp
index daf9a4e59..3b0b5084f 100644
--- a/src/client_handler/client_handler.cpp
+++ b/src/client_handler/client_handler.cpp
@@ -27,6 +27,7 @@
bool ClientHandler::OnProcessMessageReceived(
CefRefPtr browser,
+ CefRefPtr frame,
CefProcessId source_process,
CefRefPtr message)
{
diff --git a/src/client_handler/client_handler.h b/src/client_handler/client_handler.h
index 3e9e3917b..6251f8e71 100644
--- a/src/client_handler/client_handler.h
+++ b/src/client_handler/client_handler.h
@@ -48,6 +48,9 @@ class ClientHandler : public CefClient,
CefRefPtr GetDialogHandler() override {
return this;
}
+ CefRefPtr GetPrintHandler() override {
+ return this;
+ }
#endif
CefRefPtr GetDisplayHandler() override {
@@ -87,6 +90,7 @@ class ClientHandler : public CefClient,
}
bool OnProcessMessageReceived(CefRefPtr browser,
+ CefRefPtr frame,
CefProcessId source_process,
CefRefPtr message
) override;
diff --git a/src/client_handler/cookie_visitor.h b/src/client_handler/cookie_visitor.h
index 54c2b53fd..0b990baca 100644
--- a/src/client_handler/cookie_visitor.h
+++ b/src/client_handler/cookie_visitor.h
@@ -24,7 +24,7 @@ class CookieVisitor : public CefCookieVisitor
int count,
int total,
bool& deleteCookie
- ) OVERRIDE;
+ ) override;
protected:
IMPLEMENT_REFCOUNTING(CookieVisitor);
diff --git a/src/client_handler/dialog_handler.cpp b/src/client_handler/dialog_handler.cpp
index ab90de9b6..df9184c2c 100644
--- a/src/client_handler/dialog_handler.cpp
+++ b/src/client_handler/dialog_handler.cpp
@@ -19,7 +19,7 @@ bool DialogHandler::OnFileDialog(CefRefPtr browser,
const CefString& title,
const CefString& default_file_path,
const std::vector& accept_filters,
- int selected_accept_filter,
+ // int selected_accept_filter,
CefRefPtr callback)
{
#if defined(OS_LINUX)
diff --git a/src/client_handler/dialog_handler.h b/src/client_handler/dialog_handler.h
index 21d79a60d..537e1f41e 100644
--- a/src/client_handler/dialog_handler.h
+++ b/src/client_handler/dialog_handler.h
@@ -23,9 +23,9 @@ class DialogHandler : public CefDialogHandler
const CefString& title,
const CefString& default_file_path,
const std::vector& accept_filters,
- int selected_accept_filter,
+ // int selected_accept_filter,
CefRefPtr callback)
- override;
+ ;
public:
#if defined(OS_LINUX)
diff --git a/src/client_handler/dialog_handler_gtk.cpp b/src/client_handler/dialog_handler_gtk.cpp
index ce5a4d4e0..44a865e6a 100644
--- a/src/client_handler/dialog_handler_gtk.cpp
+++ b/src/client_handler/dialog_handler_gtk.cpp
@@ -141,7 +141,7 @@ bool ClientDialogHandlerGtk::OnFileDialog(
const CefString& title,
const CefString& default_file_path,
const std::vector& accept_filters,
- int selected_accept_filter,
+ // int selected_accept_filter,
CefRefPtr callback) {
std::vector files;
diff --git a/src/client_handler/dialog_handler_gtk.h b/src/client_handler/dialog_handler_gtk.h
index 59f65eda1..30911199e 100644
--- a/src/client_handler/dialog_handler_gtk.h
+++ b/src/client_handler/dialog_handler_gtk.h
@@ -25,8 +25,8 @@ class ClientDialogHandlerGtk : public CefDialogHandler,
const CefString& title,
const CefString& default_file_path,
const std::vector& accept_filters,
- int selected_accept_filter,
- CefRefPtr callback) OVERRIDE;
+ // int selected_accept_filter,
+ CefRefPtr callback) override;
// CefJSDialogHandler methods.
bool OnJSDialog(CefRefPtr browser,
diff --git a/src/client_handler/download_handler.cpp b/src/client_handler/download_handler.cpp
index 9e887e467..8b9b41fd8 100644
--- a/src/client_handler/download_handler.cpp
+++ b/src/client_handler/download_handler.cpp
@@ -13,16 +13,17 @@ void DownloadHandler::OnBeforeDownload(
CefRefPtr callback)
{
REQUIRE_UI_THREAD();
- bool downloads_enabled = ApplicationSettings_GetBool("downloads_enabled");
- if (downloads_enabled) {
- std::string msg = "[Browser process] About to download file: ";
- msg.append(suggested_name.ToString().c_str());
- LOG(INFO) << msg.c_str();
- callback->Continue(suggested_name, true);
- } else {
- LOG(INFO) << "[Browser process] Tried to download file,"
- " but downloads are disabled";
- }
+ // bool downloads_enabled = ApplicationSettings_GetBool("downloads_enabled");
+ // if (downloads_enabled) {
+ // std::string msg = "[Browser process] About to download file: ";
+ // msg.append(suggested_name.ToString().c_str());
+ // LOG(INFO) << msg.c_str();
+ // callback->Continue(suggested_name, true);
+ // } else {
+ // LOG(INFO) << "[Browser process] Tried to download file,"
+ // " but downloads are disabled";
+ // }
+ DownloadHandler_OnBeforeDownload(browser, download_item, suggested_name, callback);
}
@@ -32,11 +33,12 @@ void DownloadHandler::OnDownloadUpdated(
CefRefPtr callback)
{
REQUIRE_UI_THREAD();
- if (download_item->IsComplete()) {
- std::string msg = "[Browser process] Download completed, saved to: ";
- msg.append(download_item->GetFullPath().ToString().c_str());
- LOG(INFO) << msg.c_str();
- } else if (download_item->IsCanceled()) {
- LOG(INFO) << "[Browser process] Download was cancelled";
- }
+ // if (download_item->IsComplete()) {
+ // std::string msg = "[Browser process] Download completed, saved to: ";
+ // msg.append(download_item->GetFullPath().ToString().c_str());
+ // LOG(INFO) << msg.c_str();
+ // } else if (download_item->IsCanceled()) {
+ // LOG(INFO) << "[Browser process] Download was cancelled";
+ // }
+ DownloadHandler_OnDownloadUpdated(browser, download_item, callback);
}
diff --git a/src/client_handler/dpi_aware.cpp b/src/client_handler/dpi_aware.cpp
index 48e2a13f7..9ee258d65 100644
--- a/src/client_handler/dpi_aware.cpp
+++ b/src/client_handler/dpi_aware.cpp
@@ -11,6 +11,7 @@
#include "include/wrapper/cef_closure_task.h"
#include "include/base/cef_bind.h"
#include "include/base/cef_logging.h"
+#include "include/base/cef_callback.h"
const int DEFAULT_DPIX = 96;
@@ -219,7 +220,7 @@ void SetBrowserDpiSettings(CefRefPtr cefBrowser,
CefPostDelayedTask(
TID_UI,
CefCreateClosureTask(
- base::Bind(&SetBrowserDpiSettings,
+ base::BindOnce(&SetBrowserDpiSettings,
cefBrowser, autoZooming)
),
50
diff --git a/src/client_handler/lifespan_handler.cpp b/src/client_handler/lifespan_handler.cpp
index b4d7d52f6..d9d6010d6 100644
--- a/src/client_handler/lifespan_handler.cpp
+++ b/src/client_handler/lifespan_handler.cpp
@@ -19,6 +19,7 @@ bool LifespanHandler::OnBeforePopup(CefRefPtr browser,
CefWindowInfo& windowInfo,
CefRefPtr& client,
CefBrowserSettings& settings,
+ CefRefPtr& extra_info,
bool* no_javascript_access)
{
REQUIRE_UI_THREAD();
@@ -27,7 +28,7 @@ bool LifespanHandler::OnBeforePopup(CefRefPtr browser,
return LifespanHandler_OnBeforePopup(browser, frame, target_url,
target_frame_name, target_disposition, user_gesture,
popupFeaturesNotImpl, windowInfo, client, settings,
- no_javascript_access);
+ extra_info, no_javascript_access);
}
diff --git a/src/client_handler/lifespan_handler.h b/src/client_handler/lifespan_handler.h
index 91244eff9..6b38d7dda 100644
--- a/src/client_handler/lifespan_handler.h
+++ b/src/client_handler/lifespan_handler.h
@@ -24,6 +24,7 @@ class LifespanHandler : public CefLifeSpanHandler
CefWindowInfo& windowInfo,
CefRefPtr& client,
CefBrowserSettings& settings,
+ CefRefPtr& extra_info,
bool* no_javascript_access) override;
void OnAfterCreated(CefRefPtr browser) override;
bool DoClose(CefRefPtr browser) override;
diff --git a/src/client_handler/render_handler.cpp b/src/client_handler/render_handler.cpp
index cf45d15ee..00d9cbbf2 100644
--- a/src/client_handler/render_handler.cpp
+++ b/src/client_handler/render_handler.cpp
@@ -4,43 +4,39 @@
#include "render_handler.h"
-
bool RenderHandler::GetRootScreenRect(CefRefPtr browser,
- CefRect& rect)
+ CefRect &rect)
{
REQUIRE_UI_THREAD();
return RenderHandler_GetRootScreenRect(browser, rect);
}
-
-bool RenderHandler::GetViewRect(CefRefPtr browser,
- CefRect& rect)
+void RenderHandler::GetViewRect(CefRefPtr browser,
+ CefRect &rect)
{
REQUIRE_UI_THREAD();
- return RenderHandler_GetViewRect(browser, rect);
+ // return RenderHandler_GetViewRect(browser, rect);
+ RenderHandler_GetViewRect(browser, rect);
}
-
bool RenderHandler::GetScreenPoint(CefRefPtr browser,
int viewX,
int viewY,
- int& screenX,
- int& screenY)
+ int &screenX,
+ int &screenY)
{
REQUIRE_UI_THREAD();
return RenderHandler_GetScreenPoint(browser, viewX, viewY, screenX,
screenY);
}
-
bool RenderHandler::GetScreenInfo(CefRefPtr browser,
- CefScreenInfo& screen_info)
+ CefScreenInfo &screen_info)
{
REQUIRE_UI_THREAD();
return RenderHandler_GetScreenInfo(browser, screen_info);
}
-
void RenderHandler::OnPopupShow(CefRefPtr browser,
bool show)
{
@@ -48,37 +44,34 @@ void RenderHandler::OnPopupShow(CefRefPtr browser,
RenderHandler_OnPopupShow(browser, show);
}
-
void RenderHandler::OnPopupSize(CefRefPtr browser,
- const CefRect& rect)
+ const CefRect &rect)
{
REQUIRE_UI_THREAD();
RenderHandler_OnPopupSize(browser, rect);
}
-
void RenderHandler::OnPaint(CefRefPtr browser,
PaintElementType type,
- const RectList& dirtyRects,
- const void* buffer,
+ const RectList &dirtyRects,
+ const void *buffer,
int width, int height)
{
REQUIRE_UI_THREAD();
- RenderHandler_OnPaint(browser, type, const_cast(dirtyRects),
+ RenderHandler_OnPaint(browser, type, const_cast(dirtyRects),
buffer, width, height);
}
-
-void RenderHandler::OnCursorChange(CefRefPtr browser,
+bool RenderHandler::OnCursorChange(CefRefPtr browser,
CefCursorHandle cursor,
- CursorType type,
- const CefCursorInfo& custom_cursor_info)
+ cef_cursor_type_t type,
+ const CefCursorInfo &custom_cursor_info)
{
REQUIRE_UI_THREAD();
RenderHandler_OnCursorChange(browser, cursor);
+ return true;
}
-
void RenderHandler::OnScrollOffsetChanged(CefRefPtr browser,
double x,
double y)
@@ -87,7 +80,6 @@ void RenderHandler::OnScrollOffsetChanged(CefRefPtr browser,
RenderHandler_OnScrollOffsetChanged(browser);
}
-
bool RenderHandler::StartDragging(CefRefPtr browser,
CefRefPtr drag_data,
DragOperationsMask allowed_ops,
@@ -99,7 +91,6 @@ bool RenderHandler::StartDragging(CefRefPtr browser,
allowed_ops, x, y);
}
-
void RenderHandler::UpdateDragCursor(CefRefPtr browser,
DragOperation operation)
{
@@ -108,8 +99,9 @@ void RenderHandler::UpdateDragCursor(CefRefPtr browser,
}
void RenderHandler::OnTextSelectionChanged(CefRefPtr browser,
- const CefString& selected_text,
- const CefRange& selected_range) {
+ const CefString &selected_text,
+ const CefRange &selected_range)
+{
REQUIRE_UI_THREAD();
RenderHandler_OnTextSelectionChanged(browser, selected_text,
selected_range);
diff --git a/src/client_handler/render_handler.h b/src/client_handler/render_handler.h
index 75eee86c5..f86747768 100644
--- a/src/client_handler/render_handler.h
+++ b/src/client_handler/render_handler.h
@@ -22,7 +22,7 @@ class RenderHandler : public CefRenderHandler,
bool GetRootScreenRect(CefRefPtr browser,
CefRect& rect) override;
- bool GetViewRect(CefRefPtr browser,
+ void GetViewRect(CefRefPtr browser,
CefRect& rect) override;
bool GetScreenPoint(CefRefPtr browser,
@@ -46,11 +46,10 @@ class RenderHandler : public CefRenderHandler,
const void* buffer,
int width, int height) override;
- void OnCursorChange(CefRefPtr browser,
+ bool OnCursorChange(CefRefPtr browser,
CefCursorHandle cursor,
- CursorType type,
- const CefCursorInfo& custom_cursor_info
- ) override;
+ cef_cursor_type_t type,
+ const CefCursorInfo& custom_cursor_info);
void OnScrollOffsetChanged(CefRefPtr browser,
double x,
diff --git a/src/client_handler/request_context_handler.cpp b/src/client_handler/request_context_handler.cpp
index bf816cf51..f606249c0 100644
--- a/src/client_handler/request_context_handler.cpp
+++ b/src/client_handler/request_context_handler.cpp
@@ -9,31 +9,33 @@
// CefRequestContextHandler
// --------------------------------------------------------------------------
-CefRefPtr RequestContextHandler::GetCookieManager() {
- REQUIRE_IO_THREAD();
- if (browser_.get()) {
- return RequestHandler_GetCookieManager(browser_,
- browser_->GetMainFrame()->GetURL());
- } else {
- CefString mainUrl;
- return RequestHandler_GetCookieManager(browser_, mainUrl);
- }
- // Default: return NULL.
-}
+// CefRefPtr RequestContextHandler::GetCookieManager() {
+// REQUIRE_IO_THREAD();
+// if (browser_.get()) {
+// return RequestHandler_GetCookieManager(browser_,
+// browser_->GetMainFrame()->GetURL());
+// } else {
+// CefString mainUrl;
+// return RequestHandler_GetCookieManager(browser_, mainUrl);
+// }
+// // Default: return NULL.
+// }
-bool RequestContextHandler::OnBeforePluginLoad(
- const CefString& mime_type,
- const CefString& plugin_url,
- bool is_main_frame,
- const CefString& top_origin_url,
- CefRefPtr plugin_info,
- PluginPolicy* plugin_policy) {
- // Called on multiple threads
- return RequestHandler_OnBeforePluginLoad(browser_,
- mime_type,
- plugin_url,
- is_main_frame,
- top_origin_url,
- plugin_info,
- plugin_policy);
-}
+// bool RequestContextHandler::OnBeforePluginLoad(
+// const CefString& mime_type,
+// const CefString& plugin_url,
+// bool is_main_frame,
+// const CefString& top_origin_url,
+// CefRefPtr plugin_info,
+// PluginPolicy* plugin_policy) {
+// // Called on multiple threads
+// return RequestHandler_OnBeforePluginLoad(browser_,
+// mime_type,
+// plugin_url,
+// is_main_frame,
+// top_origin_url,
+// plugin_info,
+// plugin_policy);
+// }
+
+//LC TODO
\ No newline at end of file
diff --git a/src/client_handler/request_context_handler.h b/src/client_handler/request_context_handler.h
index b8bf25f3a..cdd870dc3 100644
--- a/src/client_handler/request_context_handler.h
+++ b/src/client_handler/request_context_handler.h
@@ -10,12 +10,15 @@
#include "common/cefpython_public_api.h"
+#include "include/cef_request_context_handler.h"
+#include "include/base/cef_callback.h"
+
class RequestContextHandler :
public CefRequestContextHandler
{
private:
CefRefPtr browser_;
- typedef cef_plugin_policy_t PluginPolicy;
+ // typedef cef_plugin_policy_t PluginPolicy;
public:
// Browser may be NULL when instantiated from cefpython.CreateBrowserSync.
@@ -29,13 +32,14 @@ class RequestContextHandler :
browser_ = browser;
}
- virtual CefRefPtr GetCookieManager() OVERRIDE;
- virtual bool OnBeforePluginLoad(const CefString& mime_type,
- const CefString& plugin_url,
- bool is_main_frame,
- const CefString& top_origin_url,
- CefRefPtr plugin_info,
- PluginPolicy* plugin_policy) OVERRIDE;
+
+ // virtual CefRefPtr GetCookieManager() OVERRIDE;
+ // virtual bool OnBeforePluginLoad(const CefString& mime_type,
+ // const CefString& plugin_url,
+ // bool is_main_frame,
+ // const CefString& top_origin_url,
+ // CefRefPtr plugin_info,
+ // PluginPolicy* plugin_policy) OVERRIDE;
private:
IMPLEMENT_REFCOUNTING(RequestContextHandler);
diff --git a/src/client_handler/request_handler.cpp b/src/client_handler/request_handler.cpp
index 5227b8921..8e87cf442 100644
--- a/src/client_handler/request_handler.cpp
+++ b/src/client_handler/request_handler.cpp
@@ -4,7 +4,7 @@
#include "request_handler.h"
#include "include/base/cef_logging.h"
-
+#include "include/base/cef_callback.h"
bool RequestHandler::OnBeforeBrowse(CefRefPtr browser,
CefRefPtr frame,
@@ -22,7 +22,7 @@ ReturnValue RequestHandler::OnBeforeResourceLoad(
CefRefPtr browser,
CefRefPtr frame,
CefRefPtr request,
- CefRefPtr callback)
+ CefRefPtr callback)
{
REQUIRE_IO_THREAD();
bool retval = RequestHandler_OnBeforeResourceLoad(browser, frame, request);
@@ -74,7 +74,7 @@ bool RequestHandler::GetAuthCredentials(CefRefPtr browser,
bool RequestHandler::OnQuotaRequest(CefRefPtr browser,
const CefString& origin_url,
int64 new_size,
- CefRefPtr callback) {
+ CefRefPtr callback) {
REQUIRE_IO_THREAD();
return RequestHandler_OnQuotaRequest(browser, origin_url, new_size,
callback);
@@ -94,7 +94,7 @@ bool RequestHandler::OnCertificateError(
cef_errorcode_t cert_error,
const CefString& request_url,
CefRefPtr ssl_info, // not used
- CefRefPtr callback)
+ CefRefPtr callback)
{
REQUIRE_UI_THREAD();
return RequestHandler_OnCertificateError(cert_error, request_url,
@@ -118,17 +118,17 @@ void RequestHandler::OnPluginCrashed(CefRefPtr browser,
RequestHandler_OnPluginCrashed(browser, plugin_path);
}
-bool RequestHandler::CanGetCookies(CefRefPtr browser,
- CefRefPtr frame,
- CefRefPtr request) {
- REQUIRE_IO_THREAD();
- return RequestHandler_CanGetCookies(browser, frame, request);
-}
-
-bool RequestHandler::CanSetCookie(CefRefPtr browser,
- CefRefPtr frame,
- CefRefPtr request,
- const CefCookie& cookie) {
- REQUIRE_IO_THREAD();
- return RequestHandler_CanSetCookie(browser, frame, request, cookie);
-}
+// bool RequestHandler::CanGetCookies(CefRefPtr browser,
+// CefRefPtr frame,
+// CefRefPtr request) {
+// REQUIRE_IO_THREAD();
+// return RequestHandler_CanGetCookies(browser, frame, request);
+// }
+
+// bool RequestHandler::CanSetCookie(CefRefPtr browser,
+// CefRefPtr frame,
+// CefRefPtr request,
+// const CefCookie& cookie) {
+// REQUIRE_IO_THREAD();
+// return RequestHandler_CanSetCookie(browser, frame, request, cookie);
+// }
diff --git a/src/client_handler/request_handler.h b/src/client_handler/request_handler.h
index 7e5e0e6c3..dd6b3a795 100644
--- a/src/client_handler/request_handler.h
+++ b/src/client_handler/request_handler.h
@@ -4,6 +4,7 @@
#include "common/cefpython_public_api.h"
#include "include/cef_request_handler.h"
+#include "include/base/cef_callback.h"
typedef cef_return_value_t ReturnValue;
@@ -23,19 +24,19 @@ class RequestHandler : public CefRequestHandler
ReturnValue OnBeforeResourceLoad(CefRefPtr browser,
CefRefPtr frame,
CefRefPtr request,
- CefRefPtr callback
- ) override;
+ CefRefPtr callback
+ );
CefRefPtr GetResourceHandler(
CefRefPtr browser,
CefRefPtr frame,
- CefRefPtr request) override;
+ CefRefPtr request);
void OnResourceRedirect(CefRefPtr browser,
CefRefPtr frame,
CefRefPtr request,
CefRefPtr response,
- CefString& new_url) override;
+ CefString& new_url);
bool GetAuthCredentials(CefRefPtr browser,
CefRefPtr frame,
@@ -44,37 +45,37 @@ class RequestHandler : public CefRequestHandler
int port,
const CefString& realm,
const CefString& scheme,
- CefRefPtr callback) override;
+ CefRefPtr callback);
bool OnQuotaRequest(CefRefPtr browser,
const CefString& origin_url,
int64 new_size,
- CefRefPtr callback) override;
+ CefRefPtr callback) override;
void OnProtocolExecution(CefRefPtr browser,
const CefString& url,
- bool& allow_os_execution) override;
+ bool& allow_os_execution);
bool OnCertificateError(CefRefPtr browser,
cef_errorcode_t cert_error,
const CefString& request_url,
CefRefPtr ssl_info,
- CefRefPtr callback) override;
+ CefRefPtr callback) override;
void OnRenderProcessTerminated(CefRefPtr browser,
cef_termination_status_t status) override;
void OnPluginCrashed(CefRefPtr browser,
- const CefString& plugin_path) override;
+ const CefString& plugin_path);
- bool CanGetCookies(CefRefPtr browser,
- CefRefPtr frame,
- CefRefPtr request) override;
+ // bool CanGetCookies(CefRefPtr browser,
+ // CefRefPtr frame,
+ // CefRefPtr request);
- bool CanSetCookie(CefRefPtr browser,
- CefRefPtr frame,
- CefRefPtr request,
- const CefCookie& cookie) override;
+ // bool CanSetCookie(CefRefPtr browser,
+ // CefRefPtr frame,
+ // CefRefPtr request,
+ // const CefCookie& cookie);
private:
IMPLEMENT_REFCOUNTING(RequestHandler);
diff --git a/src/client_handler/resource_handler.cpp b/src/client_handler/resource_handler.cpp
index 963575928..9970fe48f 100644
--- a/src/client_handler/resource_handler.cpp
+++ b/src/client_handler/resource_handler.cpp
@@ -28,15 +28,15 @@ bool ResourceHandler::ReadResponse(void* data_out,
bytes_to_read, bytes_read, callback);
}
-bool ResourceHandler::CanGetCookie(const CefCookie& cookie) {
- REQUIRE_IO_THREAD();
- return ResourceHandler_CanGetCookie(resourceHandlerId_, cookie);
-}
+// bool ResourceHandler::CanGetCookie(const CefCookie& cookie) {
+// REQUIRE_IO_THREAD();
+// return ResourceHandler_CanGetCookie(resourceHandlerId_, cookie);
+// }
-bool ResourceHandler::CanSetCookie(const CefCookie& cookie) {
- REQUIRE_IO_THREAD();
- return ResourceHandler_CanSetCookie(resourceHandlerId_, cookie);
-}
+// bool ResourceHandler::CanSetCookie(const CefCookie& cookie) {
+// REQUIRE_IO_THREAD();
+// return ResourceHandler_CanSetCookie(resourceHandlerId_, cookie);
+// }
void ResourceHandler::Cancel() {
REQUIRE_IO_THREAD();
diff --git a/src/client_handler/resource_handler.h b/src/client_handler/resource_handler.h
index 3bf5e41f6..e4ad14e68 100644
--- a/src/client_handler/resource_handler.h
+++ b/src/client_handler/resource_handler.h
@@ -31,11 +31,11 @@ class ResourceHandler : public CefResourceHandler
int& bytes_read,
CefRefPtr callback) override;
- virtual bool CanGetCookie(const CefCookie& cookie) override;
+ // virtual bool CanGetCookie(const CefCookie& cookie) override;
- virtual bool CanSetCookie(const CefCookie& cookie) override;
+ // virtual bool CanSetCookie(const CefCookie& cookie) override;
- virtual void Cancel() OVERRIDE;
+ virtual void Cancel() override;
private:
IMPLEMENT_REFCOUNTING(ResourceHandler);
diff --git a/src/client_handler/string_visitor.h b/src/client_handler/string_visitor.h
index 3765442c5..c36cf40f6 100644
--- a/src/client_handler/string_visitor.h
+++ b/src/client_handler/string_visitor.h
@@ -21,7 +21,7 @@ class StringVisitor : public CefStringVisitor
virtual void Visit(
const CefString& string
- ) OVERRIDE;
+ ) override;
protected:
IMPLEMENT_REFCOUNTING(StringVisitor);
diff --git a/src/client_handler/task.cpp b/src/client_handler/task.cpp
index ec032a2d6..8c38b1140 100644
--- a/src/client_handler/task.cpp
+++ b/src/client_handler/task.cpp
@@ -5,11 +5,12 @@
#include "task.h"
#include "include/wrapper/cef_closure_task.h"
#include "include/base/cef_bind.h"
+#include "include/base/cef_callback.h"
void PostTaskWrapper(int threadId, int taskId) {
CefPostTask(
static_cast(threadId),
- CefCreateClosureTask(base::Bind(
+ CefCreateClosureTask(base::BindOnce(
&PyTaskRunnable,
taskId
))
@@ -19,7 +20,7 @@ void PostTaskWrapper(int threadId, int taskId) {
void PostDelayedTaskWrapper(int threadId, int64 delay_ms, int taskId) {
CefPostDelayedTask(
static_cast(threadId),
- CefCreateClosureTask(base::Bind(
+ CefCreateClosureTask(base::BindOnce(
&PyTaskRunnable,
taskId
)),
@@ -33,7 +34,7 @@ CefRefPtr CreateTask_SetCookie(
const CefCookie& cookie,
CefRefPtr callback)
{
- return CefCreateClosureTask(base::Bind(
+ return CefCreateClosureTask(base::BindOnce(
base::IgnoreResult(&CefCookieManager::SetCookie), obj,
url,
cookie,
@@ -47,7 +48,7 @@ CefRefPtr CreateTask_DeleteCookies(
const CefString& cookie_name,
CefRefPtr callback)
{
- return CefCreateClosureTask(base::Bind(
+ return CefCreateClosureTask(base::BindOnce(
base::IgnoreResult(&CefCookieManager::DeleteCookies), obj,
url,
cookie_name,
diff --git a/src/client_handler/web_request_client.h b/src/client_handler/web_request_client.h
index 8b815a968..1868a1584 100644
--- a/src/client_handler/web_request_client.h
+++ b/src/client_handler/web_request_client.h
@@ -20,26 +20,26 @@ class WebRequestClient : public CefURLRequestClient
}
virtual ~WebRequestClient(){}
- virtual void OnRequestComplete(CefRefPtr request) OVERRIDE;
+ virtual void OnRequestComplete(CefRefPtr request) override;
virtual void OnUploadProgress(CefRefPtr request,
int64 current,
- int64 total) OVERRIDE;
+ int64 total) override;
virtual void OnDownloadProgress(CefRefPtr request,
int64 current,
- int64 total) OVERRIDE;
+ int64 total) override;
virtual void OnDownloadData(CefRefPtr request,
const void* data,
- size_t data_length) OVERRIDE;
+ size_t data_length) override;
virtual bool GetAuthCredentials(bool isProxy,
const CefString& host,
int port,
const CefString& realm,
const CefString& scheme,
- CefRefPtr callback) OVERRIDE;
+ CefRefPtr callback) override;
protected:
IMPLEMENT_REFCOUNTING(WebRequestClient);
diff --git a/src/common/cefpython_public_api.h b/src/common/cefpython_public_api.h
index c796388e6..82a1d1065 100644
--- a/src/common/cefpython_public_api.h
+++ b/src/common/cefpython_public_api.h
@@ -50,6 +50,12 @@
#include "../../build/build_cefpython/cefpython_py38_fixed.h"
#elif PY_MINOR_VERSION == 9
#include "../../build/build_cefpython/cefpython_py39_fixed.h"
+#elif PY_MINOR_VERSION == 10
+#include "../../build/build_cefpython/cefpython_py310_fixed.h"
+#elif PY_MINOR_VERSION == 11
+#include "../../build/build_cefpython/cefpython_py311_fixed.h"
+#else
+#error "Unsupported Python version, please check cefpython_public_api.h"
#endif // PY_MINOR_VERSION
#endif // PY_MAJOR_VERSION
diff --git a/src/compile_time_constants.pxi b/src/compile_time_constants.pxi
index bf130d6ed..023e1b0e9 100644
--- a/src/compile_time_constants.pxi
+++ b/src/compile_time_constants.pxi
@@ -1,8 +1,4 @@
# This file was generated by setup.py
-
-# Type this command to ignore changes to this file:
-# git update-index --assume-unchanged src/compile_time_constants.pxi
-
DEF UNAME_SYSNAME = "Windows"
DEF PY_MAJOR_VERSION = 3
cdef extern from "limits.h":
diff --git a/src/cookie.pyx b/src/cookie.pyx
index 6d90144b0..650232a65 100644
--- a/src/cookie.pyx
+++ b/src/cookie.pyx
@@ -167,16 +167,16 @@ cdef class Cookie:
return self.cefCookie.httponly
cpdef py_void SetCreation(self, object creation):
- DatetimeToCefTimeT(creation, self.cefCookie.creation)
+ DatetimeToCefBasetimeT(creation, self.cefCookie.creation)
cpdef object GetCreation(self):
- return CefTimeTToDatetime(self.cefCookie.creation)
+ return CefBasetimeTToDatetime(self.cefCookie.creation)
cpdef py_void SetLastAccess(self, object lastAccess):
- DatetimeToCefTimeT(lastAccess, self.cefCookie.last_access)
+ DatetimeToCefBasetimeT(lastAccess, self.cefCookie.last_access)
cpdef object GetLastAccess(self):
- return CefTimeTToDatetime(self.cefCookie.last_access)
+ return CefBasetimeTToDatetime(self.cefCookie.last_access)
cpdef py_void SetHasExpires(self, py_bool hasExpires):
self.cefCookie.has_expires = bool(hasExpires)
@@ -185,10 +185,10 @@ cdef class Cookie:
return self.cefCookie.has_expires
cpdef py_void SetExpires(self, object expires):
- DatetimeToCefTimeT(expires, self.cefCookie.expires)
+ DatetimeToCefBasetimeT(expires, self.cefCookie.expires)
cpdef object GetExpires(self):
- return CefTimeTToDatetime(self.cefCookie.expires)
+ return CefBasetimeTToDatetime(self.cefCookie.expires)
# ------------------------------------------------------------------------------
# CookieManager
@@ -204,36 +204,37 @@ class CookieManager(object):
cdef CefRefPtr[CefCookieManager] cefCookieManager
if not g_globalCookieManager:
cefCookieManager = CefCookieManager_GetGlobalManager(
- NULL)
+ nullptr)
g_globalCookieManager = CreatePyCookieManager(cefCookieManager)
return g_globalCookieManager
- @classmethod
- def GetBlockingManager(cls):
- return CreatePyCookieManager(CefCookieManager_GetBlockingManager())
-
- @classmethod
- def CreateManager(cls, py_string path,
- py_bool persist_session_cookies=False):
- """
- Create a new cookie manager.
- :param path:
- :type path: str
- :param persist_session_cookies:
- :type path: bool
- :return: CookieManager object
- :rtype: CookieManager
- """
- # When PyCharm generates a stub for the cefpython module
- # it doesn't use the above docstring for code inspections.
- # No idea why.
- cdef CefRefPtr[CefCookieManager] cefCookieManager
- cefCookieManager = CefCookieManager_CreateManager(
- PyToCefStringValue(path), bool(persist_session_cookies),
- NULL)
- if cefCookieManager != NULL and cefCookieManager.get():
- return CreatePyCookieManager(cefCookieManager)
- return None
+ # @classmethod
+ # def GetBlockingManager(cls):
+ # return CreatePyCookieManager(CefCookieManager_GetBlockingManager())
+
+ # @classmethod
+ # def CreateManager(cls, py_string path,
+ # py_bool persist_session_cookies=False):
+ # """
+ # Create a new cookie manager.
+ # :param path:
+ # :type path: str
+ # :param persist_session_cookies:
+ # :type path: bool
+ # :return: CookieManager object
+ # :rtype: CookieManager
+ # """
+ # # When PyCharm generates a stub for the cefpython module
+ # # it doesn't use the above docstring for code inspections.
+ # # No idea why.
+ # cdef CefRefPtr[CefCookieManager] cefCookieManager
+ # cefCookieManager = CefCookieManager_CreateManager(
+ # PyToCefStringValue(path), bool(persist_session_cookies),
+ # nullptr)
+ # #lc void*
+ # if cefCookieManager.get():
+ # return CreatePyCookieManager(cefCookieManager)
+ # return None
# ------------------------------------------------------------------------------
# PyCookieManager
@@ -248,12 +249,12 @@ cdef PyCookieManager CreatePyCookieManager(
cdef class PyCookieManager:
cdef CefRefPtr[CefCookieManager] cefCookieManager
- cpdef py_void SetSupportedSchemes(self, list schemes):
- cdef cpp_vector[CefString] schemesVector
- for scheme in schemes:
- schemesVector.push_back(PyToCefStringValue(scheme))
- self.cefCookieManager.get().SetSupportedSchemes(schemesVector,
- NULL)
+ # cpdef py_void SetSupportedSchemes(self, list schemes):
+ # cdef cpp_vector[CefString] schemesVector
+ # for scheme in schemes:
+ # schemesVector.push_back(PyToCefStringValue(scheme))
+ # self.cefCookieManager.get().SetSupportedSchemes(schemesVector,
+ # nullptr)
cdef py_void ValidateUserCookieVisitor(self, object userCookieVisitor):
if userCookieVisitor and hasattr(userCookieVisitor, "Visit") and (
@@ -287,23 +288,23 @@ cdef class PyCookieManager:
CefPostTask(TID_IO, CreateTask_SetCookie(
self.cefCookieManager.get(),
PyToCefStringValue(url), cookie.cefCookie,
- NULL))
+ nullptr))
cpdef py_void DeleteCookies(self, py_string url, py_string cookie_name):
CefPostTask(TID_IO, CreateTask_DeleteCookies(
self.cefCookieManager.get(),
PyToCefStringValue(url), PyToCefStringValue(cookie_name),
- NULL))
+ nullptr))
- cpdef py_bool SetStoragePath(self, py_string path,
- py_bool persistSessionCookies=False):
- return self.cefCookieManager.get().SetStoragePath(
- PyToCefStringValue(path), bool(persistSessionCookies),
- NULL)
+ # cpdef py_bool SetStoragePath(self, py_string path,
+ # py_bool persistSessionCookies=False):
+ # return self.cefCookieManager.get().SetStoragePath(
+ # PyToCefStringValue(path), bool(persistSessionCookies),
+ # nullptr)
cpdef py_bool FlushStore(self, callback=None):
return self.cefCookieManager.get().FlushStore(
- NULL)
+ nullptr)
# ------------------------------------------------------------------------------
diff --git a/src/download.pyx b/src/download.pyx
new file mode 100644
index 000000000..f1ce01281
--- /dev/null
+++ b/src/download.pyx
@@ -0,0 +1,73 @@
+include "cefpython.pyx"
+
+cdef class PyDownloadItem:
+ cdef CefRefPtr[CefDownloadItem] cefDownloadItem
+
+ cpdef py_bool IsValid(self):
+ return self.cefDownloadItem.get().IsValid()
+
+ cpdef py_bool IsInProgress(self):
+ return self.cefDownloadItem.get().IsInProgress()
+
+ cpdef py_bool IsComplete(self):
+ return self.cefDownloadItem.get().IsComplete()
+
+ cpdef py_bool IsCanceled(self):
+ return self.cefDownloadItem.get().IsCanceled()
+
+ cpdef object GetCurrentSpeed(self):
+ return self.cefDownloadItem.get().GetCurrentSpeed()
+
+ cpdef object GetPercentComplete(self):
+ return self.cefDownloadItem.get().GetPercentComplete()
+
+ cpdef object GetTotalBytes(self):
+ return self.cefDownloadItem.get().GetTotalBytes()
+
+ cpdef object GetReceivedBytes(self):
+ return self.cefDownloadItem.get().GetReceivedBytes()
+
+ cpdef object GetStartTime(self):
+ return self.cefDownloadItem.get().GetStartTime()
+
+ cpdef object GetEndTime(self):
+ return self.cefDownloadItem.get().GetEndTime()
+
+ cpdef str GetFullPath(self):
+ return CefToPyString(self.cefDownloadItem.get().GetFullPath())
+
+ cpdef object GetId(self):
+ return self.cefDownloadItem.get().GetId()
+
+ cpdef str GetURL(self):
+ return CefToPyString(self.cefDownloadItem.get().GetURL())
+
+ cpdef str GetOriginalUrl(self):
+ return CefToPyString(self.cefDownloadItem.get().GetOriginalUrl())
+
+ cpdef str GetSuggestedFileName(self):
+ return CefToPyString(self.cefDownloadItem.get().GetSuggestedFileName())
+
+ cpdef str GetContentDisposition(self):
+ return CefToPyString(self.cefDownloadItem.get().GetContentDisposition())
+
+ cpdef str GetMimeType(self):
+ return CefToPyString(self.cefDownloadItem.get().GetMimeType())
+
+cdef class PyBeforeDownloadCallback:
+ cdef CefRefPtr[CefBeforeDownloadCallback] cefBeforeDownloadCallback
+
+ cpdef Continue(self, str downloadPath, py_bool showDialog):
+ self.cefBeforeDownloadCallback.get().Continue(PyToCefStringValue(downloadPath), showDialog)
+
+cdef class PyDownloadItemCallback:
+ cdef CefRefPtr[CefDownloadItemCallback] cefDownloadItemCallback
+
+ cpdef Cancel(self):
+ self.cefDownloadItemCallback.get().Cancel()
+
+ cpdef Pause(self):
+ self.cefDownloadItemCallback.get().Pause()
+
+ cpdef Resume(self):
+ self.cefDownloadItemCallback.get().Resume()
\ No newline at end of file
diff --git a/src/extern/cef/cef_browser.pxd b/src/extern/cef/cef_browser.pxd
index da209d5c3..f96492693 100644
--- a/src/extern/cef/cef_browser.pxd
+++ b/src/extern/cef/cef_browser.pxd
@@ -66,7 +66,7 @@ cdef extern from "include/cef_browser.h":
CefRefPtr[CefRequestContext] GetRequestContext()
- void Find(int identifier, const CefString& searchText, cpp_bool forward,
+ void Find(const CefString& searchText, cpp_bool forward,
cpp_bool matchCase, cpp_bool findNext)
void StopFinding(cpp_bool clearSelection)
void Print()
@@ -113,5 +113,5 @@ cdef extern from "include/cef_browser.h":
void StopLoad()
cpp_bool IsLoading()
int GetIdentifier()
- cpp_bool SendProcessMessage(CefProcessId target_process,
- CefRefPtr[CefProcessMessage] message)
+ # cpp_bool SendProcessMessage(CefProcessId target_process,
+ # CefRefPtr[CefProcessMessage] message)
diff --git a/src/extern/cef/cef_browser_static.pxd b/src/extern/cef/cef_browser_static.pxd
index 17b1a283d..a668968be 100644
--- a/src/extern/cef/cef_browser_static.pxd
+++ b/src/extern/cef/cef_browser_static.pxd
@@ -19,6 +19,7 @@ from cef_request_context cimport CefRequestContext
# noinspection PyUnresolvedReferences
from cef_browser cimport CefBrowser
from cef_string cimport CefString
+from cef_values cimport CefDictionaryValue
# Specifying namespace allows to import a static method.
cdef extern from "include/cef_browser.h" namespace "CefBrowserHost":
@@ -28,4 +29,5 @@ cdef extern from "include/cef_browser.h" namespace "CefBrowserHost":
CefRefPtr[CefClient],
CefString&,
CefBrowserSettings&,
+ CefRefPtr[CefDictionaryValue],
CefRefPtr[CefRequestContext]) nogil
diff --git a/src/extern/cef/cef_cookie.pxd b/src/extern/cef/cef_cookie.pxd
index c113aea9a..ad7eba595 100644
--- a/src/extern/cef/cef_cookie.pxd
+++ b/src/extern/cef/cef_cookie.pxd
@@ -4,7 +4,7 @@
from cef_string cimport cef_string_t
from libcpp cimport bool as cpp_bool
-from cef_time cimport cef_time_t
+from cef_time cimport cef_time_t, cef_basetime_t
from libcpp.vector cimport vector as cpp_vector
from cef_string cimport CefString
from cef_ptr cimport CefRefPtr
@@ -19,10 +19,10 @@ cdef extern from "include/cef_cookie.h":
cef_string_t path
cpp_bool secure
cpp_bool httponly
- cef_time_t creation
- cef_time_t last_access
+ cef_basetime_t creation
+ cef_basetime_t last_access
cpp_bool has_expires
- cef_time_t expires
+ cef_basetime_t expires
cdef CefRefPtr[CefCookieManager] CefCookieManager_GetGlobalManager \
"CefCookieManager::GetGlobalManager"(
diff --git a/src/extern/cef/cef_download_handler.pxd b/src/extern/cef/cef_download_handler.pxd
new file mode 100644
index 000000000..835ed7890
--- /dev/null
+++ b/src/extern/cef/cef_download_handler.pxd
@@ -0,0 +1,13 @@
+include "compile_time_constants.pxi"
+
+from libcpp cimport bool as cpp_bool
+from cef_string cimport CefString
+
+cdef extern from "include/cef_download_handler.h":
+ cdef cppclass CefBeforeDownloadCallback:
+ void Continue(const CefString& download_path, cpp_bool show_dialog)
+
+ cdef cppclass CefDownloadItemCallback:
+ void Cancel()
+ void Pause()
+ void Resume()
\ No newline at end of file
diff --git a/src/extern/cef/cef_download_item.pxd b/src/extern/cef/cef_download_item.pxd
new file mode 100644
index 000000000..360172309
--- /dev/null
+++ b/src/extern/cef/cef_download_item.pxd
@@ -0,0 +1,44 @@
+include "compile_time_constants.pxi"
+
+from libcpp cimport bool as cpp_bool
+from cef_string cimport CefString
+from cef_time cimport cef_time_t, cef_basetime_t
+from cef_types cimport (
+ int32, uint32, int64, uint64
+)
+
+cdef extern from "include/cef_download_item.h":
+ cdef cppclass CefDownloadItem:
+ cpp_bool IsValid()
+
+ cpp_bool IsInProgress()
+
+ cpp_bool IsComplete()
+
+ cpp_bool IsCanceled()
+
+ int64 GetCurrentSpeed()
+
+ int GetPercentComplete()
+
+ int64 GetTotalBytes()
+
+ int64 GetReceivedBytes()
+
+ cef_basetime_t GetStartTime()
+
+ cef_basetime_t GetEndTime()
+
+ CefString GetFullPath()
+
+ uint32 GetId()
+
+ CefString GetURL()
+
+ CefString GetOriginalUrl()
+
+ CefString GetSuggestedFileName()
+
+ CefString GetContentDisposition()
+
+ CefString GetMimeType()
\ No newline at end of file
diff --git a/src/extern/cef/cef_frame.pxd b/src/extern/cef/cef_frame.pxd
index 28cdceee2..ecd596d2e 100644
--- a/src/extern/cef/cef_frame.pxd
+++ b/src/extern/cef/cef_frame.pxd
@@ -10,6 +10,7 @@ from libcpp cimport bool as cpp_bool
from cef_ptr cimport CefRefPtr
from cef_browser cimport CefBrowser
from cef_string_visitor cimport CefStringVisitor
+from cef_process_message cimport CefProcessMessage, CefProcessId
cdef extern from "include/cef_frame.h":
@@ -35,3 +36,5 @@ cdef extern from "include/cef_frame.h":
CefString GetName()
CefRefPtr[CefFrame] GetParent()
CefRefPtr[CefBrowser] GetBrowser()
+ cpp_bool SendProcessMessage(CefProcessId target_process,
+ CefRefPtr[CefProcessMessage] message)
diff --git a/src/extern/cef/cef_ptr.pxd b/src/extern/cef/cef_ptr.pxd
index c5d9877cf..c2a860a75 100644
--- a/src/extern/cef/cef_ptr.pxd
+++ b/src/extern/cef/cef_ptr.pxd
@@ -1,6 +1,8 @@
# Copyright (c) 2012 CEF Python, see the Authors file.
# All rights reserved. Licensed under BSD 3-clause license.
# Project website: https://github.com/cztomczak/cefpython
+from libcpp cimport nullptr_t, nullptr
+from libcpp cimport bool as cpp_bool
cdef extern from "include/internal/cef_ptr.h":
cdef cppclass CefRefPtr[T]:
@@ -14,4 +16,15 @@ cdef extern from "include/internal/cef_ptr.h":
# noinspection PyUnresolvedReferences
void swap(CefRefPtr[T]& r)
# noinspection PyUnresolvedReferences
+ CefRefPtr[T]& Assign "operator="(nullptr_t)
+
CefRefPtr[T]& Assign "operator="(T* p)
+
+
+
+# cdef class PyCefRefPtr[T]:
+# cdef CefRefPtr[T]* thisptr
+# def __init__(self, T* p):
+# self.thisptr = new CefRefPtr[T](p)
+# def __eq__(self, other):
+# return self.thisptr.operator==(*other.thisptr)
\ No newline at end of file
diff --git a/src/extern/cef/cef_request_context.pxd b/src/extern/cef/cef_request_context.pxd
index 116741749..1107cb6fc 100644
--- a/src/extern/cef/cef_request_context.pxd
+++ b/src/extern/cef/cef_request_context.pxd
@@ -16,5 +16,5 @@ cdef extern from "include/cef_request_context.h":
CefRefPtr[CefRequestContext] CreateContext(
CefRefPtr[CefRequestContext] other,
CefRefPtr[CefRequestContextHandler] handler)
- CefRefPtr[CefCookieManager] GetDefaultCookieManager(
+ CefRefPtr[CefCookieManager] GetCookieManager(
CefRefPtr[CefCompletionCallback] callback)
diff --git a/src/extern/cef/cef_request_handler.pxd b/src/extern/cef/cef_request_handler.pxd
index 96a7d88c6..8287f886c 100644
--- a/src/extern/cef/cef_request_handler.pxd
+++ b/src/extern/cef/cef_request_handler.pxd
@@ -12,6 +12,6 @@ cdef extern from "include/cef_auth_callback.h":
void Cancel()
cdef extern from "include/cef_request_handler.h":
- cdef cppclass CefRequestCallback:
+ cdef cppclass CefCallback:
void Continue(cpp_bool allow)
void Cancel()
diff --git a/src/extern/cef/cef_response.pxd b/src/extern/cef/cef_response.pxd
index ef6729f12..9c08a0ec1 100644
--- a/src/extern/cef/cef_response.pxd
+++ b/src/extern/cef/cef_response.pxd
@@ -21,6 +21,6 @@ cdef extern from "include/cef_response.h":
void SetStatusText(CefString& statusText)
CefString GetMimeType()
void SetMimeType(CefString& mimeType)
- CefString GetHeader(CefString& name)
+ CefString GetHeaderByName(CefString& name)
void GetHeaderMap(CefResponseHeaderMap& headerMap)
void SetHeaderMap(CefResponseHeaderMap& headerMap)
diff --git a/src/extern/cef/cef_scoped_ptr.pxd b/src/extern/cef/cef_scoped_ptr.pxd
deleted file mode 100644
index 2e770a5b9..000000000
--- a/src/extern/cef/cef_scoped_ptr.pxd
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (c) 2016 CEF Python, see the Authors file.
-# All rights reserved. Licensed under BSD 3-clause license.
-# Project website: https://github.com/cztomczak/cefpython
-
-cdef extern from "include/base/cef_scoped_ptr.h":
- cdef cppclass scoped_ptr[T]:
- scoped_ptr()
- # noinspection PyUnresolvedReferences
- scoped_ptr(T* p)
- # noinspection PyUnresolvedReferences
- void reset()
- # noinspection PyUnresolvedReferences
- void reset(T* p)
- # noinspection PyUnresolvedReferences
- T* get()
- # noinspection PyUnresolvedReferences
- scoped_ptr[T]& Assign "operator="(scoped_ptr[T] p)
diff --git a/src/extern/cef/cef_scoped_refptr.pxd b/src/extern/cef/cef_scoped_refptr.pxd
new file mode 100644
index 000000000..d85e7261e
--- /dev/null
+++ b/src/extern/cef/cef_scoped_refptr.pxd
@@ -0,0 +1,25 @@
+# Copyright (c) 2016 CEF Python, see the Authors file.
+# All rights reserved. Licensed under BSD 3-clause license.
+# Project website: https://github.com/cztomczak/cefpython
+from libcpp cimport nullptr_t, nullptr
+from libcpp cimport bool as cpp_bool
+
+cdef extern from "include/base/cef_scoped_refptr.h":
+ cdef cppclass scoped_refptr[T]:
+ scoped_refptr()
+ # noinspection PyUnresolvedReferences
+ scoped_refptr(T* p)
+ # noinspection PyUnresolvedReferences
+ void reset()
+ # noinspection PyUnresolvedReferences
+ void reset(T* p)
+ # noinspection PyUnresolvedReferences
+ T* get()
+ # noinspection PyUnresolvedReferences
+ scoped_refptr[T]& Assign "operator="(nullptr_t)
+
+ scoped_refptr[T]& Assign "operator="(scoped_refptr[T] p)
+
+ #cpp_bool Assign "operator=="(const scoped_refptr[U]& rhs) const
+
+ #cpp_bool Assign "operator!="(const scoped_refptr[U]& rhs) const
diff --git a/src/extern/cef/cef_time.pxd b/src/extern/cef/cef_time.pxd
index cdbdc639f..7387df57e 100644
--- a/src/extern/cef/cef_time.pxd
+++ b/src/extern/cef/cef_time.pxd
@@ -3,6 +3,7 @@
# Project website: https://github.com/cztomczak/cefpython
from ctime cimport time_t
+from cef_types cimport int64
cdef extern from "include/internal/cef_time.h":
ctypedef struct cef_time_t:
@@ -15,6 +16,9 @@ cdef extern from "include/internal/cef_time.h":
int second
int millisecond
+ ctypedef struct cef_basetime_t:
+ int64 val
+
cdef extern from "include/internal/cef_types.h":
cdef cppclass CefTime:
CefTime()
diff --git a/src/extern/cef/cef_types.pxd b/src/extern/cef/cef_types.pxd
index 6bd21ba46..a0055c17d 100644
--- a/src/extern/cef/cef_types.pxd
+++ b/src/extern/cef/cef_types.pxd
@@ -34,7 +34,7 @@ cdef extern from "include/internal/cef_types.h":
ctypedef struct CefSettings:
cef_string_t accept_language_list
- int single_process
+ # int single_process
cef_string_t browser_subprocess_path
int command_line_args_disabled
cef_string_t cache_path
diff --git a/src/extern/cef/cef_web_plugin.pxd b/src/extern/cef/cef_web_plugin.pxd
index 25d33fa9d..0db45b27a 100644
--- a/src/extern/cef/cef_web_plugin.pxd
+++ b/src/extern/cef/cef_web_plugin.pxd
@@ -6,9 +6,9 @@ from cef_string cimport CefString
# CEF 3 only.
-cdef extern from "include/cef_web_plugin.h":
- cdef cppclass CefWebPluginInfo:
- CefString GetName()
- CefString GetPath()
- CefString GetVersion()
- CefString GetDescription()
+# cdef extern from "include/cef_web_plugin.h":
+# cdef cppclass CefWebPluginInfo:
+# CefString GetName()
+# CefString GetPath()
+# CefString GetVersion()
+# CefString GetDescription()
diff --git a/src/extern/cef/cef_win.pxd b/src/extern/cef/cef_win.pxd
index 5e341b75b..7a579bea7 100644
--- a/src/extern/cef/cef_win.pxd
+++ b/src/extern/cef/cef_win.pxd
@@ -8,6 +8,7 @@ include "compile_time_constants.pxi"
from windows cimport HWND, RECT, HINSTANCE, HCURSOR
from cef_string cimport CefString
from libcpp cimport bool as cpp_bool
+from cef_types cimport CefRect
cdef extern from "include/internal/cef_win.h":
@@ -18,7 +19,7 @@ cdef extern from "include/internal/cef_win.h":
cdef cppclass CefWindowInfo:
void SetAsChild(CefWindowHandle parent,
- RECT windowRect)
+ const CefRect windowRect)
void SetAsPopup(CefWindowHandle parent,
const CefString& windowName)
void SetAsWindowless(CefWindowHandle parent)
diff --git a/src/extern/main_message_loop.pxd b/src/extern/main_message_loop.pxd
index 486f309af..3182214e3 100644
--- a/src/extern/main_message_loop.pxd
+++ b/src/extern/main_message_loop.pxd
@@ -2,11 +2,13 @@
# All rights reserved. Licensed under BSD 3-clause license.
# Project website: https://github.com/cztomczak/cefpython
-from cef_scoped_ptr cimport scoped_ptr
+from libcpp.memory cimport unique_ptr
+
+from cef_scoped_refptr cimport scoped_refptr
cdef extern from \
"subprocess/main_message_loop/main_message_loop_external_pump.h":
cdef cppclass MainMessageLoopExternalPump:
@staticmethod
- scoped_ptr[MainMessageLoopExternalPump] Create()
+ unique_ptr[MainMessageLoopExternalPump] Create()
diff --git a/src/frame.pyx b/src/frame.pyx
index 812e4b3c9..15f33ca3e 100644
--- a/src/frame.pyx
+++ b/src/frame.pyx
@@ -22,8 +22,8 @@ cdef PyFrame GetPyFrameById(int browserId, object frameId):
cdef PyFrame GetPyFrame(CefRefPtr[CefFrame] cefFrame):
global g_pyFrames
-
- if cefFrame == NULL or not cefFrame.get():
+#lc void*
+ if not cefFrame.get():
raise Exception("GetPyFrame(): CefFrame reference is NULL")
cdef PyFrame pyFrame
@@ -89,7 +89,7 @@ cdef void RemovePyFrame(int browserId, object frameId) except *:
if uniqueFrameId in g_pyFrames:
Debug("del g_pyFrames[%s]" % uniqueFrameId)
pyFrame = g_pyFrames[uniqueFrameId]
- pyFrame.cefFrame.Assign(NULL)
+ pyFrame.cefFrame.Assign(nullptr)
del pyFrame
del g_pyFrames[uniqueFrameId]
g_unreferenced_frames.append(uniqueFrameId)
@@ -109,7 +109,7 @@ cdef void RemovePyFramesForBrowser(int browserId) except *:
for uniqueFrameId in toRemove:
Debug("del g_pyFrames[%s]" % uniqueFrameId)
pyFrame = g_pyFrames[uniqueFrameId]
- pyFrame.cefFrame.Assign(NULL)
+ pyFrame.cefFrame.Assign(nullptr)
del pyFrame
del g_pyFrames[uniqueFrameId]
g_unreferenced_frames.append(uniqueFrameId)
@@ -125,16 +125,18 @@ cdef class PyFrame:
# Do not call IsValid() here, if the frame does not exist
# then no big deal, no reason to crash the application.
# The CEF calls will fail, but they also won't cause crash.
- if self.cefFrame != NULL and self.cefFrame.get():
+ #lc void*
+ if self.cefFrame.get():
return self.cefFrame
raise Exception("PyFrame.GetCefFrame() failed: CefFrame was destroyed")
- def __init__(self, int browserId, int frameId):
+ def __init__(self, int browserId, int64 frameId):
self.browserId = browserId
self.frameId = frameId
cpdef py_bool IsValid(self):
- if self.cefFrame != NULL and self.cefFrame.get() \
+ #lc void*
+ if self.cefFrame.get() \
and self.cefFrame.get().IsValid():
return True
return False
@@ -203,12 +205,12 @@ cdef class PyFrame:
cpdef py_bool IsMain(self):
return self.GetCefFrame().get().IsMain()
- cpdef py_void LoadString(self, py_string value, py_string url):
- cdef CefString cefValue
- cdef CefString cefUrl
- PyToCefString(value, cefValue)
- PyToCefString(url, cefUrl)
- self.GetCefFrame().get().LoadString(cefValue, cefUrl)
+ # cpdef py_void LoadString(self, py_string value, py_string url):
+ # cdef CefString cefValue
+ # cdef CefString cefUrl
+ # PyToCefString(value, cefValue)
+ # PyToCefString(url, cefUrl)
+ # self.GetCefFrame().get().LoadString(cefValue, cefUrl)
cpdef py_void LoadUrl(self, py_string url):
cdef CefString cefUrl
@@ -229,3 +231,31 @@ cdef class PyFrame:
cpdef py_void ViewSource(self):
self.GetCefFrame().get().ViewSource()
+
+ cdef void SendProcessMessage(self, cef_process_id_t targetProcess,
+ object frameId, py_string messageName, list pyArguments
+ ) except *:
+ cdef CefRefPtr[CefProcessMessage] message = \
+ CefProcessMessage_Create(PyToCefStringValue(messageName))
+ # This does not work, no idea why, the CEF implementation
+ # seems not to allow it, both Assign() and swap() do not work:
+ # | message.get().GetArgumentList().Assign(arguments.get())
+ # | message.get().GetArgumentList().swap(arguments)
+ cdef CefRefPtr[CefListValue] messageArguments = \
+ message.get().GetArgumentList()
+ PyListToExistingCefListValue(self.GetBrowserIdentifier(),
+ frameId,
+ pyArguments, messageArguments)
+ Debug("SendProcessMessage(): message=%s, arguments size=%d" % (
+ messageName,
+ message.get().GetArgumentList().get().GetSize()))
+ #lc test
+ # cdef cpp_bool success = \
+ # self.GetCefFrame().get().SendProcessMessage(
+ # targetProcess,
+ # message)
+ # if not success:
+ # raise Exception("Frame.SendProcessMessage() failed: "\
+ # "messageName=%s" % messageName)
+
+ self.GetCefFrame().get().SendProcessMessage(targetProcess, message)
diff --git a/src/handlers/browser_process_handler.pyx b/src/handlers/browser_process_handler.pyx
index 09463b0ef..276d73ce1 100644
--- a/src/handlers/browser_process_handler.pyx
+++ b/src/handlers/browser_process_handler.pyx
@@ -4,14 +4,14 @@
include "../cefpython.pyx"
-cdef public void BrowserProcessHandler_OnRenderProcessThreadCreated(
- CefRefPtr[CefListValue] extra_info
- ) except * with gil:
- try:
- pass
- except:
- (exc_type, exc_value, exc_trace) = sys.exc_info()
- sys.excepthook(exc_type, exc_value, exc_trace)
+# cdef public void BrowserProcessHandler_OnRenderProcessThreadCreated(
+# CefRefPtr[CefListValue] extra_info
+# ) except * with gil:
+# try:
+# pass
+# except:
+# (exc_type, exc_value, exc_trace) = sys.exc_info()
+# sys.excepthook(exc_type, exc_value, exc_trace)
cdef public void BrowserProcessHandler_OnBeforeChildProcessLaunch(
CefRefPtr[CefCommandLine] cefCommandLine
diff --git a/src/handlers/download_handler.pyx b/src/handlers/download_handler.pyx
new file mode 100644
index 000000000..8d88ede2e
--- /dev/null
+++ b/src/handlers/download_handler.pyx
@@ -0,0 +1,50 @@
+
+
+cdef public void DownloadHandler_OnBeforeDownload(
+ CefRefPtr[CefBrowser] cefBrowser,
+ CefRefPtr[CefDownloadItem] cefDownloadItem,
+ const CefString& cefSuggestedName,
+ CefRefPtr[CefBeforeDownloadCallback] cefCallback
+ ) except * with gil:
+ cdef PyBrowser pyBrowser
+ cdef PyDownloadItem pyDownloadItem
+ cdef str pySuggestedName
+ cdef PyBeforeDownloadCallback pyBeforeDownloadCallback
+ cdef object callback
+ try:
+ pyBrowser = GetPyBrowser(cefBrowser, "OnBeforeDownload")
+ callback = pyBrowser.GetClientCallback("OnBeforeDownload")
+ pyDownloadItem = PyDownloadItem()
+ pyDownloadItem.cefDownloadItem = cefDownloadItem
+ pySuggestedName = CefToPyString(cefSuggestedName)
+ pyBeforeDownloadCallback = PyBeforeDownloadCallback()
+ pyBeforeDownloadCallback.cefBeforeDownloadCallback = cefCallback
+ if callback:
+ callback(browser=pyBrowser, downloadItem=pyDownloadItem,
+ suggestedName=pySuggestedName, callback=pyBeforeDownloadCallback)
+ except:
+ (exc_type, exc_value, exc_trace) = sys.exc_info()
+ sys.excepthook(exc_type, exc_value, exc_trace)
+
+cdef public void DownloadHandler_OnDownloadUpdated(
+ CefRefPtr[CefBrowser] cefBrowser,
+ CefRefPtr[CefDownloadItem] cefDownloadItem,
+ CefRefPtr[CefDownloadItemCallback] cefCallback
+ ) except * with gil:
+ cdef PyBrowser pyBrowser
+ cdef PyDownloadItem pyDownloadItem
+ cdef PyDownloadItemCallback pyDownloadItemCallback
+ cdef object callback
+ try:
+ pyBrowser = GetPyBrowser(cefBrowser, "OnDownloadUpdated")
+ callback = pyBrowser.GetClientCallback("OnDownloadUpdated")
+ pyDownloadItem = PyDownloadItem()
+ pyDownloadItem.cefDownloadItem = cefDownloadItem
+ pyDownloadItemCallback = PyDownloadItemCallback()
+ pyDownloadItemCallback.cefDownloadItemCallback = cefCallback
+ if callback:
+ callback(browser=pyBrowser, downloadItem=pyDownloadItem,
+ callback=pyDownloadItemCallback)
+ except:
+ (exc_type, exc_value, exc_trace) = sys.exc_info()
+ sys.excepthook(exc_type, exc_value, exc_trace)
\ No newline at end of file
diff --git a/src/handlers/lifespan_handler.pyx b/src/handlers/lifespan_handler.pyx
index bfe22bd11..48a39d429 100644
--- a/src/handlers/lifespan_handler.pyx
+++ b/src/handlers/lifespan_handler.pyx
@@ -34,6 +34,7 @@ cdef public cpp_bool LifespanHandler_OnBeforePopup(
CefWindowInfo& windowInfo,
CefRefPtr[CefClient]& client,
CefBrowserSettings& settings,
+ CefRefPtr[CefDictionaryValue]& extra_info,
cpp_bool* noJavascriptAccess
) except * with gil:
# Empty place-holders: popupFeatures, client.
@@ -67,6 +68,7 @@ cdef public cpp_bool LifespanHandler_OnBeforePopup(
window_info_out=pyWindowInfo,
client=None,
browser_settings_out=pyBrowserSettings,
+ extra_info=None,
no_javascript_access_out=pyNoJavascriptAccess))
noJavascriptAccess[0] = bool(pyNoJavascriptAccess[0])
if len(pyBrowserSettings):
@@ -133,13 +135,13 @@ cdef public void LifespanHandler_OnBeforeClose(
# GetCookieManager to implement custom cookie managers then
# flushing of cookies would need to be handled manually.
cefBrowser.get().GetHost().get().GetRequestContext().get() \
- .GetDefaultCookieManager(
- NULL) \
- .get().FlushStore(NULL)
+ .GetCookieManager(
+ nullptr) \
+ .get().FlushStore(nullptr)
browserId = pyBrowser.GetIdentifier()
- pyBrowser.cefBrowser.Assign(NULL)
- cefBrowser.Assign(NULL)
+ pyBrowser.cefBrowser.Assign(nullptr)
+ cefBrowser.Assign(nullptr)
del pyBrowser
RemovePythonCallbacksForBrowser(browserId)
diff --git a/src/handlers/request_handler.pyx b/src/handlers/request_handler.pyx
index 866942bfd..be997a347 100644
--- a/src/handlers/request_handler.pyx
+++ b/src/handlers/request_handler.pyx
@@ -37,16 +37,19 @@ cdef class PyAuthCallback:
# -----------------------------------------------------------------------------
cdef PyRequestCallback CreatePyRequestCallback(
- CefRefPtr[CefRequestCallback] cefCallback):
+ CefRefPtr[CefCallback] cefCallback):
cdef PyRequestCallback pyCallback = PyRequestCallback()
pyCallback.cefCallback = cefCallback
return pyCallback
cdef class PyRequestCallback:
- cdef CefRefPtr[CefRequestCallback] cefCallback
+ cdef CefRefPtr[CefCallback] cefCallback
cpdef py_void Continue(self, py_bool allow):
- self.cefCallback.get().Continue(bool(allow))
+ if allow:
+ self.cefCallback.get().Continue()
+ else:
+ self.cefCallback.get().Cancel()
cpdef py_void Cancel(self):
self.cefCallback.get().Cancel()
@@ -140,7 +143,7 @@ cdef public CefRefPtr[CefResourceHandler] RequestHandler_GetResourceHandler(
# Issue #455: CefRequestHandler callbacks still executed after
# browser was closed.
if IsBrowserClosed(cefBrowser):
- return NULL
+ return nullptr
pyBrowser = GetPyBrowser(cefBrowser, "GetResourceHandler")
pyFrame = GetPyFrame(cefFrame)
@@ -154,9 +157,9 @@ cdef public CefRefPtr[CefResourceHandler] RequestHandler_GetResourceHandler(
if returnValue:
return CreateResourceHandler(returnValue)
else:
- return NULL
+ return nullptr
else:
- return NULL
+ return nullptr
except:
(exc_type, exc_value, exc_trace) = sys.exc_info()
sys.excepthook(exc_type, exc_value, exc_trace)
@@ -280,7 +283,7 @@ cdef public cpp_bool RequestHandler_OnQuotaRequest(
CefRefPtr[CefBrowser] cefBrowser,
const CefString& cefOriginUrl,
int64 newSize,
- CefRefPtr[CefRequestCallback] cefRequestCallback
+ CefRefPtr[CefCallback] CefCallback
) except * with gil:
cdef PyBrowser pyBrowser
cdef py_string pyOriginUrl
@@ -300,7 +303,7 @@ cdef public cpp_bool RequestHandler_OnQuotaRequest(
browser=pyBrowser,
origin_url=pyOriginUrl,
new_size=newSize,
- callback=CreatePyRequestCallback(cefRequestCallback))
+ callback=CreatePyRequestCallback(CefCallback))
return bool(returnValue)
else:
return False
@@ -308,48 +311,48 @@ cdef public cpp_bool RequestHandler_OnQuotaRequest(
(exc_type, exc_value, exc_trace) = sys.exc_info()
sys.excepthook(exc_type, exc_value, exc_trace)
-
-cdef public CefRefPtr[CefCookieManager] RequestHandler_GetCookieManager(
- CefRefPtr[CefBrowser] cefBrowser,
- const CefString& cefMainUrl
- ) except * with gil:
- # In CEF the GetCookieManager callback belongs to
- # CefRequestContextHandler.
- # In an exceptional case the browser parameter may be None
- # due to limitation in CEF API. No workaround as of now.
- cdef PyBrowser pyBrowser
- cdef str pyMainUrl
- cdef object clientCallback
- cdef PyCookieManager returnValue
- try:
- # Issue #429: in some cases due to a race condition the browser
- # may be NULL.
- if not cefBrowser.get():
- return NULL
-
- # Issue #455: CefRequestHandler callbacks still executed after
- # browser was closed.
- if IsBrowserClosed(cefBrowser):
- return NULL
-
- pyBrowser = GetPyBrowser(cefBrowser, "GetCookieManager")
- pyMainUrl = CefToPyString(cefMainUrl)
- clientCallback = pyBrowser.GetClientCallback("GetCookieManager")
- if clientCallback:
- returnValue = clientCallback(
- browser=pyBrowser,
- main_url=pyMainUrl)
- if returnValue:
- if isinstance(returnValue, PyCookieManager):
- return returnValue.cefCookieManager
- else:
- raise Exception("Expected a CookieManager object")
- return NULL
- else:
- return NULL
- except:
- (exc_type, exc_value, exc_trace) = sys.exc_info()
- sys.excepthook(exc_type, exc_value, exc_trace)
+#LC TEST
+# cdef public CefRefPtr[CefCookieManager] RequestHandler_GetCookieManager(
+# CefRefPtr[CefBrowser] cefBrowser,
+# const CefString& cefMainUrl
+# ) except * with gil:
+# # In CEF the GetCookieManager callback belongs to
+# # CefRequestContextHandler.
+# # In an exceptional case the browser parameter may be None
+# # due to limitation in CEF API. No workaround as of now.
+# cdef PyBrowser pyBrowser
+# cdef str pyMainUrl
+# cdef object clientCallback
+# cdef PyCookieManager returnValue
+# try:
+# # Issue #429: in some cases due to a race condition the browser
+# # may be nullptr.
+# if not cefBrowser.get():
+# return nullptr
+
+# # Issue #455: CefRequestHandler callbacks still executed after
+# # browser was closed.
+# if IsBrowserClosed(cefBrowser):
+# return nullptr
+
+# pyBrowser = GetPyBrowser(cefBrowser, "GetCookieManager")
+# pyMainUrl = CefToPyString(cefMainUrl)
+# clientCallback = pyBrowser.GetClientCallback("GetCookieManager")
+# if clientCallback:
+# returnValue = clientCallback(
+# browser=pyBrowser,
+# main_url=pyMainUrl)
+# if returnValue:
+# if isinstance(returnValue, PyCookieManager):
+# return returnValue.cefCookieManager
+# else:
+# raise Exception("Expected a CookieManager object")
+# return nullptr
+# else:
+# return nullptr
+# except:
+# (exc_type, exc_value, exc_trace) = sys.exc_info()
+# sys.excepthook(exc_type, exc_value, exc_trace)
cdef public void RequestHandler_OnProtocolExecution(
@@ -388,60 +391,60 @@ cdef public void RequestHandler_OnProtocolExecution(
sys.excepthook(exc_type, exc_value, exc_trace)
-cdef public cpp_bool RequestHandler_OnBeforePluginLoad(
- CefRefPtr[CefBrowser] browser,
- const CefString& mime_type,
- const CefString& plugin_url,
- cpp_bool is_main_frame,
- const CefString& top_origin_url,
- CefRefPtr[CefWebPluginInfo] plugin_info,
- cef_types.cef_plugin_policy_t* plugin_policy
- ) except * with gil:
- cdef PyBrowser pyBrowser
- cdef PyWebPluginInfo pyInfo
- cdef py_bool returnValue
- cdef object clientCallback
- try:
- # OnBeforePluginLoad is called from RequestContexthandler.
- # The Browser object might not be available, because it is
- # being set synchronously during CreateBrowserSync, after
- # Browser is created. From testing it always works, however
- # better be safe.
- if not browser.get():
- Debug("WARNING: RequestHandler_OnBeforePluginLoad() failed,"
- " Browser object is not available")
- return False
-
- # Issue #455: CefRequestHandler callbacks still executed after
- # browser was closed.
- if IsBrowserClosed(browser):
- return False
-
- py_browser = GetPyBrowser(browser, "OnBeforePluginLoad")
- py_plugin_info = CreatePyWebPluginInfo(plugin_info)
- clientCallback = GetGlobalClientCallback("OnBeforePluginLoad")
- if clientCallback:
- returnValue = clientCallback(
- browser=py_browser,
- mime_type=CefToPyString(mime_type),
- plugin_url=CefToPyString(plugin_url),
- is_main_frame=bool(is_main_frame),
- top_origin_url=CefToPyString(top_origin_url),
- plugin_info=py_plugin_info)
- if returnValue:
- plugin_policy[0] = cef_types.PLUGIN_POLICY_DISABLE
- return bool(returnValue)
- else:
- return False
- except:
- (exc_type, exc_value, exc_trace) = sys.exc_info()
- sys.excepthook(exc_type, exc_value, exc_trace)
+# cdef public cpp_bool RequestHandler_OnBeforePluginLoad(
+# CefRefPtr[CefBrowser] browser,
+# const CefString& mime_type,
+# const CefString& plugin_url,
+# cpp_bool is_main_frame,
+# const CefString& top_origin_url,
+# CefRefPtr[CefWebPluginInfo] plugin_info,
+# cef_types.cef_plugin_policy_t* plugin_policy
+# ) except * with gil:
+# cdef PyBrowser pyBrowser
+# cdef PyWebPluginInfo pyInfo
+# cdef py_bool returnValue
+# cdef object clientCallback
+# try:
+# # OnBeforePluginLoad is called from RequestContexthandler.
+# # The Browser object might not be available, because it is
+# # being set synchronously during CreateBrowserSync, after
+# # Browser is created. From testing it always works, however
+# # better be safe.
+# if not browser.get():
+# Debug("WARNING: RequestHandler_OnBeforePluginLoad() failed,"
+# " Browser object is not available")
+# return False
+
+# # Issue #455: CefRequestHandler callbacks still executed after
+# # browser was closed.
+# if IsBrowserClosed(browser):
+# return False
+
+# py_browser = GetPyBrowser(browser, "OnBeforePluginLoad")
+# py_plugin_info = CreatePyWebPluginInfo(plugin_info)
+# clientCallback = GetGlobalClientCallback("OnBeforePluginLoad")
+# if clientCallback:
+# returnValue = clientCallback(
+# browser=py_browser,
+# mime_type=CefToPyString(mime_type),
+# plugin_url=CefToPyString(plugin_url),
+# is_main_frame=bool(is_main_frame),
+# top_origin_url=CefToPyString(top_origin_url),
+# plugin_info=py_plugin_info)
+# if returnValue:
+# plugin_policy[0] = cef_types.PLUGIN_POLICY_DISABLE
+# return bool(returnValue)
+# else:
+# return False
+# except:
+# (exc_type, exc_value, exc_trace) = sys.exc_info()
+# sys.excepthook(exc_type, exc_value, exc_trace)
cdef public cpp_bool RequestHandler_OnCertificateError(
int certError,
const CefString& cefRequestUrl,
- CefRefPtr[CefRequestCallback] cefCertCallback
+ CefRefPtr[CefCallback] cefCertCallback
) except * with gil:
cdef py_bool returnValue
cdef object clientCallback
@@ -515,73 +518,73 @@ cdef public void RequestHandler_OnPluginCrashed(
sys.excepthook(exc_type, exc_value, exc_trace)
-cdef public cpp_bool RequestHandler_CanGetCookies(
- CefRefPtr[CefBrowser] cef_browser,
- CefRefPtr[CefFrame] cef_frame,
- CefRefPtr[CefRequest] cef_request
- ) except * with gil:
- cdef PyBrowser browser
- cdef PyFrame frame
- cdef PyRequest request
- cdef object callback
- cdef py_bool retval
- try:
- # Issue #455: CefRequestHandler callbacks still executed after
- # browser was closed.
- if IsBrowserClosed(cef_browser):
- return False
-
- browser = GetPyBrowser(cef_browser, "CanGetCookies")
- frame = GetPyFrame(cef_frame)
- request = CreatePyRequest(cef_request)
- callback = browser.GetClientCallback("CanGetCookies")
- if callback:
- retval = callback(
- browser=browser,
- frame=frame,
- request=request)
- return bool(retval)
- else:
- # Return True by default
- return True
- except:
- (exc_type, exc_value, exc_trace) = sys.exc_info()
- sys.excepthook(exc_type, exc_value, exc_trace)
-
-
-cdef public cpp_bool RequestHandler_CanSetCookie(
- CefRefPtr[CefBrowser] cef_browser,
- CefRefPtr[CefFrame] cef_frame,
- CefRefPtr[CefRequest] cef_request,
- const CefCookie& cef_cookie
- ) except * with gil:
- cdef PyBrowser browser
- cdef PyFrame frame
- cdef PyRequest request
- cdef PyCookie cookie
- cdef object callback
- cdef py_bool retval
- try:
- # Issue #455: CefRequestHandler callbacks still executed after
- # browser was closed.
- if IsBrowserClosed(cef_browser):
- return False
-
- browser = GetPyBrowser(cef_browser, "CanSetCookie")
- frame = GetPyFrame(cef_frame)
- request = CreatePyRequest(cef_request)
- cookie = CreatePyCookie(cef_cookie)
- callback = browser.GetClientCallback("CanSetCookie")
- if callback:
- retval = callback(
- browser=browser,
- frame=frame,
- request=request,
- cookie=cookie)
- return bool(retval)
- else:
- # Return True by default
- return True
- except:
- (exc_type, exc_value, exc_trace) = sys.exc_info()
- sys.excepthook(exc_type, exc_value, exc_trace)
+# cdef public cpp_bool RequestHandler_CanGetCookies(
+# CefRefPtr[CefBrowser] cef_browser,
+# CefRefPtr[CefFrame] cef_frame,
+# CefRefPtr[CefRequest] cef_request
+# ) except * with gil:
+# cdef PyBrowser browser
+# cdef PyFrame frame
+# cdef PyRequest request
+# cdef object callback
+# cdef py_bool retval
+# try:
+# # Issue #455: CefRequestHandler callbacks still executed after
+# # browser was closed.
+# if IsBrowserClosed(cef_browser):
+# return False
+
+# browser = GetPyBrowser(cef_browser, "CanGetCookies")
+# frame = GetPyFrame(cef_frame)
+# request = CreatePyRequest(cef_request)
+# callback = browser.GetClientCallback("CanGetCookies")
+# if callback:
+# retval = callback(
+# browser=browser,
+# frame=frame,
+# request=request)
+# return bool(retval)
+# else:
+# # Return True by default
+# return True
+# except:
+# (exc_type, exc_value, exc_trace) = sys.exc_info()
+# sys.excepthook(exc_type, exc_value, exc_trace)
+
+
+# cdef public cpp_bool RequestHandler_CanSetCookie(
+# CefRefPtr[CefBrowser] cef_browser,
+# CefRefPtr[CefFrame] cef_frame,
+# CefRefPtr[CefRequest] cef_request,
+# const CefCookie& cef_cookie
+# ) except * with gil:
+# cdef PyBrowser browser
+# cdef PyFrame frame
+# cdef PyRequest request
+# cdef PyCookie cookie
+# cdef object callback
+# cdef py_bool retval
+# try:
+# # Issue #455: CefRequestHandler callbacks still executed after
+# # browser was closed.
+# if IsBrowserClosed(cef_browser):
+# return False
+
+# browser = GetPyBrowser(cef_browser, "CanSetCookie")
+# frame = GetPyFrame(cef_frame)
+# request = CreatePyRequest(cef_request)
+# cookie = CreatePyCookie(cef_cookie)
+# callback = browser.GetClientCallback("CanSetCookie")
+# if callback:
+# retval = callback(
+# browser=browser,
+# frame=frame,
+# request=request,
+# cookie=cookie)
+# return bool(retval)
+# else:
+# # Return True by default
+# return True
+# except:
+# (exc_type, exc_value, exc_trace) = sys.exc_info()
+# sys.excepthook(exc_type, exc_value, exc_trace)
diff --git a/src/include.old/base/cef_atomic_ref_count.h b/src/include.old/base/cef_atomic_ref_count.h
new file mode 100644
index 000000000..4d6777970
--- /dev/null
+++ b/src/include.old/base/cef_atomic_ref_count.h
@@ -0,0 +1,165 @@
+// Copyright (c) 2014 Marshall A. Greenblatt. Portions copyright (c) 2011
+// Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the name Chromium Embedded
+// Framework nor the names of its contributors may be used to endorse
+// or promote products derived from this software without specific prior
+// written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This is a low level implementation of atomic semantics for reference
+// counting. Please use cef_ref_counted.h directly instead.
+//
+// The Chromium implementation includes annotations to avoid some false
+// positives when using data race detection tools. Annotations are not
+// currently supported by the CEF implementation.
+
+#ifndef CEF_INCLUDE_BASE_CEF_ATOMIC_REF_COUNT_H_
+#define CEF_INCLUDE_BASE_CEF_ATOMIC_REF_COUNT_H_
+#pragma once
+
+#if defined(USING_CHROMIUM_INCLUDES)
+// When building CEF include the Chromium header directly.
+#include "base/atomic_ref_count.h"
+
+// Used when declaring a base::AtomicRefCount value. This is an object type with
+// Chromium headers.
+#define ATOMIC_DECLARATION (0)
+
+// Maintaining compatibility with AtompicRefCount* functions that were removed
+// from Chromium in http://crrev.com/ee96d561.
+namespace base {
+
+// Increment a reference count by 1.
+inline void AtomicRefCountInc(volatile AtomicRefCount* ptr) {
+ const_cast(ptr)->Increment();
+}
+
+// Decrement a reference count by 1 and return whether the result is non-zero.
+// Insert barriers to ensure that state written before the reference count
+// became zero will be visible to a thread that has just made the count zero.
+inline bool AtomicRefCountDec(volatile AtomicRefCount* ptr) {
+ return const_cast(ptr)->Decrement();
+}
+
+// Return whether the reference count is one. If the reference count is used
+// in the conventional way, a refrerence count of 1 implies that the current
+// thread owns the reference and no other thread shares it. This call performs
+// the test for a reference count of one, and performs the memory barrier
+// needed for the owning thread to act on the object, knowing that it has
+// exclusive access to the object.
+inline bool AtomicRefCountIsOne(volatile AtomicRefCount* ptr) {
+ return const_cast(ptr)->IsOne();
+}
+
+// Return whether the reference count is zero. With conventional object
+// referencing counting, the object will be destroyed, so the reference count
+// should never be zero. Hence this is generally used for a debug check.
+inline bool AtomicRefCountIsZero(volatile AtomicRefCount* ptr) {
+ return const_cast(ptr)->IsZero();
+}
+
+} // namespace base
+
+#else // !USING_CHROMIUM_INCLUDES
+// The following is substantially similar to the Chromium implementation.
+// If the Chromium implementation diverges the below implementation should be
+// updated to match.
+
+#include "include/base/cef_atomicops.h"
+
+// Annotations are not currently supported.
+#define ANNOTATE_HAPPENS_BEFORE(obj) /* empty */
+#define ANNOTATE_HAPPENS_AFTER(obj) /* empty */
+
+// Used when declaring a base::AtomicRefCount value. This is an integer/ptr type
+// with CEF headers.
+#define ATOMIC_DECLARATION = 0
+
+namespace base {
+
+typedef subtle::Atomic32 AtomicRefCount;
+
+// Increment a reference count by "increment", which must exceed 0.
+inline void AtomicRefCountIncN(volatile AtomicRefCount* ptr,
+ AtomicRefCount increment) {
+ subtle::NoBarrier_AtomicIncrement(ptr, increment);
+}
+
+// Decrement a reference count by "decrement", which must exceed 0,
+// and return whether the result is non-zero.
+// Insert barriers to ensure that state written before the reference count
+// became zero will be visible to a thread that has just made the count zero.
+inline bool AtomicRefCountDecN(volatile AtomicRefCount* ptr,
+ AtomicRefCount decrement) {
+ ANNOTATE_HAPPENS_BEFORE(ptr);
+ bool res = (subtle::Barrier_AtomicIncrement(ptr, -decrement) != 0);
+ if (!res) {
+ ANNOTATE_HAPPENS_AFTER(ptr);
+ }
+ return res;
+}
+
+// Increment a reference count by 1.
+inline void AtomicRefCountInc(volatile AtomicRefCount* ptr) {
+ base::AtomicRefCountIncN(ptr, 1);
+}
+
+// Decrement a reference count by 1 and return whether the result is non-zero.
+// Insert barriers to ensure that state written before the reference count
+// became zero will be visible to a thread that has just made the count zero.
+inline bool AtomicRefCountDec(volatile AtomicRefCount* ptr) {
+ return base::AtomicRefCountDecN(ptr, 1);
+}
+
+// Return whether the reference count is one. If the reference count is used
+// in the conventional way, a refrerence count of 1 implies that the current
+// thread owns the reference and no other thread shares it. This call performs
+// the test for a reference count of one, and performs the memory barrier
+// needed for the owning thread to act on the object, knowing that it has
+// exclusive access to the object.
+inline bool AtomicRefCountIsOne(volatile AtomicRefCount* ptr) {
+ bool res = (subtle::Acquire_Load(ptr) == 1);
+ if (res) {
+ ANNOTATE_HAPPENS_AFTER(ptr);
+ }
+ return res;
+}
+
+// Return whether the reference count is zero. With conventional object
+// referencing counting, the object will be destroyed, so the reference count
+// should never be zero. Hence this is generally used for a debug check.
+inline bool AtomicRefCountIsZero(volatile AtomicRefCount* ptr) {
+ bool res = (subtle::Acquire_Load(ptr) == 0);
+ if (res) {
+ ANNOTATE_HAPPENS_AFTER(ptr);
+ }
+ return res;
+}
+
+} // namespace base
+
+#endif // !USING_CHROMIUM_INCLUDES
+
+#endif // CEF_INCLUDE_BASE_CEF_ATOMIC_REF_COUNT_H_
diff --git a/src/include/base/cef_atomicops.h b/src/include.old/base/cef_atomicops.h
similarity index 100%
rename from src/include/base/cef_atomicops.h
rename to src/include.old/base/cef_atomicops.h
diff --git a/src/include.old/base/cef_basictypes.h b/src/include.old/base/cef_basictypes.h
new file mode 100644
index 000000000..e38f4f729
--- /dev/null
+++ b/src/include.old/base/cef_basictypes.h
@@ -0,0 +1,87 @@
+// Copyright (c) 2014 Marshall A. Greenblatt. Portions copyright (c) 2012
+// Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the name Chromium Embedded
+// Framework nor the names of its contributors may be used to endorse
+// or promote products derived from this software without specific prior
+// written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef CEF_INCLUDE_BASE_CEF_BASICTYPES_H_
+#define CEF_INCLUDE_BASE_CEF_BASICTYPES_H_
+#pragma once
+
+#include // For UINT_MAX
+#include // For size_t
+
+#include "include/base/cef_build.h"
+
+// The NSPR system headers define 64-bit as |long| when possible, except on
+// Mac OS X. In order to not have typedef mismatches, we do the same on LP64.
+//
+// On Mac OS X, |long long| is used for 64-bit types for compatibility with
+// format macros even in the LP64 model.
+#if defined(__LP64__) && !defined(OS_MACOSX) && !defined(OS_OPENBSD)
+typedef long int64;
+typedef unsigned long uint64;
+#else
+typedef long long int64;
+typedef unsigned long long uint64;
+#endif
+
+// TODO: Remove these type guards. These are to avoid conflicts with
+// obsolete/protypes.h in the Gecko SDK.
+#ifndef _INT32
+#define _INT32
+typedef int int32;
+#endif
+
+// TODO: Remove these type guards. These are to avoid conflicts with
+// obsolete/protypes.h in the Gecko SDK.
+#ifndef _UINT32
+#define _UINT32
+typedef unsigned int uint32;
+#endif
+
+#ifndef _INT16
+#define _INT16
+typedef short int16;
+#endif
+
+#ifndef _UINT16
+#define _UINT16
+typedef unsigned short uint16;
+#endif
+
+// UTF-16 character type.
+// This should be kept synchronized with base/strings/string16.h
+#ifndef char16
+#if defined(WCHAR_T_IS_UTF16)
+typedef wchar_t char16;
+#elif defined(WCHAR_T_IS_UTF32)
+typedef unsigned short char16;
+#endif
+#endif
+
+#endif // CEF_INCLUDE_BASE_CEF_BASICTYPES_H_
diff --git a/src/include.old/base/cef_bind.h b/src/include.old/base/cef_bind.h
new file mode 100644
index 000000000..77c9c5573
--- /dev/null
+++ b/src/include.old/base/cef_bind.h
@@ -0,0 +1,575 @@
+// Copyright (c) 2014 Marshall A. Greenblatt. Portions copyright (c) 2011
+// Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the name Chromium Embedded
+// Framework nor the names of its contributors may be used to endorse
+// or promote products derived from this software without specific prior
+// written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef CEF_INCLUDE_BASE_CEF_BIND_H_
+#define CEF_INCLUDE_BASE_CEF_BIND_H_
+#pragma once
+
+#if defined(BASE_BIND_H_)
+// Do nothing if the Chromium header has already been included.
+// This can happen in cases where Chromium code is used directly by the
+// client application. When using Chromium code directly always include
+// the Chromium header first to avoid type conflicts.
+#elif defined(USING_CHROMIUM_INCLUDES)
+// When building CEF include the Chromium header directly.
+#include "base/bind.h"
+#else // !USING_CHROMIUM_INCLUDES
+// The following is substantially similar to the Chromium implementation.
+// If the Chromium implementation diverges the below implementation should be
+// updated to match.
+
+#include "include/base/internal/cef_bind_internal.h"
+#include "include/base/internal/cef_callback_internal.h"
+
+// -----------------------------------------------------------------------------
+// Usage documentation
+// -----------------------------------------------------------------------------
+//
+// See base/cef_callback.h for documentation.
+//
+//
+// -----------------------------------------------------------------------------
+// Implementation notes
+// -----------------------------------------------------------------------------
+//
+// If you're reading the implementation, before proceeding further, you should
+// read the top comment of base/bind_internal.h for a definition of common
+// terms and concepts.
+//
+// RETURN TYPES
+//
+// Though Bind()'s result is meant to be stored in a Callback<> type, it
+// cannot actually return the exact type without requiring a large amount
+// of extra template specializations. The problem is that in order to
+// discern the correct specialization of Callback<>, Bind would need to
+// unwrap the function signature to determine the signature's arity, and
+// whether or not it is a method.
+//
+// Each unique combination of (arity, function_type, num_prebound) where
+// function_type is one of {function, method, const_method} would require
+// one specialization. We eventually have to do a similar number of
+// specializations anyways in the implementation (see the Invoker<>,
+// classes). However, it is avoidable in Bind if we return the result
+// via an indirection like we do below.
+//
+// TODO(ajwong): We might be able to avoid this now, but need to test.
+//
+// It is possible to move most of the COMPILE_ASSERT asserts into BindState<>,
+// but it feels a little nicer to have the asserts here so people do not
+// need to crack open bind_internal.h. On the other hand, it makes Bind()
+// harder to read.
+
+namespace base {
+
+template
+base::Callback::RunnableType,
+ typename cef_internal::FunctorTraits::RunType,
+ void()>::UnboundRunType>
+Bind(Functor functor) {
+ // Typedefs for how to store and run the functor.
+ typedef
+ typename cef_internal::FunctorTraits::RunnableType RunnableType;
+ typedef typename cef_internal::FunctorTraits::RunType RunType;
+
+ typedef cef_internal::BindState BindState;
+
+ return Callback(
+ new BindState(cef_internal::MakeRunnable(functor)));
+}
+
+template
+base::Callback::RunnableType,
+ typename cef_internal::FunctorTraits::RunType,
+ void(typename cef_internal::CallbackParamTraits::StorageType)>::
+ UnboundRunType>
+Bind(Functor functor, const P1& p1) {
+ // Typedefs for how to store and run the functor.
+ typedef
+ typename cef_internal::FunctorTraits::RunnableType RunnableType;
+ typedef typename cef_internal::FunctorTraits::RunType RunType;
+
+ // Use RunnableType::RunType instead of RunType above because our
+ // checks should below for bound references need to know what the actual
+ // functor is going to interpret the argument as.
+ typedef cef_internal::FunctionTraits
+ BoundFunctorTraits;
+
+ // Do not allow binding a non-const reference parameter. Non-const reference
+ // parameters are disallowed by the Google style guide. Also, binding a
+ // non-const reference parameter can make for subtle bugs because the
+ // invoked function will receive a reference to the stored copy of the
+ // argument and not the original.
+ COMPILE_ASSERT(
+ !(is_non_const_reference::value),
+ do_not_bind_functions_with_nonconst_ref);
+
+ // For methods, we need to be careful for parameter 1. We do not require
+ // a scoped_refptr because BindState<> itself takes care of AddRef() for
+ // methods. We also disallow binding of an array as the method's target
+ // object.
+ COMPILE_ASSERT(cef_internal::HasIsMethodTag::value ||
+ !cef_internal::NeedsScopedRefptrButGetsRawPtr::value,
+ p1_is_refcounted_type_and_needs_scoped_refptr);
+ COMPILE_ASSERT(!cef_internal::HasIsMethodTag::value ||
+ !is_array::value,
+ first_bound_argument_to_method_cannot_be_array);
+ typedef cef_internal::BindState<
+ RunnableType, RunType,
+ void(typename cef_internal::CallbackParamTraits::StorageType)>
+ BindState;
+
+ return Callback(
+ new BindState(cef_internal::MakeRunnable(functor), p1));
+}
+
+template
+base::Callback::RunnableType,
+ typename cef_internal::FunctorTraits::RunType,
+ void(typename cef_internal::CallbackParamTraits::StorageType,
+ typename cef_internal::CallbackParamTraits::StorageType)>::
+ UnboundRunType>
+Bind(Functor functor, const P1& p1, const P2& p2) {
+ // Typedefs for how to store and run the functor.
+ typedef
+ typename cef_internal::FunctorTraits::RunnableType RunnableType;
+ typedef typename cef_internal::FunctorTraits::RunType RunType;
+
+ // Use RunnableType::RunType instead of RunType above because our
+ // checks should below for bound references need to know what the actual
+ // functor is going to interpret the argument as.
+ typedef cef_internal::FunctionTraits
+ BoundFunctorTraits;
+
+ // Do not allow binding a non-const reference parameter. Non-const reference
+ // parameters are disallowed by the Google style guide. Also, binding a
+ // non-const reference parameter can make for subtle bugs because the
+ // invoked function will receive a reference to the stored copy of the
+ // argument and not the original.
+ COMPILE_ASSERT(
+ !(is_non_const_reference::value ||
+ is_non_const_reference::value),
+ do_not_bind_functions_with_nonconst_ref);
+
+ // For methods, we need to be careful for parameter 1. We do not require
+ // a scoped_refptr because BindState<> itself takes care of AddRef() for
+ // methods. We also disallow binding of an array as the method's target
+ // object.
+ COMPILE_ASSERT(cef_internal::HasIsMethodTag::value ||
+ !cef_internal::NeedsScopedRefptrButGetsRawPtr::value,
+ p1_is_refcounted_type_and_needs_scoped_refptr);
+ COMPILE_ASSERT(!cef_internal::HasIsMethodTag::value ||
+ !is_array::value,
+ first_bound_argument_to_method_cannot_be_array);
+ COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr::value,
+ p2_is_refcounted_type_and_needs_scoped_refptr);
+ typedef cef_internal::BindState<
+ RunnableType, RunType,
+ void(typename cef_internal::CallbackParamTraits::StorageType,
+ typename cef_internal::CallbackParamTraits::StorageType)>
+ BindState;
+
+ return Callback(
+ new BindState(cef_internal::MakeRunnable(functor), p1, p2));
+}
+
+template
+base::Callback::RunnableType,
+ typename cef_internal::FunctorTraits::RunType,
+ void(typename cef_internal::CallbackParamTraits::StorageType,
+ typename cef_internal::CallbackParamTraits::StorageType,
+ typename cef_internal::CallbackParamTraits